aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2024-09-19 14:58:18 +0200
committerRichard Biener <rguenth@gcc.gnu.org>2024-09-19 16:26:28 +0200
commit5b5a36b122e1205449f1512bf39521b669e713ef (patch)
treed0e5392098ece9d8c7f47ba7bd8e2aba2959be97
parent77bd23a3e247555ba427d01af8e5713934be8d5b (diff)
downloadgcc-5b5a36b122e1205449f1512bf39521b669e713ef.zip
gcc-5b5a36b122e1205449f1512bf39521b669e713ef.tar.gz
gcc-5b5a36b122e1205449f1512bf39521b669e713ef.tar.bz2
tree-optimization/116768 - wrong dependence analysis
The following reverts a bogus fix done for PR101009 and instead makes sure we get into the same_access_functions () case when computing the distance vector for g[1] and g[1] where the constants ended up having different types. The generic code doesn't seem to handle loop invariant dependences. The special case gets us both ( 0 ) and ( 1 ) as distance vectors while formerly we got ( 1 ), which the PR101009 fix changed to ( 0 ) with bad effects on other cases as shown in this PR. PR tree-optimization/116768 * tree-data-ref.cc (build_classic_dist_vector_1): Revert PR101009 change. * tree-chrec.cc (eq_evolutions_p): Make sure (sizetype)1 and (int)1 compare equal. * gcc.dg/torture/pr116768.c: New testcase.
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr116768.c32
-rw-r--r--gcc/tree-chrec.cc4
-rw-r--r--gcc/tree-data-ref.cc2
3 files changed, 34 insertions, 4 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr116768.c b/gcc/testsuite/gcc.dg/torture/pr116768.c
new file mode 100644
index 0000000..57b5d00
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr116768.c
@@ -0,0 +1,32 @@
+/* { dg-do run } */
+
+#define numwords 2
+
+typedef struct {
+ unsigned words[numwords];
+} Child;
+
+typedef struct {
+ Child child;
+} Parent;
+
+Parent my_or(Parent x, const Parent *y) {
+ const Child *y_child = &y->child;
+ for (int i = 0; i < numwords; i++) {
+ x.child.words[i] |= y_child->words[i];
+ }
+ return x;
+}
+
+int main() {
+ Parent bs[4];
+ __builtin_memset(bs, 0, sizeof(bs));
+
+ bs[0].child.words[0] = 1;
+ for (int i = 1; i <= 3; i++) {
+ bs[i] = my_or(bs[i], &bs[i - 1]);
+ }
+ if (bs[2].child.words[0] != 1)
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc/tree-chrec.cc b/gcc/tree-chrec.cc
index 8b7982a..9b27207 100644
--- a/gcc/tree-chrec.cc
+++ b/gcc/tree-chrec.cc
@@ -1716,7 +1716,7 @@ eq_evolutions_p (const_tree chrec0, const_tree chrec1)
|| TREE_CODE (chrec0) != TREE_CODE (chrec1))
return false;
- if (chrec0 == chrec1)
+ if (operand_equal_p (chrec0, chrec1, 0))
return true;
if (! types_compatible_p (TREE_TYPE (chrec0), TREE_TYPE (chrec1)))
@@ -1743,7 +1743,7 @@ eq_evolutions_p (const_tree chrec0, const_tree chrec1)
TREE_OPERAND (chrec1, 0));
default:
- return operand_equal_p (chrec0, chrec1, 0);
+ return false;
}
}
diff --git a/gcc/tree-data-ref.cc b/gcc/tree-data-ref.cc
index 0f173e8..de234c6 100644
--- a/gcc/tree-data-ref.cc
+++ b/gcc/tree-data-ref.cc
@@ -5223,8 +5223,6 @@ build_classic_dist_vector_1 (struct data_dependence_relation *ddr,
non_affine_dependence_relation (ddr);
return false;
}
- else
- *init_b = true;
}
return true;