aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2024-05-28 13:29:30 +0200
committerRichard Biener <rguenther@suse.de>2024-05-28 14:12:46 +0200
commit19cc61111120087619b496732b249b48b1fbe27e (patch)
tree014b0d9091e3770fd05155f6aefd691c0e70de39 /gcc
parenteaaa4b88038d4d6eda1b20ab662f1568fd9be31f (diff)
downloadgcc-19cc61111120087619b496732b249b48b1fbe27e.zip
gcc-19cc61111120087619b496732b249b48b1fbe27e.tar.gz
gcc-19cc61111120087619b496732b249b48b1fbe27e.tar.bz2
Avoid pessimistic constraints for asm memory constraints
We process asm memory input/outputs with constraints to ESCAPED but for this temporarily build an ADDR_EXPR. The issue is that the used build_fold_addr_expr ends up wrapping the ADDR_EXPR in a conversion which ends up producing &ANYTHING constraints which is quite bad. The following uses get_constraint_for_address_of instead, avoiding the temporary tree and the unhandled conversion. This avoids a gcc.dg/tree-ssa/restrict-9.c FAIL with the fix for PR115236. * tree-ssa-structalias.cc (find_func_aliases): Use get_constraint_for_address_of to build escape constraints for asm inputs and outputs.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/tree-ssa-structalias.cc12
1 files changed, 10 insertions, 2 deletions
diff --git a/gcc/tree-ssa-structalias.cc b/gcc/tree-ssa-structalias.cc
index f93c5df..9cec2c6 100644
--- a/gcc/tree-ssa-structalias.cc
+++ b/gcc/tree-ssa-structalias.cc
@@ -5269,7 +5269,11 @@ find_func_aliases (struct function *fn, gimple *origt)
/* A memory constraint makes the address of the operand escape. */
if (!allows_reg && allows_mem)
- make_escape_constraint (build_fold_addr_expr (op));
+ {
+ auto_vec<ce_s> tmpc;
+ get_constraint_for_address_of (op, &tmpc);
+ make_constraints_to (escaped_id, tmpc);
+ }
/* The asm may read global memory, so outputs may point to
any global memory. */
@@ -5298,7 +5302,11 @@ find_func_aliases (struct function *fn, gimple *origt)
/* A memory constraint makes the address of the operand escape. */
if (!allows_reg && allows_mem)
- make_escape_constraint (build_fold_addr_expr (op));
+ {
+ auto_vec<ce_s> tmpc;
+ get_constraint_for_address_of (op, &tmpc);
+ make_constraints_to (escaped_id, tmpc);
+ }
/* Strictly we'd only need the constraint to ESCAPED if
the asm clobbers memory, otherwise using something
along the lines of per-call clobbers/uses would be enough. */