]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Avoid pessimistic constraints for asm memory constraints
authorRichard Biener <rguenther@suse.de>
Tue, 28 May 2024 11:29:30 +0000 (13:29 +0200)
committerRichard Biener <rguenther@suse.de>
Tue, 28 May 2024 12:12:46 +0000 (14:12 +0200)
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.

gcc/tree-ssa-structalias.cc

index f93c5df07676886d7c9715bce6d534ddb5736b28..9cec2c6cfd97f2e53bcf326d83dc84e48bd98997 100644 (file)
@@ -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.  */