summaryrefslogtreecommitdiff
path: root/0097-Improve-non-loop-disambiguation.patch
diff options
context:
space:
mode:
Diffstat (limited to '0097-Improve-non-loop-disambiguation.patch')
-rw-r--r--0097-Improve-non-loop-disambiguation.patch101
1 files changed, 101 insertions, 0 deletions
diff --git a/0097-Improve-non-loop-disambiguation.patch b/0097-Improve-non-loop-disambiguation.patch
new file mode 100644
index 0000000..ae609d2
--- /dev/null
+++ b/0097-Improve-non-loop-disambiguation.patch
@@ -0,0 +1,101 @@
+From 6de2e0d400cbe46da482a672810c37b1832c408c Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?=E9=83=91=E6=99=A8=E5=8D=89?= <zhengchenhui1@huawei.com>
+Date: Thu, 25 Jul 2024 19:45:43 +0800
+Subject: [PATCH] Improve non-loop disambiguation
+
+This optimization is brought from https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=038b077689bb5310386b04d40a2cea234f01e6aa.
+
+When dr_may_alias_p is called without a loop context, it tries
+to use the tree-affine interface to calculate the difference
+between the two addresses and use that difference to check whether
+the gap between the accesses is known at compile time. However, as the
+example in the PR shows, this doesn't expand SSA_NAMEs and so can easily
+be defeated by things like reassociation.
+
+One fix would have been to use aff_combination_expand to expand the
+SSA_NAMEs, but we'd then need some way of maintaining the associated
+cache. This patch instead reuses the innermost_loop_behavior fields
+(which exist even when no loop context is provided).
+
+It might still be useful to do the aff_combination_expand thing too,
+if an example turns out to need it.
+---
+ gcc/common.opt | 4 ++++
+ gcc/testsuite/gcc.dg/vect/bb-slp-pr106019.c | 16 +++++++++++++++
+ gcc/tree-data-ref.cc | 22 +++++++++++++++++++++
+ 3 files changed, 42 insertions(+)
+ create mode 100644 gcc/testsuite/gcc.dg/vect/bb-slp-pr106019.c
+
+diff --git a/gcc/common.opt b/gcc/common.opt
+index b18f0b944..75bf9c9c1 100644
+--- a/gcc/common.opt
++++ b/gcc/common.opt
+@@ -3217,6 +3217,10 @@ ftree-loop-vectorize
+ Common Var(flag_tree_loop_vectorize) Optimization EnabledBy(ftree-vectorize)
+ Enable loop vectorization on trees.
+
++falias-analysis-expand-ssa
++Common Var(flag_alias_analysis_expand_ssa) Init(0)
++Enable expanded SSA name analysis during alias analysis.
++
+ ftree-slp-vectorize
+ Common Var(flag_tree_slp_vectorize) Optimization EnabledBy(ftree-vectorize)
+ Enable basic block vectorization (SLP) on trees.
+diff --git a/gcc/testsuite/gcc.dg/vect/bb-slp-pr106019.c b/gcc/testsuite/gcc.dg/vect/bb-slp-pr106019.c
+new file mode 100644
+index 000000000..5ff8a8a62
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/vect/bb-slp-pr106019.c
+@@ -0,0 +1,16 @@
++/* { dg-do compile } */
++/* { dg-additional-options "-falias-analysis-expand-ssa" } */
++
++void f(double *p, long i)
++{
++ p[i+0] += 1;
++ p[i+1] += 1;
++}
++void g(double *p, long i)
++{
++ double *q = p + i;
++ q[0] += 1;
++ q[1] += 1;
++}
++
++/* { dg-final { scan-tree-dump-not "can't determine dependence" slp2 } } */
+diff --git a/gcc/tree-data-ref.cc b/gcc/tree-data-ref.cc
+index e6ae9e847..a05073c51 100644
+--- a/gcc/tree-data-ref.cc
++++ b/gcc/tree-data-ref.cc
+@@ -2993,6 +2993,28 @@ dr_may_alias_p (const struct data_reference *a, const struct data_reference *b,
+ disambiguation. */
+ if (!loop_nest)
+ {
++ if (flag_alias_analysis_expand_ssa)
++ {
++ tree tree_size_a = TYPE_SIZE_UNIT (TREE_TYPE (DR_REF (a)));
++ tree tree_size_b = TYPE_SIZE_UNIT (TREE_TYPE (DR_REF (b)));
++
++ if (DR_BASE_ADDRESS (a)
++ && DR_BASE_ADDRESS (b)
++ && operand_equal_p (DR_BASE_ADDRESS (a), DR_BASE_ADDRESS (b))
++ && operand_equal_p (DR_OFFSET (a), DR_OFFSET (b))
++ && poly_int_tree_p (tree_size_a)
++ && poly_int_tree_p (tree_size_b)
++ && !ranges_maybe_overlap_p (wi::to_widest (DR_INIT (a)),
++ wi::to_widest (tree_size_a),
++ wi::to_widest (DR_INIT (b)),
++ wi::to_widest (tree_size_b)))
++ {
++ gcc_assert (integer_zerop (DR_STEP (a))
++ && integer_zerop (DR_STEP (b)));
++ return false;
++ }
++ }
++
+ aff_tree off1, off2;
+ poly_widest_int size1, size2;
+ get_inner_reference_aff (DR_REF (a), &off1, &size1);
+--
+2.33.0
+