------- Comment #2 from rguenth at gcc dot gnu dot org 2006-06-13 11:53 ------- The inliner needs this temporary appearantly. Otherwise you'll get
bar () { int D.1524; <bb 2>: if (D.1524 != 0) goto <L0>; else goto <L1>; <L0>:; abort (); <L1>:; return; } out of inline int foo () { return 0; } void bar() { if (foo()) abort (); } i.e. it misses to initialize the temporary with the result. Otherwise you can play with variants of the following patch: Index: gimplify.c =================================================================== *** gimplify.c (revision 114599) --- gimplify.c (working copy) *************** gimplify_return_expr (tree stmt, tree *p *** 1111,1116 **** --- 1111,1124 ---- if (!result_decl || aggregate_value_p (result_decl, TREE_TYPE (current_function_decl))) result = result_decl; + else if (/*is_gimple_formal_tmp_reg (TREE_OPERAND (ret_expr, 1)) + ||*/ is_gimple_min_invariant (TREE_OPERAND (ret_expr, 1)) + /*is_gimple_val (TREE_OPERAND (ret_expr, 1))*/) + { + TREE_OPERAND (stmt, 0) = TREE_OPERAND (ret_expr, 1); + + return GS_ALL_DONE; + } else if (gimplify_ctxp->return_temp) result = gimplify_ctxp->return_temp; else -- rguenth at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |rguenth at gcc dot gnu dot | |org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27798