This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH, PR50527] Don't assume alignment of vla-related allocas.
On 10/04/2011 11:31 PM, Tom de Vries wrote:
> On 10/04/2011 10:58 PM, Richard Henderson wrote:
>> On 10/04/2011 01:17 PM, Tom de Vries wrote:
>>> In general, to fold vlas (which are lowered to allocas) to normal declarations,
>>> if the alloca argument is constant.
>>
>> Ah. Ok, I suppose. How often are you seeing this happening? I can imagine
>> a few instances via inlining, but even there not so much...
>>
>
> I have no statistics on this. But something simple like this is still translated
> into a vla, and can be folded:
> ...
> const int n = 5;
> int array[n];
> ...
>
>>> Any guidance on what to do if we have to expand the __builtin_alloca_with_align
>>> to a function call, specifically, with the second argument? This is currently
>>> handled like this, which is not very nice:
>>
>> Don't do anything special. Just let it fall through as with alloca. This should
>> never happen, except for stupid user tricks like -fno-builtin-alloca_with_align.
>> And if the user does that, they get what they deserve wrt needing to implement
>> that function in their runtime.
>>
>
> What currently causes this behaviour, is -fmudflap, see mf_xform_statements in
> tree-mudflap.c. The patch handles handles __builtin_allloca_with_align the same
> as __builtins_alloca in that function, meaning that both are marked with
> gimple_call_set_cannot_inline.
>
> So:
> - we always expand alloca_with_align in expand_builtin_alloca, even for
> -fmudflap, or
> - we need to handle the expansion of the call, or
> - ... ?
>
Or we don't lower to alloca_with_align when -fmudflap is present?
...
Index: gimplify.c
===================================================================
--- gimplify.c (revision 179210)
+++ gimplify.c (working copy)
@@ -1329,8 +1329,17 @@ gimplify_vla_decl (tree decl, gimple_seq
SET_DECL_VALUE_EXPR (decl, t);
DECL_HAS_VALUE_EXPR_P (decl) = 1;
- t = built_in_decls[BUILT_IN_ALLOCA];
- t = build_call_expr (t, 1, DECL_SIZE_UNIT (decl));
+ if (flag_mudflap)
+ {
+ t = built_in_decls[BUILT_IN_ALLOCA];
+ t = build_call_expr (t, 1, DECL_SIZE_UNIT (decl));
+ }
+ else
+ {
+ t = built_in_decls[BUILT_IN_ALLOCA_WITH_ALIGN];
+ t = build_call_expr (t, 2, DECL_SIZE_UNIT (decl),
+ build_int_cstu (size_type_node, DECL_ALIGN (decl)));
+ }
/* The call has been built for a variable-sized object. */
CALL_ALLOCA_FOR_VAR_P (t) = 1;
t = fold_convert (ptr_type, t);
...
> Thanks,
> - Tom
>
>>
>> r~
>