On Tue, Oct 1, 2024 at 12:01 PM Eric Botcazou <botca...@adacore.com> wrote: > > Hi, > > the attached Ada testcase compiled with -O -flto exhibits a wrong code issue > when the 3 optimizations NRV + RSO + inlining are applied to the same call: if > the LHS of the call is marked write-only before inlining, then it will keep > the mark after inlining although it may be read in GIMPLE from that point on. > > The proposed fix is to apply the removal of the store that would have been > applied by execute_fixup_cfg if the call was not inlined: > > /* For calls we can simply remove LHS when it is known > to be write-only. */ > if (is_gimple_call (stmt) > && gimple_get_lhs (stmt)) > { > tree lhs = get_base_address (gimple_get_lhs (stmt)); > > if (VAR_P (lhs) > && (TREE_STATIC (lhs) || DECL_EXTERNAL (lhs)) > && varpool_node::get (lhs)->writeonly) > { > gimple_call_set_lhs (stmt, NULL); > update_stmt (stmt); > todo |= TODO_update_ssa | TODO_cleanup_cfg; > } > } > > right before inlining, which will prevent the problematic references to the > LHS from being generated during inlining. > > Tested on x86-64/Linux, OK for the mainline?
Nice solution - OK. Thanks, Richard. > > 2024-10-01 Eric Botcazou <ebotca...@adacore.com> > > * tree-inline.cc (expand_call_inline): Remove the store to the > return slot if it is a global variable that is only written to. > > > 2024-10-01 Eric Botcazou <ebotca...@adacore.com> > > * gnat.dg/lto28.adb: New test. > * gnat.dg/lto28_pkg1.ads: New helper. > * gnat.dg/lto28_pkg2.ads: Likewise. > * gnat.dg/lto28_pkg2.adb: Likewise. > * gnat.dg/lto28_pkg3.ads: Likewise. > > -- > Eric Botcazou