Fix miscompilation of 416.gamess.
authorspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 30 Sep 2010 21:21:56 +0000 (21:21 +0000)
committerspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 30 Sep 2010 21:21:56 +0000 (21:21 +0000)
2010-09-23  Sebastian Pop  <sebastian.pop@amd.com>

* sese.h (scev_analyzable_p): Return false for real or floating
point.  Only handle INTEGRAL_TYPE_P and POINTER_TYPE_P.

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

gcc/ChangeLog
gcc/ChangeLog.graphite
gcc/sese.h

index 835e87b..e0d9573 100644 (file)
@@ -1,5 +1,10 @@
 2010-09-30  Sebastian Pop  <sebastian.pop@amd.com>
 
+       * sese.h (scev_analyzable_p): Return false for real or floating
+       point.  Only handle INTEGRAL_TYPE_P and POINTER_TYPE_P.
+
+2010-09-30  Sebastian Pop  <sebastian.pop@amd.com>
+
        * graphite-clast-to-gimple.c (compute_bounds_for_level): Free le
        and ps.
        * graphite-poly.c (pbb_number_of_iterations_at_time): Free le and
index af6d053..0c632df 100644 (file)
@@ -1,5 +1,10 @@
 2010-09-23  Sebastian Pop  <sebastian.pop@amd.com>
 
+       * sese.h (scev_analyzable_p): Return false for real or floating
+       point.  Only handle INTEGRAL_TYPE_P and POINTER_TYPE_P.
+
+2010-09-23  Sebastian Pop  <sebastian.pop@amd.com>
+
        PR middle-end/45758
        * gfortran.dg/graphite/pr45758.f90: New.
 
index 8277f68..61f3a17 100644 (file)
@@ -386,9 +386,22 @@ nb_common_loops (sese region, gimple_bb_p gbb1, gimple_bb_p gbb2)
 static inline bool
 scev_analyzable_p (tree def, sese region)
 {
-  gimple stmt = SSA_NAME_DEF_STMT (def);
-  loop_p loop = loop_containing_stmt (stmt);
-  tree scev = scalar_evolution_in_region (region, loop, def);
+  loop_p loop;
+  tree scev;
+  tree type = TREE_TYPE (def);
+
+  /* When Graphite generates code for a scev, the code generator
+     expresses the scev in function of a single induction variable.
+     This is unsafe for floating point computations, as it may replace
+     a floating point sum reduction with a multiplication.  The
+     following test returns false for non integer types to avoid such
+     problems.  */
+  if (!INTEGRAL_TYPE_P (type)
+      && !POINTER_TYPE_P (type))
+    return false;
+
+  loop = loop_containing_stmt (SSA_NAME_DEF_STMT (def));
+  scev = scalar_evolution_in_region (region, loop, def);
 
   return !chrec_contains_undetermined (scev)
     && TREE_CODE (scev) != SSA_NAME