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

Reply via email to