https://gcc.gnu.org/g:5b5a36b122e1205449f1512bf39521b669e713ef
commit r15-3716-g5b5a36b122e1205449f1512bf39521b669e713ef Author: Richard Biener <rguent...@suse.de> Date: Thu Sep 19 14:58:18 2024 +0200 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. Diff: --- gcc/testsuite/gcc.dg/torture/pr116768.c | 32 ++++++++++++++++++++++++++++++++ gcc/tree-chrec.cc | 4 ++-- gcc/tree-data-ref.cc | 2 -- 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 000000000000..57b5d00e7b71 --- /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 8b7982a2dbe9..9b272074a2ed 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 0f173e8803ab..de234c65e948 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;