aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2015-06-01 10:37:30 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2015-06-01 10:37:30 +0000
commit29764870aaa5da8f73c7c25c0aca5a251beb4103 (patch)
tree66e8cb18e6ff411fadefe24785a35836dab7ef84 /gcc
parentb4900b374e60f2834e4d3236c8f48696993a4406 (diff)
downloadgcc-29764870aaa5da8f73c7c25c0aca5a251beb4103.zip
gcc-29764870aaa5da8f73c7c25c0aca5a251beb4103.tar.gz
gcc-29764870aaa5da8f73c7c25c0aca5a251beb4103.tar.bz2
re PR tree-optimization/66280 (ICE: in vect_get_vec_def_for_operand, at tree-vect-stmts.c:1472)
2015-06-01 Richard Biener <rguenther@suse.de> PR tree-optimization/66280 * tree-vect-slp.c (vect_detect_hybrid_slp_stmts): Fix pattern def-use walking. * g++.dg/torture/pr66280.C: New testcase. * g++.dg/torture/pr66280-2.C: Likewise. From-SVN: r223927
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/torture/pr66280-2.C25
-rw-r--r--gcc/testsuite/g++.dg/torture/pr66280.C25
-rw-r--r--gcc/tree-vect-slp.c32
5 files changed, 81 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e751079..4b007b4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2015-06-01 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/66280
+ * tree-vect-slp.c (vect_detect_hybrid_slp_stmts): Fix pattern
+ def-use walking.
+
2015-06-01 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/aarch64/aarch64.md
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3cafd13..d25d5a7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2015-06-01 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/66280
+ * g++.dg/torture/pr66280.C: New testcase.
+ * g++.dg/torture/pr66280-2.C: Likewise.
+
2015-06-01 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/addr9_1.adb: New test.
diff --git a/gcc/testsuite/g++.dg/torture/pr66280-2.C b/gcc/testsuite/g++.dg/torture/pr66280-2.C
new file mode 100644
index 0000000..fee53fc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr66280-2.C
@@ -0,0 +1,25 @@
+// { dg-do compile }
+
+typedef struct
+{
+ short re;
+ short im;
+} cint16_T;
+typedef struct
+{
+ int re;
+ int im;
+} cint32_T;
+int a;
+short b;
+cint16_T *c;
+cint32_T *d, *e;
+void
+fn1 ()
+{
+ for (; a; a++)
+ {
+ d[a].re = d[a].im = e[a].im = c[a].im * b;
+ e[a].re = c[a].re * b;
+ }
+}
diff --git a/gcc/testsuite/g++.dg/torture/pr66280.C b/gcc/testsuite/g++.dg/torture/pr66280.C
new file mode 100644
index 0000000..b9f43da
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr66280.C
@@ -0,0 +1,25 @@
+// { dg-do compile }
+
+typedef struct
+{
+ short re;
+ short im;
+} cint16_T;
+typedef struct
+{
+ int re;
+ int im;
+} cint32_T;
+int a;
+short b;
+cint16_T *c;
+cint32_T *d, *e;
+void
+fn1 ()
+{
+ for (; a; a++)
+ {
+ d[a].re = d[a].im = e[a].re = c[a].re * b;
+ e[a].im = c[a].im * b;
+ }
+}
diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index f38191d..fb57dd4 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -2031,21 +2031,27 @@ vect_detect_hybrid_slp_stmts (slp_tree node, unsigned i, slp_vect_type stype)
{
/* Check if a pure SLP stmt has uses in non-SLP stmts. */
gcc_checking_assert (PURE_SLP_STMT (stmt_vinfo));
+ /* We always get the pattern stmt here, but for immediate
+ uses we have to use the LHS of the original stmt. */
+ gcc_checking_assert (!STMT_VINFO_IN_PATTERN_P (stmt_vinfo));
+ if (STMT_VINFO_RELATED_STMT (stmt_vinfo))
+ stmt = STMT_VINFO_RELATED_STMT (stmt_vinfo);
if (TREE_CODE (gimple_op (stmt, 0)) == SSA_NAME)
FOR_EACH_IMM_USE_STMT (use_stmt, imm_iter, gimple_op (stmt, 0))
- if (gimple_bb (use_stmt)
- && flow_bb_inside_loop_p (loop, gimple_bb (use_stmt))
- && (use_vinfo = vinfo_for_stmt (use_stmt))
- && !STMT_SLP_TYPE (use_vinfo)
- && (STMT_VINFO_RELEVANT (use_vinfo)
- || VECTORIZABLE_CYCLE_DEF (STMT_VINFO_DEF_TYPE (use_vinfo))
- || (STMT_VINFO_IN_PATTERN_P (use_vinfo)
- && STMT_VINFO_RELATED_STMT (use_vinfo)
- && !STMT_SLP_TYPE (vinfo_for_stmt
- (STMT_VINFO_RELATED_STMT (use_vinfo)))))
- && !(gimple_code (use_stmt) == GIMPLE_PHI
- && STMT_VINFO_DEF_TYPE (use_vinfo) == vect_reduction_def))
- stype = hybrid;
+ {
+ if (!flow_bb_inside_loop_p (loop, gimple_bb (use_stmt)))
+ continue;
+ use_vinfo = vinfo_for_stmt (use_stmt);
+ if (STMT_VINFO_IN_PATTERN_P (use_vinfo)
+ && STMT_VINFO_RELATED_STMT (use_vinfo))
+ use_vinfo = vinfo_for_stmt (STMT_VINFO_RELATED_STMT (use_vinfo));
+ if (!STMT_SLP_TYPE (use_vinfo)
+ && (STMT_VINFO_RELEVANT (use_vinfo)
+ || VECTORIZABLE_CYCLE_DEF (STMT_VINFO_DEF_TYPE (use_vinfo)))
+ && !(gimple_code (use_stmt) == GIMPLE_PHI
+ && STMT_VINFO_DEF_TYPE (use_vinfo) == vect_reduction_def))
+ stype = hybrid;
+ }
}
if (stype == hybrid)