re PR tree-optimization/29567 (ICE in build2_stat, at tree.c:2963)
authorRichard Guenther <rguenther@suse.de>
Tue, 24 Oct 2006 08:12:04 +0000 (08:12 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 24 Oct 2006 08:12:04 +0000 (08:12 +0000)
2006-10-24  Richard Guenther  <rguenther@suse.de>

        PR tree-optimization/29567
* tree-vrp.c (register_edge_assert_for_1): Fix wrong logic
for TRUTH_NOT_EXPR.  Clarify comments.

* gfortran.fortran-torture/compile/vrp_1.f90: New testcase.

From-SVN: r117997

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

index c2a16cbc95782459247f1c37d9dca5106d898024..1505a0814072392a3b0319feeaca46c6081cb11b 100644 (file)
@@ -1,3 +1,9 @@
+2006-10-24  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/29567
+       * tree-vrp.c (register_edge_assert_for_1): Fix wrong logic
+       for TRUTH_NOT_EXPR.  Clarify comments.
+
 2006-10-24  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * builtins.c (fold_builtin_exponent): Evaluate constant arguments
index 1af046debbd240076ef844691e73f27080578f70..91362860100e9bae521ffa2d2689b82336b229d1 100644 (file)
@@ -1,3 +1,8 @@
+2006-10-24  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/29567
+       * gfortran.fortran-torture/compile/vrp_1.f90: New testcase.
+
 2006-10-23  Zdenek Dvorak <dvorakz@suse.cz>
 
        PR tree-optimization/14784
diff --git a/gcc/testsuite/gfortran.fortran-torture/compile/vrp_1.f90 b/gcc/testsuite/gfortran.fortran-torture/compile/vrp_1.f90
new file mode 100644 (file)
index 0000000..a8d0c29
--- /dev/null
@@ -0,0 +1,17 @@
+      SUBROUTINE STONUM(STRVAR,LENGTH)
+      CHARACTER STRVAR*(*) , CHK
+      LOGICAL MEND , NMARK , MMARK , EMARK
+      NMARK = .FALSE.
+      MMARK = .FALSE.
+      DO WHILE ( .NOT.MEND )
+            IF ( CHK.GE.'0' .AND. CHK.LE.'9' ) THEN
+               IF ( CHK.EQ.'E' ) THEN
+                  NMARK = .TRUE.
+               ELSEIF ( .NOT.MMARK .AND. CHK.EQ.'*' .AND. .NOT.NMARK )  &
+     &                  THEN
+                  MMARK = .TRUE.
+               ENDIF
+            ENDIF
+      ENDDO
+      END
+
index 6d220fbc7174a105af0aabd1bde5534f502edafd..88c1d304d491858f23a7a5f0c17470f9ce76a3c5 100644 (file)
@@ -2777,7 +2777,7 @@ static bool
 register_edge_assert_for_1 (tree op, enum tree_code code,
                            edge e, block_stmt_iterator bsi)
 {
-  bool invert, retval = false;
+  bool retval = false;
   tree op_def, rhs, val;
 
   /* We only care about SSA_NAMEs.  */
@@ -2804,11 +2804,11 @@ register_edge_assert_for_1 (tree op, enum tree_code code,
   if (TREE_CODE (op_def) != MODIFY_EXPR)
     return retval;
 
-  invert = (code == EQ_EXPR ? true : false);
   rhs = TREE_OPERAND (op_def, 1);
 
   if (COMPARISON_CLASS_P (rhs))
     {
+      bool invert = (code == EQ_EXPR ? true : false);
       tree op0 = TREE_OPERAND (rhs, 0);
       tree op1 = TREE_OPERAND (rhs, 1);
 
@@ -2848,15 +2848,14 @@ register_edge_assert_for_1 (tree op, enum tree_code code,
     }
   else if (TREE_CODE (rhs) == TRUTH_NOT_EXPR)
     {
-      invert = !invert;
-      /* Recurse, flipping the tense of INVERT.  */
+      /* Recurse, flipping CODE.  */
+      code = invert_tree_comparison (code, false);
       retval |= register_edge_assert_for_1 (TREE_OPERAND (rhs, 0),
-                                           invert, e, bsi);
+                                           code, e, bsi);
     }
   else if (TREE_CODE (rhs) == SSA_NAME)
     {
-      /* Recurse through the copy, the tense of INVERT remains
-        unchanged.  */
+      /* Recurse through the copy.  */
       retval |= register_edge_assert_for_1 (rhs, code, e, bsi);
     }
   else if (TREE_CODE (rhs) == NOP_EXPR
@@ -2864,8 +2863,7 @@ register_edge_assert_for_1 (tree op, enum tree_code code,
           || TREE_CODE (rhs) == VIEW_CONVERT_EXPR
           || TREE_CODE (rhs) == NON_LVALUE_EXPR)
     { 
-      /* Recurse through the type conversion, the tense of INVERT 
-        remains unchanged.  */
+      /* Recurse through the type conversion.  */
       retval |= register_edge_assert_for_1 (TREE_OPERAND (rhs, 0),
                                            code, e, bsi);
     }