diff options
Diffstat (limited to 'gcc/config/aarch64/cortex-a57-fma-steering.c')
-rw-r--r-- | gcc/config/aarch64/cortex-a57-fma-steering.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/gcc/config/aarch64/cortex-a57-fma-steering.c b/gcc/config/aarch64/cortex-a57-fma-steering.c index 94d7f9c5869..fa8c56aab02 100644 --- a/gcc/config/aarch64/cortex-a57-fma-steering.c +++ b/gcc/config/aarch64/cortex-a57-fma-steering.c @@ -603,7 +603,7 @@ fma_node::rename (fma_forest *forest) { rtx_insn *insn = this->m_insn; HARD_REG_SET unavailable; - enum machine_mode mode; + machine_mode mode; int reg; if (dump_file) @@ -973,10 +973,17 @@ func_fma_steering::analyze () break; } - /* We didn't find a chain with a def for this instruction. */ - gcc_assert (i < dest_op_info->n_chains); - - this->analyze_fma_fmul_insn (forest, chain, head); + /* Due to implementation of regrename, dest register can slip away + from regrename's analysis. As a result, there is no chain for + the destination register of insn. We simply skip the insn even + it is a fmul/fmac instruction. This can happen when the dest + register is also a source register of insn and one of the below + conditions is satisfied: + 1) the source reg is setup in larger mode than this insn; + 2) the source reg is uninitialized; + 3) the source reg is passed in as parameter. */ + if (i < dest_op_info->n_chains) + this->analyze_fma_fmul_insn (forest, chain, head); } } free (bb_dfs_preorder); |