From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1130) id 200183944822; Fri, 23 Apr 2021 09:10:33 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 200183944822 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Richard Sandiford To: gcc-cvs@gcc.gnu.org Subject: [gcc r10-9750] gimple-fold: Recompute ADDR_EXPR flags after folding a TMR [PR98268] X-Act-Checkin: gcc X-Git-Author: Richard Sandiford X-Git-Refname: refs/heads/releases/gcc-10 X-Git-Oldrev: 7e2db68a77fb211898a024c5a7ad7c4449c7e355 X-Git-Newrev: 18a190c3ee32548de3888b7a64f701999893727b Message-Id: <20210423091033.200183944822@sourceware.org> Date: Fri, 23 Apr 2021 09:10:33 +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: Fri, 23 Apr 2021 09:10:33 -0000 https://gcc.gnu.org/g:18a190c3ee32548de3888b7a64f701999893727b commit r10-9750-g18a190c3ee32548de3888b7a64f701999893727b Author: Richard Sandiford Date: Fri Apr 23 10:09:39 2021 +0100 gimple-fold: Recompute ADDR_EXPR flags after folding a TMR [PR98268] The gimple verifier picked up that an ADDR_EXPR of a MEM_REF was not marked TREE_CONSTANT even though the address was in fact invariant. This came from folding a &TARGET_MEM_REF with constant operands to a &MEM_REF; &TARGET_MEM_REF is never treated as TREE_CONSTANT but &MEM_REF can be. gcc/ PR tree-optimization/98268 * gimple-fold.c (maybe_canonicalize_mem_ref_addr): Call recompute_tree_invariant_for_addr_expr after successfully folding a TARGET_MEM_REF that occurs inside an ADDR_EXPR. gcc/testsuite/ PR tree-optimization/98268 * gcc.target/aarch64/sve/pr98268-1.c: New test. * gcc.target/aarch64/sve/pr98268-2.c: Likewise. (cherry picked from commit c778968339afd140380a46edbade054667c7dce2) Diff: --- gcc/gimple-fold.c | 3 +++ gcc/testsuite/gcc.target/aarch64/sve/pr98268-1.c | 11 +++++++++++ gcc/testsuite/gcc.target/aarch64/sve/pr98268-2.c | 10 ++++++++++ 3 files changed, 24 insertions(+) diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index da3536ecd4e..b8754dcc105 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -4840,6 +4840,7 @@ static bool maybe_canonicalize_mem_ref_addr (tree *t, bool is_debug = false) { bool res = false; + tree *orig_t = t; if (TREE_CODE (*t) == ADDR_EXPR) t = &TREE_OPERAND (*t, 0); @@ -4952,6 +4953,8 @@ maybe_canonicalize_mem_ref_addr (tree *t, bool is_debug = false) if (tem) { *t = tem; + if (TREE_CODE (*orig_t) == ADDR_EXPR) + recompute_tree_invariant_for_addr_expr (*orig_t); res = true; } } diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr98268-1.c b/gcc/testsuite/gcc.target/aarch64/sve/pr98268-1.c new file mode 100644 index 00000000000..fdbe55e0b4e --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/pr98268-1.c @@ -0,0 +1,11 @@ +/* { dg-do link } */ +/* { dg-options "-flto -O -ftree-vectorize --param=aarch64-autovec-preference=3" } */ +/* { dg-additional-sources "pr98268-2.c" } */ + +short d, e; +void f(char, long*); +int main() { + long x; + f(-114, &x); + return d == e; +} diff --git a/gcc/testsuite/gcc.target/aarch64/sve/pr98268-2.c b/gcc/testsuite/gcc.target/aarch64/sve/pr98268-2.c new file mode 100644 index 00000000000..de3b05d5e15 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/pr98268-2.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-O -ftree-vectorize --param=aarch64-autovec-preference=3" } */ + +extern short d[], e[]; +void f(char a, long *b) { + for (int c = 0; c < a - 12; c++) { + d[c] = b[c]; + e[c] = 0; + } +}