On Thu, Mar 22, 2018 at 5:52 AM, H.J. Lu <hjl.to...@gmail.com> wrote:
> 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.
>>
>> gcc/testsuite/
>>
>> 2018-03-22  Renlin Li  <renlin...@arm.com>
>>
>>         PR middle-end/84877
>>         * gcc.dg/pr84877.c: New.
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>
> But your patch has
>
> diff --git a/gcc/testsuite/gcc.target/arm/pr84877.c
> b/gcc/testsuite/gcc.target/arm/pr84877.c
> new file mode 100644
> index 
> 0000000000000000000000000000000000000000..b2df8a954f566dea3a4f1ed70572b43de39dda82
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/arm/pr84877.c
>
> Why is this ARM specific?

+#include <inttypes.h>
+
+struct U {
+    int M0;
+    int M1;
+} __attribute ((aligned(16)));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Some targets align stack to 16 bytes by default.
You need 32 byte alignment to better test stack alignment.

+

-- 
H.J.

Reply via email to