diff mbox series

Avoid pessimistic constraints for asm memory constraints

Message ID 20240528121259.BA2713858D35@sourceware.org
State New
Headers show
Series Avoid pessimistic constraints for asm memory constraints | expand

Commit Message

Richard Biener May 28, 2024, 12:12 p.m. UTC
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.

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

	* 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 | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/gcc/tree-ssa-structalias.cc b/gcc/tree-ssa-structalias.cc
index 53552b63532..330e64e65da 100644
--- a/gcc/tree-ssa-structalias.cc
+++ b/gcc/tree-ssa-structalias.cc
@@ -5277,7 +5277,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.  */
@@ -5306,7 +5310,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.  */