This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR50698
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Thu, 13 Oct 2011 10:57:08 +0200 (CEST)
- Subject: [PATCH] Fix PR50698
This fixes PR50698, a failure to disambiguate &MEM[&mem + 10] from
&MEM[&mem] in data-reference analysis. Fixed by also looking
at offsets for non-subsetted references.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.
Richard.
2011-10-13 Richard Guenther <rguenther@suse.de>
PR tree-optimization/50698
* tree-data-ref.c (split_constant_offset_1): Also process
offsets of &MEM.
* g++.dg/vect/pr50698.cc: New testcase.
Index: gcc/tree-data-ref.c
===================================================================
*** gcc/tree-data-ref.c (revision 179856)
--- gcc/tree-data-ref.c (working copy)
*************** split_constant_offset_1 (tree type, tree
*** 589,597 ****
int punsignedp, pvolatilep;
op0 = TREE_OPERAND (op0, 0);
- if (!handled_component_p (op0))
- return false;
-
base = get_inner_reference (op0, &pbitsize, &pbitpos, &poffset,
&pmode, &punsignedp, &pvolatilep, false);
--- 589,594 ----
Index: gcc/testsuite/g++.dg/vect/pr50698.cc
===================================================================
*** gcc/testsuite/g++.dg/vect/pr50698.cc (revision 0)
--- gcc/testsuite/g++.dg/vect/pr50698.cc (revision 0)
***************
*** 0 ****
--- 1,27 ----
+ // { dg-do compile }
+ // { dg-require-effective-target vect_float }
+
+ float mem[4096];
+ const int N=1024;
+
+ struct XYZ {
+ float * mem;
+ int n;
+ float * x() { return mem;}
+ float * y() { return x()+n;}
+ float * z() { return y()+n;}
+ };
+
+ inline
+ void sum(float * x, float * y, float * z, int n) {
+ for (int i=0;i!=n; ++i)
+ x[i]=y[i]+z[i];
+ }
+
+ void sumS() {
+ XYZ xyz; xyz.mem=mem; xyz.n=N;
+ sum(xyz.x(),xyz.y(),xyz.z(),xyz.n);
+ }
+
+ // { dg-final { scan-tree-dump-not "run-time aliasing" "vect" } }
+ // { dg-final { cleanup-tree-dump "vect" } }