]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/21734 (ICE: -ftree-vectorize, segfault)
authorDorit Nuzman <dorit@il.ibm.com>
Thu, 2 Jun 2005 14:52:18 +0000 (14:52 +0000)
committerDorit Nuzman <dorit@gcc.gnu.org>
Thu, 2 Jun 2005 14:52:18 +0000 (14:52 +0000)
        PR tree-optimization/21734
        * tree-vectorizer.c (slpeel_update_phis_for_duplicate_loop): Use the
        phi_result when current_def is not available.
        (slpeel_update_phi_nodes_for_guard1): Don't fail if current_def is not
        available.

From-SVN: r100494

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/vect/pr21734_1.cc [new file with mode: 0644]
gcc/testsuite/g++.dg/vect/pr21734_2.cc [new file with mode: 0644]
gcc/tree-vectorizer.c

index 600266d91460df77f61b41c8952db918e622b010..ced17d5ab45c154391c9fea1ae239b3e34cb10e1 100644 (file)
@@ -1,3 +1,11 @@
+2005-06-02  Dorit Nuzman  <dorit@il.ibm.com>
+
+       PR tree-optimization/21734
+       * tree-vectorizer.c (slpeel_update_phis_for_duplicate_loop): Use the
+       phi_result when current_def is not available.
+       (slpeel_update_phi_nodes_for_guard1): Don't fail if current_def is not
+       available.      
+
 2005-06-02  David Edelsohn  <edelsohn@gnu.org>
 
        * config/rs6000/rs6000.c (rs6000_insn_valid_within_doloop): New.
index 47359036e3ada03670f3d204b7f69217190d6e7c..9222799790f923171b67ccc4109725d6588c856b 100644 (file)
@@ -1,3 +1,9 @@
+2005-06-02  Dorit Nuzman  <dorit@il.ibm.com>
+
+       PR tree-optimization/21734
+       * g++.dg/vect/pr21734_1.cc: New.
+       * g++.dg/vect/pr21734_2.cc: New.
+
 2005-06-02  Nathan Sidwell  <nathan@codesourcery.com>
 
        PR c++/20350
diff --git a/gcc/testsuite/g++.dg/vect/pr21734_1.cc b/gcc/testsuite/g++.dg/vect/pr21734_1.cc
new file mode 100644 (file)
index 0000000..c65d9fc
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+
+struct A
+{
+  int a[4];
+  int& operator[](int i) { return a[i]; }
+};
+
+struct B : public A
+{
+  int& operator[](int i) { return A::operator[](i); }
+};
+
+void foo(B &b)
+{
+  for (int i=0; i<4; ++i)
+    b[i] = 0;
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
diff --git a/gcc/testsuite/g++.dg/vect/pr21734_2.cc b/gcc/testsuite/g++.dg/vect/pr21734_2.cc
new file mode 100644 (file)
index 0000000..58efedf
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+
+struct A
+{
+  int a[4];
+  int* operator[](int i) { return &a[i]; }
+};
+
+void foo(A a1, A &a2)
+{
+  a1[1][1]=0;
+  for (int i=0; i<4; ++i)
+    a2.a[i]=0;
+}
+
+/* { dg-final { cleanup-tree-dump "vect" } } */
index c8985b94a400aa2962c74bd921d3e3156e3434c8..883f403051c01ae2e097dcf2c40d8fb3cea436d4 100644 (file)
@@ -320,8 +320,11 @@ slpeel_update_phis_for_duplicate_loop (struct loop *orig_loop,
 
       new_ssa_name = get_current_def (def);
       if (!new_ssa_name)
-        /* Something defined outside of the loop.  */
-        continue;
+       {
+         /* This only happens if there are no definitions
+            inside the loop. use the phi_result in this case.  */
+         new_ssa_name = PHI_RESULT (phi_new);
+       }
 
       /* An ordinary ssa name defined in the loop.  */
       add_phi_arg (phi_new, new_ssa_name, loop_latch_edge (new_loop));
@@ -565,7 +568,12 @@ slpeel_update_phi_nodes_for_guard1 (edge guard_edge, struct loop *loop,
       else
         {
           current_new_name = get_current_def (loop_arg);
-          gcc_assert (current_new_name);
+         /* current_def is not available only if the variable does not
+            change inside the loop, in which case we also don't care
+            about recording a current_def for it because we won't be
+            trying to create loop-exit-phis for it.  */
+         if (!current_new_name)
+           continue;
         }
 #ifdef ENABLE_CHECKING
       gcc_assert (get_current_def (current_new_name) == NULL_TREE);