aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2020-10-15 10:58:41 +0200
committerRichard Biener <rguenther@suse.de>2020-10-15 11:49:38 +0200
commit852dce060860d988f4d8007be97b7b38e51f9900 (patch)
tree13b26d02fef3e322da11de21fe851cef2869c9d1 /gcc
parentd8394e2aa265c9e06b8362a84e77270dd182f638 (diff)
downloadgcc-852dce060860d988f4d8007be97b7b38e51f9900.zip
gcc-852dce060860d988f4d8007be97b7b38e51f9900.tar.gz
gcc-852dce060860d988f4d8007be97b7b38e51f9900.tar.bz2
Fix ICE in vectorizable_live_operation
This fixes the case where the insertion iterator for the live stmt is the end of a BB by adjusting the dominance query to the definition of the def we're substituting. 2020-10-15 Richard Biener <rguenther@suse.de> * tree-vect-loop.c (vectorizable_live_operation): Adjust dominance query. * gcc.dg/vect/bb-slp-52.c: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/gcc.dg/vect/bb-slp-52.c15
-rw-r--r--gcc/tree-vect-loop.c7
2 files changed, 20 insertions, 2 deletions
diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-52.c b/gcc/testsuite/gcc.dg/vect/bb-slp-52.c
new file mode 100644
index 0000000..5194af8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/vect/bb-slp-52.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+
+int a, e;
+void g(float);
+typedef struct {
+ float b, c;
+} d;
+d f;
+void h(double i, double j) {
+ if (a && e)
+ return;
+ f.b = j;
+ f.c = i;
+ g(i);
+}
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index 0a315e2..991fd45 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -8395,8 +8395,11 @@ vectorizable_live_operation (vec_info *vinfo,
were not code-generated yet so it is not too bad.
??? In fact we'd likely want to avoid this situation
in the first place. */
- if (gimple_code (use_stmt) != GIMPLE_PHI
- && !vect_stmt_dominates_stmt_p (gsi_stmt (*gsi), use_stmt))
+ if (TREE_CODE (new_tree) == SSA_NAME
+ && !SSA_NAME_IS_DEFAULT_DEF (new_tree)
+ && gimple_code (use_stmt) != GIMPLE_PHI
+ && !vect_stmt_dominates_stmt_p (SSA_NAME_DEF_STMT (new_tree),
+ use_stmt))
{
enum tree_code code = gimple_assign_rhs_code (use_stmt);
gcc_assert (code == CONSTRUCTOR