On Thu, Mar 22, 2018 at 4:56 AM, Renlin Li <renlin...@foss.arm.com> wrote:
> Hi all,
>
> As described in PR84877. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84877
> The local copy of parameter on stack is not aligned.
>
> For BLKmode paramters, a local copy on the stack will be saved.
> There are three cases:
> 1) arguments passed partially on the stack, partially via registers.
> 2) arguments passed fully on the stack.
> 3) arguments passed via registers.
>
> After the change here, in all three cases, the stack slot for the local
> parameter copy is aligned by the data type.
> The stack slot is the DECL_RTL of the parameter. All the references
> thereafter in the function will refer to this RTL.
>
> To populate the local copy on the stack,
> For case 1) and 2), there are operations to move data from the caller's
> stack (from incoming rtl) into callee's stack.
> For case 3), the registers are directly saved into the stack slot.
>
> In all cases, the destination address is properly aligned.
> But for case 1) and case 2), the source address is not aligned by the type.
> It is defined by the PCS how the arguments are prepared.
> The block move operation is fulfilled by emit_block_move (). As far as I can
> see,
> it will use the smaller alignment of source and destination.
> This looks fine as long as we don't use instructions which requires a strict
> larger alignment than the address actually has.
>
> Here, it only changes receiving parameters.
> The function assign_stack_local_1 will be called in various places.
> Usually, the caller will constraint the ALIGN parameter. For example via
> STACK_SLOT_ALIGNMENT macro.
> assign_parm_setup_block will call assign_stack_local () with alignment from
> the parameter type which in this case could be
> larger than MAX_SUPPORTED_STACK_ALIGNMENT.
>
> The alignment operation for parameter copy on the stack is similar to stack
> vars.
> First, enough space is reserved on the stack. The size is fixed at compile
> time.
> Instructions are emitted to dynamically get an aligned address at runtime
> within this piece of memory.
>
> This will unavoidably increase the usage of stack. However, it really
> depends on
> how many over-aligned parameters are passed by value.
>
> x86-linux, arm-none-eabi, aarch64-one-elf regression test Okay.
> linux-armhf bootstrap Okay.
>
> I assume there are other targets which will be affected by the change.
> But I don't have environment to test.
>
> Okay the commit?
>
>
> Regards,
> Renlin
>
> gcc/
>
> 2018-03-22  Renlin Li  <renlin...@arm.com>
>
>         PR middle-end/84877
>         * explow.h (get_dynamic_stack_size): Declare it as external.
>         * explow.c (record_new_stack_level): Remove function static
> attribute.
>         * function.c (assign_stack_local_1): Dynamically align the stack
> slot
>         addr for parameter copy on the stack.
>

Will this coded be used on x86?  X86 backend can dynamically align
stack just fine without the above change.


-- 
H.J.

Reply via email to