re PR tree-optimization/23391 (Tree checking failure due to scev)
authorSebastian Pop <pop@cri.ensmp.fr>
Mon, 15 Aug 2005 12:26:12 +0000 (14:26 +0200)
committerSebastian Pop <spop@gcc.gnu.org>
Mon, 15 Aug 2005 12:26:12 +0000 (12:26 +0000)
PR 23391
* Makefile.in (tree-chrec.o): Depends on real.h.
* tree-chrec.c: Include real.h.
(chrec_fold_plus_poly_poly, chrec_fold_multiply_poly_poly,
chrec_fold_plus_1): Use build_real for SCALAR_FLOAT_TYPE_P.
* tree-scalar-evolution.c (add_to_evolution_1,
interpret_rhs_modify_expr): Ditto.

From-SVN: r103109

gcc/ChangeLog
gcc/Makefile.in
gcc/testsuite/gcc.dg/tree-ssa/pr23391.c [new file with mode: 0644]
gcc/tree-chrec.c
gcc/tree-scalar-evolution.c

index e8c8594..7cf73cd 100644 (file)
@@ -1,5 +1,15 @@
 2005-08-15  Sebastian Pop  <pop@cri.ensmp.fr>
 
+       PR 23391
+       * Makefile.in (tree-chrec.o): Depends on real.h.
+       * tree-chrec.c: Include real.h.
+       (chrec_fold_plus_poly_poly, chrec_fold_multiply_poly_poly,
+       chrec_fold_plus_1): Use build_real for SCALAR_FLOAT_TYPE_P.
+       * tree-scalar-evolution.c (add_to_evolution_1,
+       interpret_rhs_modify_expr): Ditto.
+
+2005-08-15  Sebastian Pop  <pop@cri.ensmp.fr>
+
        PR 23386
        * tree-data-ref.c (estimate_niter_from_size_of_data): When
        step is negative compute the estimation from init downwards to zero.
index 9234698..d56e666 100644 (file)
@@ -1942,7 +1942,7 @@ tree-browser.o : tree-browser.c tree-browser.def $(CONFIG_H) $(SYSTEM_H) \
    $(TREE_H) tree-inline.h $(DIAGNOSTIC_H) $(HASHTAB_H) \
    $(TM_H) coretypes.h
 tree-chrec.o: tree-chrec.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
-   $(GGC_H) $(TREE_H) tree-chrec.h tree-pass.h $(PARAMS_H) \
+   $(GGC_H) $(TREE_H) real.h tree-chrec.h tree-pass.h $(PARAMS_H) \
    $(DIAGNOSTIC_H) $(VARRAY_H) $(CFGLOOP_H) $(TREE_FLOW_H)
 tree-scalar-evolution.o: tree-scalar-evolution.c $(CONFIG_H) $(SYSTEM_H) \
    coretypes.h $(TM_H) $(GGC_H) $(TREE_H) real.h $(RTL_H) \
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr23391.c b/gcc/testsuite/gcc.dg/tree-ssa/pr23391.c
new file mode 100644 (file)
index 0000000..8d2c302
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+
+void 
+foo (int N) 
+{ 
+  int C; 
+  double R; 
+  R = 0.0; 
+  do 
+    { 
+      R += 0.001; 
+      C = (int) (R * N); 
+      if (-R * N <= R * N) 
+        { 
+          C++; 
+        } 
+    } 
+  while (C < 0); 
+  return; 
+} 
index 1a22922..87cc148 100644 (file)
@@ -30,6 +30,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
 #include "tm.h"
 #include "ggc.h"
 #include "tree.h"
+#include "real.h"
 #include "diagnostic.h"
 #include "varray.h"
 #include "cfgloop.h"
@@ -119,7 +120,9 @@ chrec_fold_plus_poly_poly (enum tree_code code,
          (CHREC_VARIABLE (poly1), 
           chrec_fold_minus (type, poly0, CHREC_LEFT (poly1)),
           chrec_fold_multiply (type, CHREC_RIGHT (poly1), 
-                               build_int_cst_type (type, -1)));
+                               SCALAR_FLOAT_TYPE_P (type)
+                               ? build_real (type, dconstm1)
+                               : build_int_cst_type (type, -1)));
     }
   
   if (CHREC_VARIABLE (poly0) > CHREC_VARIABLE (poly1))
@@ -208,7 +211,9 @@ chrec_fold_multiply_poly_poly (tree type,
                                                       CHREC_RIGHT (poly1)));
   /* "2*b*d".  */
   t2 = chrec_fold_multiply (type, CHREC_RIGHT (poly0), CHREC_RIGHT (poly1));
-  t2 = chrec_fold_multiply (type, build_int_cst_type (type, 2), t2);
+  t2 = chrec_fold_multiply (type, SCALAR_FLOAT_TYPE_P (type)
+                           ? build_real (type, dconst2)
+                           : build_int_cst_type (type, 2), t2);
 
   var = CHREC_VARIABLE (poly0);
   return build_polynomial_chrec (var, t0,
@@ -284,8 +289,10 @@ chrec_fold_plus_1 (enum tree_code code,
            return build_polynomial_chrec 
              (CHREC_VARIABLE (op1), 
               chrec_fold_minus (type, op0, CHREC_LEFT (op1)),
-              chrec_fold_multiply (type, CHREC_RIGHT (op1),
-                                   build_int_cst_type (type, -1)));
+              chrec_fold_multiply (type, CHREC_RIGHT (op1), 
+                                   SCALAR_FLOAT_TYPE_P (type)
+                                   ? build_real (type, dconstm1)
+                                   : build_int_cst_type (type, -1)));
 
        default:
          {
index db798c0..e749047 100644 (file)
@@ -676,7 +676,9 @@ add_to_evolution_1 (unsigned loop_nb,
            {
              var = loop_nb;
              left = chrec_before;
-             right = build_int_cst (type, 0);
+             right = SCALAR_FLOAT_TYPE_P (type)
+               ? build_real (type, dconst0)
+               : build_int_cst (type, 0);
            }
          else
            {
@@ -1680,7 +1682,9 @@ interpret_rhs_modify_expr (struct loop *loop, tree at_stmt,
       opnd10 = TREE_OPERAND (opnd1, 0);
       chrec10 = analyze_scalar_evolution (loop, opnd10);
       chrec10 = chrec_convert (type, chrec10, at_stmt);
-      res = chrec_fold_minus (type, build_int_cst (type, 0), chrec10);
+      res = chrec_fold_multiply (type, chrec10, SCALAR_FLOAT_TYPE_P (type)
+                                 ? build_real (type, dconstm1)
+                                 : build_int_cst_type (type, -1));
       break;
 
     case MULT_EXPR: