On Wed, Mar 31, 2021 at 12:23 PM Richard Sandiford via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > 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. > > Tested on aarch64-linux-gnu, armeb-eabi and x86_64-linux-gnu. > OK to install?
OK. Richard. > Richard > > 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. > --- > gcc/gimple-fold.c | 2 ++ > gcc/testsuite/gcc.target/aarch64/sve/pr98268-1.c | 11 +++++++++++ > gcc/testsuite/gcc.target/aarch64/sve/pr98268-2.c | 10 ++++++++++ > 3 files changed, 23 insertions(+) > create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr98268-1.c > create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/pr98268-2.c > > diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c > index de5a6c22395..9e6683dbac9 100644 > --- a/gcc/gimple-fold.c > +++ b/gcc/gimple-fold.c > @@ -5877,6 +5877,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; > + } > +}