diff mbox

PR target/70439: Properly check conflict between DRAP register and __builtin_eh_return

Message ID 20160329185635.GA17241@intel.com
State New
Headers show

Commit Message

H.J. Lu March 29, 2016, 6:56 p.m. UTC
Since %ecx can't be used for both DRAP register and __builtin_eh_return,
we need to check if crtl->drap_reg uses %ecx before using %ecx for
__builtin_eh_return.

Testing on x86-64.  OK for trunk if there are no regressions?


H.J.
---
	PR target/70439
	* config/i386/i386.c (ix86_expand_epilogue): Properly check
	conflict between DRAP register and __builtin_eh_return.
---
 gcc/config/i386/i386.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

Comments

Uros Bizjak March 30, 2016, 7:47 a.m. UTC | #1
On Tue, Mar 29, 2016 at 8:56 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> Since %ecx can't be used for both DRAP register and __builtin_eh_return,
> we need to check if crtl->drap_reg uses %ecx before using %ecx for
> __builtin_eh_return.
>
> Testing on x86-64.  OK for trunk if there are no regressions?
>
>
> H.J.
> ---
>         PR target/70439
>         * config/i386/i386.c (ix86_expand_epilogue): Properly check
>         conflict between DRAP register and __builtin_eh_return.
> ---
>  gcc/config/i386/i386.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index 1639704..aafe171 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -13463,8 +13463,9 @@ ix86_expand_epilogue (int style)
>           rtx sa = EH_RETURN_STACKADJ_RTX;
>           rtx_insn *insn;
>
> -         /* Stack align doesn't work with eh_return.  */
> -         gcc_assert (!stack_realign_drap);
> +         /* %ecx can't be used for both DRAP register and eh_return.  */
> +         gcc_assert (!crtl->drap_reg
> +                     || REGNO (crtl->drap_reg) != CX_REG);

How about:

        if (crtl->drap_reg)
          gcc_assert (REGNO (crtl->drap_reg) != CX_REG));

?

>           /* Neither does regparm nested functions.  */
>           gcc_assert (!ix86_static_chain_on_stack);

This comment needs to be updated, too.

Uros.
H.J. Lu March 30, 2016, 11 a.m. UTC | #2
On Wed, Mar 30, 2016 at 12:47 AM, Uros Bizjak <ubizjak@gmail.com> wrote:
> On Tue, Mar 29, 2016 at 8:56 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
>> Since %ecx can't be used for both DRAP register and __builtin_eh_return,
>> we need to check if crtl->drap_reg uses %ecx before using %ecx for
>> __builtin_eh_return.
>>
>> Testing on x86-64.  OK for trunk if there are no regressions?
>>
>>
>> H.J.
>> ---
>>         PR target/70439
>>         * config/i386/i386.c (ix86_expand_epilogue): Properly check
>>         conflict between DRAP register and __builtin_eh_return.
>> ---
>>  gcc/config/i386/i386.c | 5 +++--
>>  1 file changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
>> index 1639704..aafe171 100644
>> --- a/gcc/config/i386/i386.c
>> +++ b/gcc/config/i386/i386.c
>> @@ -13463,8 +13463,9 @@ ix86_expand_epilogue (int style)
>>           rtx sa = EH_RETURN_STACKADJ_RTX;
>>           rtx_insn *insn;
>>
>> -         /* Stack align doesn't work with eh_return.  */
>> -         gcc_assert (!stack_realign_drap);
>> +         /* %ecx can't be used for both DRAP register and eh_return.  */
>> +         gcc_assert (!crtl->drap_reg
>> +                     || REGNO (crtl->drap_reg) != CX_REG);
>
> How about:
>
>         if (crtl->drap_reg)
>           gcc_assert (REGNO (crtl->drap_reg) != CX_REG));
>
> ?
>
>>           /* Neither does regparm nested functions.  */
>>           gcc_assert (!ix86_static_chain_on_stack);
>
> This comment needs to be updated, too.
>
> Uros.

Like this?
Uros Bizjak March 30, 2016, 11:01 a.m. UTC | #3
On Wed, Mar 30, 2016 at 1:00 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Wed, Mar 30, 2016 at 12:47 AM, Uros Bizjak <ubizjak@gmail.com> wrote:
>> On Tue, Mar 29, 2016 at 8:56 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
>>> Since %ecx can't be used for both DRAP register and __builtin_eh_return,
>>> we need to check if crtl->drap_reg uses %ecx before using %ecx for
>>> __builtin_eh_return.
>>>
>>> Testing on x86-64.  OK for trunk if there are no regressions?
>>>
>>>
>>> H.J.
>>> ---
>>>         PR target/70439
>>>         * config/i386/i386.c (ix86_expand_epilogue): Properly check
>>>         conflict between DRAP register and __builtin_eh_return.
>>> ---
>>>  gcc/config/i386/i386.c | 5 +++--
>>>  1 file changed, 3 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
>>> index 1639704..aafe171 100644
>>> --- a/gcc/config/i386/i386.c
>>> +++ b/gcc/config/i386/i386.c
>>> @@ -13463,8 +13463,9 @@ ix86_expand_epilogue (int style)
>>>           rtx sa = EH_RETURN_STACKADJ_RTX;
>>>           rtx_insn *insn;
>>>
>>> -         /* Stack align doesn't work with eh_return.  */
>>> -         gcc_assert (!stack_realign_drap);
>>> +         /* %ecx can't be used for both DRAP register and eh_return.  */
>>> +         gcc_assert (!crtl->drap_reg
>>> +                     || REGNO (crtl->drap_reg) != CX_REG);
>>
>> How about:
>>
>>         if (crtl->drap_reg)
>>           gcc_assert (REGNO (crtl->drap_reg) != CX_REG));
>>
>> ?
>>
>>>           /* Neither does regparm nested functions.  */
>>>           gcc_assert (!ix86_static_chain_on_stack);
>>
>> This comment needs to be updated, too.
>>
>> Uros.
>
> Like this?

Yes.

Thanks,
Uros.
diff mbox

Patch

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 1639704..aafe171 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -13463,8 +13463,9 @@  ix86_expand_epilogue (int style)
 	  rtx sa = EH_RETURN_STACKADJ_RTX;
 	  rtx_insn *insn;
 
-	  /* Stack align doesn't work with eh_return.  */
-	  gcc_assert (!stack_realign_drap);
+	  /* %ecx can't be used for both DRAP register and eh_return.  */
+	  gcc_assert (!crtl->drap_reg
+		      || REGNO (crtl->drap_reg) != CX_REG);
 	  /* Neither does regparm nested functions.  */
 	  gcc_assert (!ix86_static_chain_on_stack);