re PR target/17692 (ICE splitting sse conditional move)
authorRichard Henderson <rth@redhat.com>
Thu, 28 Jul 2005 20:51:18 +0000 (13:51 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Thu, 28 Jul 2005 20:51:18 +0000 (13:51 -0700)
        PR target/17692
        * config/i386/i386.c (ix86_split_sse_movcc): Emit DELETED note
        when expanding to nothing.

From-SVN: r102509

gcc/ChangeLog
gcc/testsuite/gcc.target/i386/pr17692.c [new file with mode: 0644]

index 36ae71bc820b2c5e296efbe57170ef190615a3c8..46d1a4d33064ad4143acfd0684c9fe4f2eca1038 100644 (file)
@@ -1,3 +1,9 @@
+2005-07-28  Richard Henderson  <rth@redhat.com>
+
+       PR target/17692
+        * config/i386/i386.c (ix86_split_sse_movcc): Emit DELETED note
+        when expanding to nothing.
+
 2005-07-28  Josh Conner  <jconner@apple.com>
 
        * ipa-inline.c (update_caller_keys): Fix estimated_growth caching.
diff --git a/gcc/testsuite/gcc.target/i386/pr17692.c b/gcc/testsuite/gcc.target/i386/pr17692.c
new file mode 100644 (file)
index 0000000..a837386
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O -mfpmath=sse -msse2" } */
+/* The fact that t1 and t2 are uninitialized is critical.  With them
+   uninitialized, the register allocator is free to put them in the same
+   hard register, which results in
+
+       xmm0 = xmm0 >= xmm0 ? xmm0 : xmm0
+
+   Which is of course a nop, but one for which we would ICE splitting the
+   pattern.  */
+   
+double out;
+
+static void foo(void)
+{
+    double t1, t2, t3, t4;
+    
+    t4 = t1 >= t2 ? t1 : t2;
+    t4 = t4 >= t3 ? t4 : t3;
+    out = t4;
+}