aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-fold.c
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2021-03-31 19:34:01 +0100
committerRichard Sandiford <richard.sandiford@arm.com>2021-03-31 19:34:01 +0100
commitc778968339afd140380a46edbade054667c7dce2 (patch)
treee6d75a82dea4daa295a0fb3d5821df7bb876c42d /gcc/gimple-fold.c
parentb5c7accfb56a7347008f629be4c7344dd849b1b1 (diff)
downloadgcc-c778968339afd140380a46edbade054667c7dce2.zip
gcc-c778968339afd140380a46edbade054667c7dce2.tar.gz
gcc-c778968339afd140380a46edbade054667c7dce2.tar.bz2
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.
Diffstat (limited to 'gcc/gimple-fold.c')
-rw-r--r--gcc/gimple-fold.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c
index de5a6c2..9e6683d 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;
}
}