On Tue, 22 Oct 2024, Martin Jambor wrote: > Hi, > > PR 117142 shows that the current SRA probably never worked reliably > with arguments passed to a function returning twice, because it then > creates statements before the call which however needs to be at the > beginning of a basic block. > > While it should be possible to make at least the case of passing > arguments by value work with SRA (the statements would need to be put > just on the non-abnormal edges leading to the BB), this would mean > large surgery of function sra_modify_expr and I guess the time would > better be spent re-organizing the whole pass. > > Bootstrapped and tested on x86_64-linux. OK for master and all active > release branches (though for gcc 13 and 12 the condition will probable > be elsewhere, IIRC)?
OK. Richard. > Thanks, > > Martin > > > gcc/ChangeLog: > > 2024-10-21 Martin Jambor <mjam...@suse.cz> > > PR tree-optimization/117142 > * tree-sra.cc (build_access_from_call_arg): Disqualify any > candidate passed to a function returning twice. > > gcc/testsuite/ChangeLog: > > 2024-10-21 Martin Jambor <mjam...@suse.cz> > > PR tree-optimization/117142 > * gcc.dg/tree-ssa/pr117142.c: New test. > --- > gcc/testsuite/gcc.dg/tree-ssa/pr117142.c | 14 ++++++++++++++ > gcc/tree-sra.cc | 9 +++++++++ > 2 files changed, 23 insertions(+) > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr117142.c > > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr117142.c > b/gcc/testsuite/gcc.dg/tree-ssa/pr117142.c > new file mode 100644 > index 00000000000..fc62c1e58f2 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr117142.c > @@ -0,0 +1,14 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O1" } */ > + > +struct a { > + int b; > +}; > +void c(int, int); > +void __attribute__((returns_twice)) > +bar1(struct a); > +void bar(struct a) { > + struct a d; > + bar1(d); > + c(d.b, d.b); > +} > diff --git a/gcc/tree-sra.cc b/gcc/tree-sra.cc > index 64e2f007d68..c0915dce5c4 100644 > --- a/gcc/tree-sra.cc > +++ b/gcc/tree-sra.cc > @@ -1397,6 +1397,15 @@ static bool > build_access_from_call_arg (tree expr, gimple *stmt, bool can_be_returned, > enum out_edge_check *oe_check) > { > + if (gimple_call_flags (stmt) & ECF_RETURNS_TWICE) > + { > + tree base = expr; > + if (TREE_CODE (expr) == ADDR_EXPR) > + base = get_base_address (TREE_OPERAND (expr, 0)); > + disqualify_base_of_expr (base, "Passed to a returns_twice call."); > + return false; > + } > + > if (TREE_CODE (expr) == ADDR_EXPR) > { > tree base = get_base_address (TREE_OPERAND (expr, 0)); > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)