summaryrefslogtreecommitdiff
path: root/gcc/config/aarch64
diff options
context:
space:
mode:
authoramker <amker@138bc75d-0d04-0410-961f-82ee72b054a4>2017-07-25 08:31:22 +0000
committeramker <amker@138bc75d-0d04-0410-961f-82ee72b054a4>2017-07-25 08:31:22 +0000
commit7da9b5e4bbe6c13863e308f8735810bff93379ac (patch)
treec3f330e9c0fa90138c5a86b8865d315e0d6919cf /gcc/config/aarch64
parent8b3e57388de217cf04f675e479cdc854d381d73d (diff)
downloadgcc-7da9b5e4bbe6c13863e308f8735810bff93379ac.tar.gz
PR target/81414
* config/aarch64/cortex-a57-fma-steering.c (analyze): Skip fmul/fmac instructions if no du chain is found. gcc/testsuite * gcc.target/aarch64/pr81414.C: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@250496 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/aarch64')
-rw-r--r--gcc/config/aarch64/cortex-a57-fma-steering.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/gcc/config/aarch64/cortex-a57-fma-steering.c b/gcc/config/aarch64/cortex-a57-fma-steering.c
index 6d90acdd4a2..fa8c56aab02 100644
--- a/gcc/config/aarch64/cortex-a57-fma-steering.c
+++ b/gcc/config/aarch64/cortex-a57-fma-steering.c
@@ -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);