Patchwork [43/44] Fix miscompilation of 416.gamess.

login
register
mail settings
Submitter Sebastian Pop
Date Sept. 30, 2010, 6:01 p.m.
Message ID <1285869696-10915-44-git-send-email-sebpop@gmail.com>
Download mbox | patch
Permalink /patch/66229/
State New
Headers show

Comments

Sebastian Pop - Sept. 30, 2010, 6:01 p.m.
From: spop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>

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/branches/graphite@164579 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog          |    5 +++++
 gcc/ChangeLog.graphite |    5 +++++
 gcc/sese.h             |   19 ++++++++++++++++---
 3 files changed, 26 insertions(+), 3 deletions(-)

Patch

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3e87861..5cb949e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/ChangeLog.graphite b/gcc/ChangeLog.graphite
index af6d053..0c632df 100644
--- a/gcc/ChangeLog.graphite
+++ b/gcc/ChangeLog.graphite
@@ -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.
 
diff --git a/gcc/sese.h b/gcc/sese.h
index 8277f68..61f3a17 100644
--- a/gcc/sese.h
+++ b/gcc/sese.h
@@ -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