http://gcc.gnu.org/bugzilla/show_bug.cgi?id=8081
Eric Botcazou <ebotcazou at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |ebotcazou at gcc dot | |gnu.org --- Comment #25 from Eric Botcazou <ebotcazou at gcc dot gnu.org> 2012-01-13 08:36:56 UTC --- > It's of course not that easy as we gimplify before un-nesting. The frontend > would be responsible to arrange things that way, similar to how we pass > a return slot in the C++ frontend (DECL_BY_REFERENCE on the DECL_RESULT > variable). Like for the attached patch. Passes > > extern void abort (void); > int > main (int argc, char **argv) > { > int size = 10; > typedef struct > { > char val[size]; > } > block; > block a, b; > block __attribute__((noinline)) > retframe_block () > { > return *(block *) &b; > } > b.val[0] = -1; > b.val[1] = -2; > a=retframe_block (); > if (a.val[0] != -1 > || a.val[1] != -2) > abort (); > return 0; > } > > I'm not sure if one can construct a testcase where using return-slot > optimization causes wrong-code generation. Alternatively checking > DECL_BY_REFERENCE on the callees DECL_RESULT instead of applying it to > all VLA types could work (though not for indirect calls). You should ask specialists. :-) In Ada, we do this routinely and the strategy used is that of the "forced RSO": we generate INIT_EXPR instead of MODIFY_EXPR and we create an explicit temporary if we detect potential overlap. Btw, I don't understand why you're mixing DECL_BY_REFERENCE and RSO here, just Index: gimplify.c =================================================================== --- gimplify.c (revision 183104) +++ gimplify.c (working copy) @@ -4417,6 +4417,9 @@ gimplify_modify_expr_rhs (tree *expr_p, /* It's OK to use the target directly if it's being initialized. */ use_target = true; + else if (variably_modified_type_p (TREE_TYPE (*to_p), NULL_TREE)) + /* Always use the target for variable-sized types. */ + use_target = true; else if (TREE_CODE (*to_p) != SSA_NAME && (!is_gimple_variable (*to_p) || needs_to_live_in_memory (*to_p))) works for me on the testcase. -- Configure bugmail: http://gcc.gnu.org/bugzilla/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- You are on the CC list for the bug. -- To UNSUBSCRIBE, email to debian-gcc-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/bug-8081-5724-pooaqrh...@http.gcc.gnu.org/bugzilla/