102 lines
3.6 KiB
Diff
102 lines
3.6 KiB
Diff
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
|
|
|