From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2153) id 52CFB399D03B; Thu, 17 Sep 2020 17:07:50 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 52CFB399D03B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1600362470; bh=K7R8GT/0uqIRXvuQQ2H7+FEPsJ0XOeScM5Z/YSEpcls=; h=From:To:Subject:Date:From; b=xJPqHwPfDSojnq4AY3UiDzKJBkNW60AFYF5Pcpst9xGTFLL4MS0AN5oIA80hIOCrB 8wzi+mmdQpDy5dfFyWYWK2xfCUszRa+Y33cTD2sLZzEeuAQzqUe6f16f8Sp5gSVcxn t7wJN3ENCgNojUp0E4r7dUVX2F+54O0w5Xw9wMe8= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Jakub Jelinek To: gcc-cvs@gcc.gnu.org Subject: [gcc(refs/vendors/redhat/heads/gcc-8-branch)] Add missing unit dependence vector in data dependence analysis X-Act-Checkin: gcc X-Git-Author: Bin Cheng X-Git-Refname: refs/vendors/redhat/heads/gcc-8-branch X-Git-Oldrev: 1a261d5a3612e216e17ae0a8e048eb5ae63ddcb0 X-Git-Newrev: 000705acb47766b2f8b850a0e8a6a4c935a1730d Message-Id: <20200917170750.52CFB399D03B@sourceware.org> Date: Thu, 17 Sep 2020 17:07:50 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 17 Sep 2020 17:07:50 -0000 https://gcc.gnu.org/g:000705acb47766b2f8b850a0e8a6a4c935a1730d commit 000705acb47766b2f8b850a0e8a6a4c935a1730d Author: Bin Cheng Date: Sat Jun 20 16:56:21 2020 +0800 Add missing unit dependence vector in data dependence analysis Current data dependence analysis misses unit distant vector if DRs in DDR have the same invariant access functions. This adds the vector as the constant access function case. Also fix typo in testcase. Backport from master commit: 287552950d56be47adb6b6bf2eae2d612233eaec and f6e1a4cd83190746b6544917f7526fa480ca5f18 2020-06-20 Bin Cheng gcc/ PR tree-optimization/94969 * tree-data-ref.c (constant_access_functions): Rename to... (invariant_access_functions): ...this. Add parameter. Check for invariant access function, rather than constant. (build_classic_dist_vector): Call above function. * tree-loop-distribution.c (pg_add_dependence_edges): Add comment. gcc/testsuite/ PR tree-optimization/94969 * gcc.dg/tree-ssa/pr94969.c: New test. 2020-06-20 Jakub Jelinek gcc/testsuite/ PR tree-optimization/95110 * gcc.dg/tree-ssa/pr94969.c: Swap scan-tree-dump-not arguments. Diff: --- gcc/testsuite/gcc.dg/tree-ssa/pr94969.c | 28 ++++++++++++++++++++++++++++ gcc/tree-data-ref.c | 12 +++++++----- gcc/tree-loop-distribution.c | 3 ++- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr94969.c b/gcc/testsuite/gcc.dg/tree-ssa/pr94969.c new file mode 100644 index 00000000000..f15046122ff --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr94969.c @@ -0,0 +1,28 @@ +/* PR tree-optimization/52267 */ +/* { dg-do run } */ +/* { dg-options "-O3 -fdump-tree-ldist-details" } */ + +int a = 0, b = 0, c = 0; +struct S { + signed m : 7; + signed e : 2; +}; +struct S f[2] = {{0, 0}, {0, 0}}; +struct S g = {0, 0}; + +void __attribute__((noinline)) +k() +{ + for (; c <= 1; c++) { + f[b] = g; + f[b].e ^= 1; + } +} +int main() +{ + k(); + if (f[b].e != 1) + __builtin_abort (); +} + +/* { dg-final { scan-tree-dump-not "Loop 1 distributed: split to 3 loops" "ldist" } } */ diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c index fc86bc25951..c90e862fb16 100644 --- a/gcc/tree-data-ref.c +++ b/gcc/tree-data-ref.c @@ -4342,17 +4342,19 @@ build_classic_dist_vector_1 (struct data_dependence_relation *ddr, return true; } -/* Return true when the DDR contains only constant access functions. */ +/* Return true when the DDR contains only invariant access functions wrto. loop + number LNUM. */ static bool -constant_access_functions (const struct data_dependence_relation *ddr) +invariant_access_functions (const struct data_dependence_relation *ddr, + int lnum) { unsigned i; subscript *sub; FOR_EACH_VEC_ELT (DDR_SUBSCRIPTS (ddr), i, sub) - if (!evolution_function_is_constant_p (SUB_ACCESS_FN (sub, 0)) - || !evolution_function_is_constant_p (SUB_ACCESS_FN (sub, 1))) + if (!evolution_function_is_invariant_p (SUB_ACCESS_FN (sub, 0), lnum) + || !evolution_function_is_invariant_p (SUB_ACCESS_FN (sub, 1), lnum)) return false; return true; @@ -4551,7 +4553,7 @@ build_classic_dist_vector (struct data_dependence_relation *ddr, dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr)); save_dist_v (ddr, dist_v); - if (constant_access_functions (ddr)) + if (invariant_access_functions (ddr, loop_nest->num)) add_distance_for_zero_overlaps (ddr); if (DDR_NB_LOOPS (ddr) > 1) diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index 769523ba214..05766c7300d 100644 --- a/gcc/tree-loop-distribution.c +++ b/gcc/tree-loop-distribution.c @@ -1919,7 +1919,8 @@ pg_add_dependence_edges (struct graph *rdg, int dir, this_dir = -this_dir; /* Known dependences can still be unordered througout the - iteration space, see gcc.dg/tree-ssa/ldist-16.c. */ + iteration space, see gcc.dg/tree-ssa/ldist-16.c and + gcc.dg/tree-ssa/pr94969.c. */ if (DDR_NUM_DIST_VECTS (ddr) != 1) this_dir = 2; /* If the overlap is exact preserve stmt order. */