On Sun, Jul 9, 2017 at 8:29 PM, H.J. Lu <hjl.to...@gmail.com> wrote:
> On Sun, Jul 9, 2017 at 11:19 AM, Uros Bizjak <ubiz...@gmail.com> wrote:
>> On Fri, Jul 7, 2017 at 12:14 AM, H.J. Lu <hjl.to...@gmail.com> wrote:
>>> On Thu, Jul 6, 2017 at 12:08 PM, H.J. Lu <hongjiu...@intel.com> wrote:
>>>> Since DRAP is needed only if there are outgoing arguments on stack, we
>>>> should track outgoing arguments on stack and avoid setting need_drap to
>>>> true when there are no outgoing arguments on stack.
>>>>
>>>> Tested on i686 and x86-64 with SSE2, AVX and AVX2.  There is no
>>>> regression.  OK for trunk?
>>>>
>>>> H.J.
>>>> ---
>>>> gcc/
>>>>
>>>>         PR target/81313
>>>>         * config/i386/i386.c (ix86_function_arg_advance): Set
>>>>         outgoing_args_on_stack to true if there are outgoing arguments
>>>>         on stack.
>>>>         (ix86_function_arg): Likewise.
>>>>         (ix86_get_drap_rtx): Use DRAP only if there are outgoing
>>>>         arguments on stack and ACCUMULATE_OUTGOING_ARGS is false.
>>>>         * config/i386/i386.h (machine_function): Add
>>>>         outgoing_args_on_stack.
>>>>
>>>> @@ -10473,6 +10479,10 @@ ix86_function_arg (cumulative_args_t cum_v, 
>>>> machine_mode omode,
>>>>    else
>>>>      arg = function_arg_32 (cum, mode, omode, type, bytes, words);
>>>>
>>>> +  /* Track if there are outgoing arguments on stack.  */
>>>> +  if (arg == NULL_RTX)
>>>> +    cfun->machine->outgoing_args_on_stack = true;
>>>
>>> This should be
>>>
>>> +  /* Track if there are outgoing arguments on stack.  */
>>> +  if (arg == NULL_RTX && cum->caller)
>>> +    cfun->machine->outgoing_args_on_stack = true;
>>>
>>> to check outgoing arguments for caller here.
>>>
>>>>    return arg;
>>>>  }
>>>>
>>>>
>>>
>>> I am testing updated patch with a new testcase.
>>
>> Updated patch LGTM.
>>
>> OK for mainline.
>
> Done.  My patch will cause
>
> FAIL: gcc.dg/stack-layout-dynamic-1.c
>
> since on x86, now stack realignment is done with
>
> .cfi_startproc
> pushl %ebp
> .cfi_def_cfa_offset 8
> .cfi_offset 5, -8
> movl %esp, %ebp
> .cfi_def_cfa_register 5
> andl $-65536, %esp
>
> instead of
>
> .cfi_startproc
> pushl %edi
> .cfi_def_cfa_offset 8
> .cfi_offset 7, -8
> leal 8(%esp), %edi
> .cfi_def_cfa 7, 0
> andl $-65536, %esp
> pushl -4(%edi)
> pushl %ebp
> .cfi_escape 0x10,0x5,0x2,0x75,0
> movl %esp, %ebp
>
> PR target/81313
> * gcc.dg/stack-layout-dynamic-1.c (dg-options): Add -mregparm=3
> for ia32.
> Don't expect cfi_escape and expect cfi_def_cfa_register on x86.
>
> OK for trunk?

Better use something like:

--cut here--
Index: stack-layout-dynamic-1.c
===================================================================
--- stack-layout-dynamic-1.c    (revision 250084)
+++ stack-layout-dynamic-1.c    (working copy)
@@ -4,12 +4,12 @@
 /* { dg-options "-O0 -fomit-frame-pointer" } */
 /* { dg-require-effective-target ptr32plus } */

-extern void bar (void *, void *, void *);
+extern void bar (void *,void *, void *, void *, void *, void *, void *);
 void foo (void)
 {
-  int i;
+  int i, j, k, l, m;
   __attribute__ ((aligned(65536))) char runtime_aligned_1[512];
   __attribute__ ((aligned(32768))) char runtime_aligned_2[1024];
-  bar (&i, &runtime_aligned_1, &runtime_aligned_2);
+  bar (&i, &j, &k, &l, &m, &runtime_aligned_1, &runtime_aligned_2);
 }
 /* { dg-final { scan-assembler-not "cfi_def_cfa_register" } } */
--cut here--

so the testcase will suppress new optimization and test what it was
intended to test also on x86_64.

Uros.

Reply via email to