]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/32389 (ICE in extract_constrain_insn_cached when using -msse)
authorUros Bizjak <ubizjak@gmail.com>
Mon, 18 Jun 2007 22:32:56 +0000 (00:32 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Mon, 18 Jun 2007 22:32:56 +0000 (00:32 +0200)
        PR target/32389
        * config/i386/i386.h (enum ix86_stack_slot): Add SLOT_VIRTUAL.
        * config/i386/i386.c (assign_386_stack_local): Assert that
        SLOT_VIRTUAL is valid only before virtual regs are instantiated.
        (ix86_expand_builtin) [IX86_BUILTIN_LDMXCSR, IX86_BUILTIN_STMXCSR]:
        Use SLOT_VIRTUAL stack slot instead of SLOT_TEMP.
        * config/i386/i386.md (truncdfsf2, truncxf<mode>2): Ditto.

testsuite/ChangeLog:

        PR target/32389
        * gcc.target/i386/pr32389.c New test.

From-SVN: r125830

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/config/i386/i386.h
gcc/config/i386/i386.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr32389.c [new file with mode: 0644]

index 6fa4c6e512658e719424d47d6c1984e8f869a399..616f658ddb3eec7f632402ee3c1ece5296433d61 100644 (file)
@@ -1,3 +1,13 @@
+2007-06-18  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/32389
+       * config/i386/i386.h (enum ix86_stack_slot): Add SLOT_VIRTUAL.
+       * config/i386/i386.c (assign_386_stack_local): Assert that
+       SLOT_VIRTUAL is valid only before virtual regs are instantiated.
+       (ix86_expand_builtin) [IX86_BUILTIN_LDMXCSR, IX86_BUILTIN_STMXCSR]:
+       Use SLOT_VIRTUAL stack slot instead of SLOT_TEMP.
+       * config/i386/i386.md (truncdfsf2, truncxf<mode>2): Ditto.
+
 2007-06-18  Steve Ellcey  <sje@cup.hp.com>
 
        * config/ia64/ia64.h (LIBGCC2_TF_CEXT): New.
index ef3d7b3b5aa20985a537fc614aff8ad81140b584..72e281ec173d3c077a33adf4a50bb43d3876eec0 100644 (file)
@@ -15614,6 +15614,9 @@ assign_386_stack_local (enum machine_mode mode, enum ix86_stack_slot n)
 
   gcc_assert (n < MAX_386_STACK_LOCALS);
 
+  /* Virtual slot is valid only before vregs are instantiated.  */
+  gcc_assert ((n == SLOT_VIRTUAL) == !virtuals_instantiated);
+
   for (s = ix86_stack_locals; s; s = s->next)
     if (s->mode == mode && s->n == n)
       return copy_rtx (s->rtl);
@@ -19209,13 +19212,13 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
 
     case IX86_BUILTIN_LDMXCSR:
       op0 = expand_normal (CALL_EXPR_ARG (exp, 0));
-      target = assign_386_stack_local (SImode, SLOT_TEMP);
+      target = assign_386_stack_local (SImode, SLOT_VIRTUAL);
       emit_move_insn (target, op0);
       emit_insn (gen_sse_ldmxcsr (target));
       return 0;
 
     case IX86_BUILTIN_STMXCSR:
-      target = assign_386_stack_local (SImode, SLOT_TEMP);
+      target = assign_386_stack_local (SImode, SLOT_VIRTUAL);
       emit_insn (gen_sse_stmxcsr (target));
       return copy_to_mode_reg (SImode, target);
 
index ee1fbbc27651be8547e25f562b7a953de1a86939..31a434ac287bcfcaad49f07d45d4a6db9417329f 100644 (file)
@@ -2334,7 +2334,8 @@ enum ix86_entity
 
 enum ix86_stack_slot
 {
-  SLOT_TEMP = 0,
+  SLOT_VIRTUAL = 0,
+  SLOT_TEMP,
   SLOT_CW_STORED,
   SLOT_CW_TRUNC,
   SLOT_CW_FLOOR,
index 3f8f97b46cb8d09ea2bda7d2d6faa70dcedf5f5c..c8bff3e00620c913a0bedb69b1e044d8e1a44bf3 100644 (file)
     ;
   else
     {
-      rtx temp = assign_386_stack_local (SFmode, SLOT_TEMP);
+      rtx temp = assign_386_stack_local (SFmode, SLOT_VIRTUAL);
       emit_insn (gen_truncdfsf2_with_temp (operands[0], operands[1], temp));
       DONE;
     }
       DONE;
     }
   else
-    operands[2] = assign_386_stack_local (<MODE>mode, SLOT_TEMP);
+    operands[2] = assign_386_stack_local (<MODE>mode, SLOT_VIRTUAL);
 })
 
 (define_insn "*truncxfsf2_mixed"
index dbfb12bb95b3958462e1d5c0a54adc260709eddf..0d626bb370941d5618605d4a0a54e9897fcff9b3 100644 (file)
@@ -1,3 +1,8 @@
+2007-06-18  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/32389
+       * gcc.target/i386/pr32389.c New test.
+
 2007-06-18  Simon Baldwin <simonb@google.com>
 
        PR c++/31923
 2007-06-18  Uros Bizjak  <ubizjak@gmail.com>
 
        PR tree-optimization/32383
-       * testsuite/g++.dg/opt/pr32383.C: New test.
+       * g++.dg/opt/pr32383.C: New test.
 
 2007-06-17  Uros Bizjak  <ubizjak@gmail.com>
 
        PR rtl-optimization/32366
-       * testsuite/gcc.dg/vect/pr32366.c: New test.
+       * gcc.dg/vect/pr32366.c: New test.
 
 2007-06-17  Kenneth Zadeck <zadeck@naturalbridge.com>
 
diff --git a/gcc/testsuite/gcc.target/i386/pr32389.c b/gcc/testsuite/gcc.target/i386/pr32389.c
new file mode 100644 (file)
index 0000000..3f4cb3e
--- /dev/null
@@ -0,0 +1,10 @@
+/* Testcase by Mike Frysinger <vapier@gentoo.org>  */
+
+/* { dg-do compile { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */
+/* { dg-options "-msse" } */
+
+double f1();
+int f2() {
+  __builtin_ia32_stmxcsr();
+  return f1();
+}