https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63573
--- Comment #15 from Jan Hubicka <hubicka at ucw dot cz> --- > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63573 > > --- Comment #14 from Martin Liška <marxin at gcc dot gnu.org> --- > (In reply to Andreas Schwab from comment #12) > > This also breaks g++.dg/ipa/pr63587-2.C on powerpc -m32, but the patches in > > #c6 and #c8 don't fix that. > > > > $ gcc/xg++ -Bgcc/ ../gcc/testsuite/g++.dg/ipa/pr63587-2.C -nostdinc++ > > -Ipowerpc64-linux/32/libstdc++-v3/include/powerpc64-linux > > -Ipowerpc64-linux/32/libstdc++-v3/include -I../libstdc++-v3/libsupc++ > > -I../libstdc++-v3/include/backward -I../libstdc++-v3/testsuite/util > > -std=gnu++11 -O2 -S -m32 -o pr63587-2.s > > ../gcc/testsuite/g++.dg/ipa/pr63587-2.C: In static member function ???static > > int > > boost::function_obj_invoker0<FunctionObj>::invoke(boost::function_buffer&) > > [with FunctionObj = > > boost::test_case_template_invoker<default_formatting_invoker>]???: > > ../gcc/testsuite/g++.dg/ipa/pr63587-2.C:21:3: internal compiler error: in > > expand_expr_addr_expr_1, at expr.c:7725 > > There's really problem that both suggested patches can fix just cases where > DECL_INCOMING_RTL is defined. In following situation: > > static boost::log::make_output_actor<ActorT<LeftExprT>, RightT, ValueT>::type > boost::log::make_output_actor<ActorT<LeftExprT>, RightT, > ValueT>::make(ActorT<LeftExprT>, RightT&) [with ActorT = boost::actor; > LeftExprT = > boost::log::attribute_output_terminal<boost::actor<boost::log::attribute_output_terminal<boost::actor<int>, > boost::log::to_log_fun> >, boost::log::to_log_fun>; RightT = > boost::log::attribute_actor<int, boost::log::value_extractor, void, > boost::actor>; ValueT = int; boost::log::make_output_actor<ActorT<LeftExprT>, > RightT, ValueT>::type = > boost::actor<boost::log::attribute_output_terminal<boost::actor<boost::log::attribute_output_terminal<boost::actor<boost::log::attribute_output_terminal<boost::actor<int>, > boost::log::to_log_fun> >, boost::log::to_log_fun> >, boost::log::to_log_fun> > >] (struct actor left, struct attribute_actor & right) > { > struct type D.4892; > struct attribute_name D.4891; > struct to_log_fun D.4890; > struct actor left; > > <bb 2>: > left = left; The reason here is that thunk expansion introduce extra temporary. if (nargs) for (i = 1, arg = DECL_CHAIN (a); i < nargs; i++, arg = DECL_CHAIN (arg)) { tree tmp = arg; if (!is_gimple_val (arg)) { tmp = create_tmp_reg (TYPE_MAIN_VARIANT (TREE_TYPE (arg)), "arg"); gimple stmt = gimple_build_assign (tmp, arg); gsi_insert_after (&bsi, stmt, GSI_NEW_STMT); } vargs.quick_push (tmp); } the temporary obviously is not linked with the original memory expression. I supose we may want to simply drop the tailcall flag in cases copy is necessary, but I do not really see why a copy is desirable here: IMO whatever can be RHS of assignment can also be passed to function. What makes left to be !is_gimple_val here? Honza