2010-05-25 Christian Borntraeger <borntraeger@de.ibm.com>
authorkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 25 May 2010 11:18:07 +0000 (11:18 +0000)
committerkrebbel <krebbel@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 25 May 2010 11:18:07 +0000 (11:18 +0000)
PR 44203
* tree-ssa-loop-prefetch.c: Fix logic for step calculation to
match the original (and intended) behaviour before r159557.  This
changeset changed a=a+b*c to a=(a+b)*b which was obviously wrong
in two ways.

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

gcc/ChangeLog
gcc/tree-ssa-loop-prefetch.c

index 3ac6da3..8833cca 100644 (file)
@@ -1,3 +1,11 @@
+2010-05-25  Christian Borntraeger  <borntraeger@de.ibm.com>
+
+       PR 44203
+       * tree-ssa-loop-prefetch.c: Fix logic for step calculation to
+       match the original (and intended) behaviour before r159557.  This
+       changeset changed a=a+b*c to a=(a+b)*b which was obviously wrong
+       in two ways.
+
 2010-05-25  Richard Guenther  <rguenther@suse.de>
 
        * doc/invoke.texi: Document -Ofast.
index 633dd33..d63ede1 100644 (file)
@@ -423,25 +423,24 @@ idx_analyze_ref (tree base, tree *index, void *data)
       ibase = build_int_cst (TREE_TYPE (ibase), 0);
     }
 
-  if (*ar_data->step == NULL_TREE)
-    *ar_data->step = step;
-  else
-    *ar_data->step = fold_build2 (PLUS_EXPR, sizetype,
-                                 fold_convert (sizetype, *ar_data->step),
-                                 fold_convert (sizetype, step));
   if (TREE_CODE (base) == ARRAY_REF)
     {
       stepsize = array_ref_element_size (base);
       if (!cst_and_fits_in_hwi (stepsize))
        return false;
       imult = int_cst_value (stepsize);
-
-      *ar_data->step = fold_build2 (MULT_EXPR, sizetype,
-                                   fold_convert (sizetype, *ar_data->step),
-                                   fold_convert (sizetype, step));
+      step = fold_build2 (MULT_EXPR, sizetype,
+                         fold_convert (sizetype, step),
+                         fold_convert (sizetype, stepsize));
       idelta *= imult;
     }
 
+  if (*ar_data->step == NULL_TREE)
+    *ar_data->step = step;
+  else
+    *ar_data->step = fold_build2 (PLUS_EXPR, sizetype,
+                                 fold_convert (sizetype, *ar_data->step),
+                                 fold_convert (sizetype, step));
   *ar_data->delta += idelta;
   *index = ibase;