Properly check conflict between DRAP register and __builtin_eh_return
authorH.J. Lu <hjl@gcc.gnu.org>
Wed, 30 Mar 2016 12:38:36 +0000 (05:38 -0700)
committerH.J. Lu <hjl@gcc.gnu.org>
Wed, 30 Mar 2016 12:38:36 +0000 (05:38 -0700)
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.

PR target/70439
* config/i386/i386.c (ix86_expand_epilogue): Properly check
conflict between DRAP register and __builtin_eh_return.

From-SVN: r234559

gcc/config/i386/i386.c

index 1639704..f700a25 100644 (file)
@@ -13463,9 +13463,11 @@ 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);
-         /* Neither does regparm nested functions.  */
+         /* %ecx can't be used for both DRAP register and eh_return.  */
+         if (crtl->drap_reg)
+           gcc_assert (REGNO (crtl->drap_reg) != CX_REG);
+
+         /* regparm nested functions don't work with eh_return.  */
          gcc_assert (!ix86_static_chain_on_stack);
 
          if (frame_pointer_needed)