re PR tree-optimization/56778 (ICE on several benchmarks after r196775.)
authorRichard Biener <rguenther@suse.de>
Tue, 2 Apr 2013 13:31:05 +0000 (13:31 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 2 Apr 2013 13:31:05 +0000 (13:31 +0000)
2013-04-02  Richard Biener  <rguenther@suse.de>

PR tree-optimization/56778
* tree-vect-data-refs.c (vect_analyze_data_ref_dependence):
Runtime alias tests are not supported for gather loads.
* tree-vect-loop-manip.c (vect_loop_versioning): Insert
stmts referenced from SSA operands before updating SSA form.

* gcc.dg/torture/pr56778.c: New testcase.

From-SVN: r197355

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr56778.c [new file with mode: 0644]
gcc/tree-vect-data-refs.c
gcc/tree-vect-loop-manip.c

index f7155c0f4af0298b1f3a181aab3373c44ad76c1c..d18c6e9b17956aaf552284bd21668ab23dad2f35 100644 (file)
@@ -1,3 +1,11 @@
+2013-04-02  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/56778
+       * tree-vect-data-refs.c (vect_analyze_data_ref_dependence):
+       Runtime alias tests are not supported for gather loads.
+       * tree-vect-loop-manip.c (vect_loop_versioning): Insert
+       stmts referenced from SSA operands before updating SSA form.
+
 2013-04-02  Ian Caulfield  <ian.caulfield@arm.com>
            Ramana Radhakrishnan  <ramana.radhakrishnan@arm.com>
 
index 9b17672746468bd0e9c78733be54f40e114b5313..1a8055d1321f58cca88354c324cde6fd5b5b41b9 100644 (file)
@@ -1,3 +1,8 @@
+2013-04-02  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/56778
+       * gcc.dg/torture/pr56778.c: New testcase.
+
 2013-04-02  Richard Biener  <rguenther@suse.de>
 
        PR middle-end/56768
diff --git a/gcc/testsuite/gcc.dg/torture/pr56778.c b/gcc/testsuite/gcc.dg/torture/pr56778.c
new file mode 100644 (file)
index 0000000..4806877
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-march=core-avx2" { target x86_64-*-* } } */
+
+typedef struct {
+    float a,b,c;
+} S;
+
+S * arr[100];
+
+void bar (float *in[], int n)
+{
+  int i;
+  for (i=0; i<n; i++)
+    (*in)[i] = -arr[i]->b;
+}
index 188581f6246bc4c9765846b0ddc1e386239245be..4ef9ba86ef322c3df7c86e556705ff2ad05710f6 100644 (file)
@@ -280,6 +280,23 @@ vect_analyze_data_ref_dependence (struct data_dependence_relation *ddr,
   /* Unknown data dependence.  */
   if (DDR_ARE_DEPENDENT (ddr) == chrec_dont_know)
     {
+      if (STMT_VINFO_GATHER_P (stmtinfo_a)
+         || STMT_VINFO_GATHER_P (stmtinfo_b))
+       {
+         if (dump_enabled_p ())
+           {
+             dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+                              "versioning for alias not supported for: "
+                              "can't determine dependence between ");
+             dump_generic_expr (MSG_MISSED_OPTIMIZATION, TDF_SLIM,
+                                DR_REF (dra));
+             dump_printf (MSG_MISSED_OPTIMIZATION, " and ");
+             dump_generic_expr (MSG_MISSED_OPTIMIZATION, TDF_SLIM,
+                                DR_REF (drb));
+           }
+         return false;
+       }
+
       if (dump_enabled_p ())
        {
          dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
@@ -299,6 +316,23 @@ vect_analyze_data_ref_dependence (struct data_dependence_relation *ddr,
   /* Known data dependence.  */
   if (DDR_NUM_DIST_VECTS (ddr) == 0)
     {
+      if (STMT_VINFO_GATHER_P (stmtinfo_a)
+         || STMT_VINFO_GATHER_P (stmtinfo_b))
+       {
+         if (dump_enabled_p ())
+           {
+             dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
+                              "versioning for alias not supported for: "
+                              "bad dist vector for ");
+             dump_generic_expr (MSG_MISSED_OPTIMIZATION, TDF_SLIM,
+                                DR_REF (dra));
+             dump_printf (MSG_MISSED_OPTIMIZATION, " and ");
+             dump_generic_expr (MSG_MISSED_OPTIMIZATION, TDF_SLIM,
+                                DR_REF (drb));
+           }
+         return false;
+       }
+
       if (dump_enabled_p ())
         {
           dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, 
index b0120a9d4dee14ea97241eebc6f89b1b4c08bff5..a158c62112ce153714b111f50d729df9ab72db2e 100644 (file)
@@ -2476,11 +2476,11 @@ vect_loop_versioning (loop_vec_info loop_vinfo,
 
   /* End loop-exit-fixes after versioning.  */
 
-  update_ssa (TODO_update_ssa);
   if (cond_expr_stmt_list)
     {
       cond_exp_gsi = gsi_last_bb (condition_bb);
       gsi_insert_seq_before (&cond_exp_gsi, cond_expr_stmt_list,
                             GSI_SAME_STMT);
     }
+  update_ssa (TODO_update_ssa);
 }