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 --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. */ -- 2.35.3