2013-01-16 Richard Biener <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 16 Jan 2013 13:57:48 +0000 (13:57 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 16 Jan 2013 13:57:48 +0000 (13:57 +0000)
PR tree-optimization/54767
PR tree-optimization/53465
* tree-vrp.c (vrp_meet_1): Revert original fix for PR53465.
(vrp_visit_phi_node): For PHI arguments coming via backedges
drop all symbolical range information.
(execute_vrp): Compute backedges.

* gfortran.fortran-torture/execute/pr54767.f90: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@195238 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.fortran-torture/execute/pr54767.f90 [new file with mode: 0644]
gcc/tree-vrp.c

index 88ed163..16a3abc 100644 (file)
@@ -1,5 +1,14 @@
 2013-01-16  Richard Biener  <rguenther@suse.de>
 
+       PR tree-optimization/54767
+       PR tree-optimization/53465
+       * tree-vrp.c (vrp_meet_1): Revert original fix for PR53465.
+       (vrp_visit_phi_node): For PHI arguments coming via backedges
+       drop all symbolical range information.
+       (execute_vrp): Compute backedges.
+
+2013-01-16  Richard Biener  <rguenther@suse.de>
+
        * doc/install.texi: Update CLooG and ISL requirements to
        0.18.0 and 0.11.1.
 
index b86f63a..05f7667 100644 (file)
@@ -1,3 +1,9 @@
+2013-01-16  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/54767
+       PR tree-optimization/53465
+       * gfortran.fortran-torture/execute/pr54767.f90: New testcase.
+
 2013-01-16  Christian Bruel  <christian.bruel@st.com>
 
        PR target/55301
diff --git a/gcc/testsuite/gfortran.fortran-torture/execute/pr54767.f90 b/gcc/testsuite/gfortran.fortran-torture/execute/pr54767.f90
new file mode 100644 (file)
index 0000000..f95bff1
--- /dev/null
@@ -0,0 +1,31 @@
+SUBROUTINE XXX (IL, IU)
+  implicit none
+  integer, INTENT(IN) :: IL, IU
+
+  integer :: NXX (14) = (/ 0, 1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14 /)
+  integer :: ivvv, ia, ja, iaii
+  logical :: qop
+
+  QOP=.FALSE.
+
+  DO IA=IL,IU
+    JA=NXX(IA)
+    IF (.NOT. QOP .and. JA.GT.0) THEN
+      IAII=IA
+      QOP=.TRUE.
+    ENDIF
+
+    IF (QOP) THEN
+      ivvv=IA-IAII+1       ! mis-compiled
+    ENDIF
+  ENDDO
+
+  IF (ivvv.NE.2) THEN
+    call abort
+  ENDIF
+END subroutine
+
+program p
+  implicit none
+  CALL XXX (1, 3)
+end
index e902f6e..0efac60 100644 (file)
@@ -7877,17 +7877,13 @@ vrp_meet_1 (value_range_t *vr0, value_range_t *vr1)
 
   if (vr0->type == VR_UNDEFINED)
     {
-      /* Drop equivalences.  See PR53465.  */
-      set_value_range (vr0, vr1->type, vr1->min, vr1->max, NULL);
+      set_value_range (vr0, vr1->type, vr1->min, vr1->max, vr1->equiv);
       return;
     }
 
   if (vr1->type == VR_UNDEFINED)
     {
-      /* VR0 already has the resulting range, just drop equivalences.
-        See PR53465.  */
-      if (vr0->equiv)
-       bitmap_clear (vr0->equiv);
+      /* VR0 already has the resulting range.  */
       return;
     }
 
@@ -8012,6 +8008,21 @@ vrp_visit_phi_node (gimple phi)
          if (TREE_CODE (arg) == SSA_NAME)
            {
              vr_arg = *(get_value_range (arg));
+             /* Do not allow equivalences or symbolic ranges to leak in from
+                backedges.  That creates invalid equivalencies.
+                See PR53465 and PR54767.  */
+             if (e->flags & EDGE_DFS_BACK
+                 && (vr_arg.type == VR_RANGE
+                     || vr_arg.type == VR_ANTI_RANGE))
+               {
+                 vr_arg.equiv = NULL;
+                 if (symbolic_range_p (&vr_arg))
+                   {
+                     vr_arg.type = VR_VARYING;
+                     vr_arg.min = NULL_TREE;
+                     vr_arg.max = NULL_TREE;
+                   }
+               }
            }
          else
            {
@@ -9260,12 +9271,18 @@ execute_vrp (void)
   rewrite_into_loop_closed_ssa (NULL, TODO_update_ssa);
   scev_initialize ();
 
+  /* ???  This ends up using stale EDGE_DFS_BACK for liveness computation.
+     Inserting assertions may split edges which will invalidate
+     EDGE_DFS_BACK.  */
   insert_range_assertions ();
 
   to_remove_edges.create (10);
   to_update_switch_stmts.create (5);
   threadedge_initialize_values ();
 
+  /* For visiting PHI nodes we need EDGE_DFS_BACK computed.  */
+  mark_dfs_back_edges ();
+
   vrp_initialize ();
   ssa_propagate (vrp_visit_stmt, vrp_visit_phi_node);
   vrp_finalize ();