Message ID | 20220307135740.51344-1-hjl.tools@gmail.com |
---|---|
State | New |
Headers | show |
Series | [v2] x86: Disable SSE on unwind-c.c and unwind-dw2.c | expand |
On Mon, Mar 07, 2022 at 05:57:40AM -0800, H.J. Lu via Gcc-patches wrote: > --- a/gcc/config/i386/i386.cc > +++ b/gcc/config/i386/i386.cc > @@ -9444,9 +9444,8 @@ ix86_expand_epilogue (int style) > rtx sa = EH_RETURN_STACKADJ_RTX; > rtx_insn *insn; > > - /* %ecx can't be used for both DRAP register and eh_return. */ > - if (crtl->drap_reg) > - gcc_assert (REGNO (crtl->drap_reg) != CX_REG); > + /* Stack realignment doesn't work with eh_return. */ > + gcc_assert (!crtl->stack_realign_needed); Shouldn't this be error or sorry? Otherwise, won't calls to __builtin_eh_return from random testcases where stack realignment is needed or even with regparm nested functions just ICE? > > /* regparm nested functions don't work with eh_return. */ > gcc_assert (!ix86_static_chain_on_stack); Jakub
On Mon, Mar 7, 2022 at 6:23 AM Jakub Jelinek <jakub@redhat.com> wrote: > > On Mon, Mar 07, 2022 at 05:57:40AM -0800, H.J. Lu via Gcc-patches wrote: > > --- a/gcc/config/i386/i386.cc > > +++ b/gcc/config/i386/i386.cc > > @@ -9444,9 +9444,8 @@ ix86_expand_epilogue (int style) > > rtx sa = EH_RETURN_STACKADJ_RTX; > > rtx_insn *insn; > > > > - /* %ecx can't be used for both DRAP register and eh_return. */ > > - if (crtl->drap_reg) > > - gcc_assert (REGNO (crtl->drap_reg) != CX_REG); > > + /* Stack realignment doesn't work with eh_return. */ > > + gcc_assert (!crtl->stack_realign_needed); > > Shouldn't this be error or sorry? Otherwise, won't > calls to __builtin_eh_return from random testcases where > stack realignment is needed or even with regparm nested functions > just ICE? Fixed in the v3 patch: https://gcc.gnu.org/pipermail/gcc-patches/2022-March/591307.html Thanks. > > > > /* regparm nested functions don't work with eh_return. */ > > gcc_assert (!ix86_static_chain_on_stack); > > Jakub >
diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc index 95219902694..1c675304e32 100644 --- a/gcc/config/i386/i386.cc +++ b/gcc/config/i386/i386.cc @@ -9444,9 +9444,8 @@ ix86_expand_epilogue (int style) rtx sa = EH_RETURN_STACKADJ_RTX; rtx_insn *insn; - /* %ecx can't be used for both DRAP register and eh_return. */ - if (crtl->drap_reg) - gcc_assert (REGNO (crtl->drap_reg) != CX_REG); + /* Stack realignment doesn't work with eh_return. */ + gcc_assert (!crtl->stack_realign_needed); /* regparm nested functions don't work with eh_return. */ gcc_assert (!ix86_static_chain_on_stack); diff --git a/gcc/testsuite/gcc.target/i386/eh_return-1.c b/gcc/testsuite/gcc.target/i386/eh_return-1.c index b21fd75fc93..43f94f01a97 100644 --- a/gcc/testsuite/gcc.target/i386/eh_return-1.c +++ b/gcc/testsuite/gcc.target/i386/eh_return-1.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-O2 -march=haswell -mno-avx512f -mtune-ctrl=avx256_move_by_pieces" } */ +/* { dg-options "-O2 -mincoming-stack-boundary=4 -march=haswell -mno-avx512f -mtune-ctrl=avx256_move_by_pieces" } */ struct _Unwind_Context { diff --git a/gcc/testsuite/gcc.target/i386/eh_return-2.c b/gcc/testsuite/gcc.target/i386/eh_return-2.c index f23f4492dac..cb762f92cc2 100644 --- a/gcc/testsuite/gcc.target/i386/eh_return-2.c +++ b/gcc/testsuite/gcc.target/i386/eh_return-2.c @@ -1,6 +1,6 @@ /* PR target/101772 */ /* { dg-do compile } */ -/* { dg-additional-options "-O0 -march=x86-64 -mstackrealign" } */ +/* { dg-additional-options "-O0 -mincoming-stack-boundary=4 -march=x86-64 -mstackrealign" } */ struct _Unwind_Context _Unwind_Resume_or_Rethrow_this_context; diff --git a/libgcc/config.host b/libgcc/config.host index 094fd3ad254..1588ab6cf20 100644 --- a/libgcc/config.host +++ b/libgcc/config.host @@ -1583,3 +1583,16 @@ case ${host} in tmake_file="$tmake_file t-gthr-noweak" ;; esac + +case ${host} in +i[34567]86-*-* | x86_64-*-*) + if test "${host_address}" = 32; then + case ${host} in + *-*-cygwin* | *-*-mingw* | *-*-solaris2*) + # Disable SSE on unwind-c.c and unwind-dw2.c to avoid stack + # realignment with the 4-byte aligned incoming stack. + tmake_file="${tmake_file} i386/${host_address}/t-eh-return-no-sse" + ;; + esac + fi +esac diff --git a/libgcc/config/i386/32/t-eh-return-no-sse b/libgcc/config/i386/32/t-eh-return-no-sse new file mode 100644 index 00000000000..5a8c3135911 --- /dev/null +++ b/libgcc/config/i386/32/t-eh-return-no-sse @@ -0,0 +1,5 @@ +# Since eh_return doesn't work with stack realignment, disable SSE on +# unwind-c.c and unwind-dw2.c to avoid stack realignment with the 4-byte +# incoming stack. + +unwind-c.o unwind-c_s.o unwind-dw2.o unwind-dw2_s.o : HOST_LIBGCC2_CFLAGS += -mno-sse