Hi, all -maddress-mode=long will let Pmode = DI_mode, but -mx32 request x32 ABI. So raise an error to avoid ICE.
Bootstrapped and regtested, OK for trunk? BRs, Lin gcc/ChangeLog: PR target/117418 * config/i386/i386-options.cc (ix86_option_override_internal): raise an error with option -mx32 -maddress-mode=long. gcc/testsuite/ChangeLog: PR target/117418 * gcc.target/i386/pr117418-1.c: New test. --- gcc/config/i386/i386-options.cc | 4 ++++ gcc/testsuite/gcc.target/i386/pr117418-1.c | 13 +++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 gcc/testsuite/gcc.target/i386/pr117418-1.c diff --git a/gcc/config/i386/i386-options.cc b/gcc/config/i386/i386-options.cc index 239269ecbdd..ba1abea2537 100644 --- a/gcc/config/i386/i386-options.cc +++ b/gcc/config/i386/i386-options.cc @@ -2190,6 +2190,10 @@ ix86_option_override_internal (bool main_args_p, error ("address mode %qs not supported in the %s bit mode", TARGET_64BIT_P (opts->x_ix86_isa_flags) ? "short" : "long", TARGET_64BIT_P (opts->x_ix86_isa_flags) ? "64" : "32"); + + if (TARGET_X32_P (opts->x_ix86_isa_flags) + && opts_set->x_ix86_pmode == PMODE_DI) + error ("address mode 'long' not supported in the x32 ABI"); } else opts->x_ix86_pmode = TARGET_LP64_P (opts->x_ix86_isa_flags) diff --git a/gcc/testsuite/gcc.target/i386/pr117418-1.c b/gcc/testsuite/gcc.target/i386/pr117418-1.c new file mode 100644 index 00000000000..08430ef9d4b --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr117418-1.c @@ -0,0 +1,13 @@ +/* PR target/117418 */ +/* { dg-do compile } */ +/* { dg-options "-maddress-mode=long -mwidekl -mx32" } */ +/* { dg-error "address mode 'long' not supported in the x32 ABI" "" { target *-*-* } 0 } */ + +typedef __attribute__((__vector_size__(16))) long long V; +V a; + +void +foo() +{ + __builtin_ia32_encodekey256_u32(0, a, a, &a); +} -- 2.31.1