diff mbox

[i386] : Fix PR50202, ICE: in final_scan_insn, at final.c:2709 (could not split insn) with __builtin_ia32_pcmpistri128

Message ID CAFULd4ayHVZeMxYy+61_MXsNiUVKVQuQYEgfT6MLraazth-Svw@mail.gmail.com
State New
Headers show

Commit Message

Uros Bizjak Aug. 27, 2011, 7:54 a.m. UTC
Hello!

Attached patch fixes corner case with -fno-dse, where the insn has all
outputs unused. Do not bother with the insn in this case and simply
delete it from splitter.

2011-08-27  Uros Bizjak  <ubizjak@gmail.com>

	PR target/50202
	* config/i386/sse.md (sse4_2_pcmpestr): Emit NOTE_INSN_DELETED note
	when all outputs are unused.
	(sse4_2_pcmpistr): Ditto.

testsuite/ChangeLog:

2011-08-27  Uros Bizjak  <ubizjak@gmail.com>

	PR target/50202
	* gcc.target/i386/pr50202.c: New test.

Bootstrapped and regression tested on x86_64-pc-linux-gnu  {,-m32}.
Committed to mainline SVN and to 4.6.

Uros.
diff mbox

Patch

Index: config/i386/sse.md
===================================================================
--- config/i386/sse.md	(revision 178129)
+++ config/i386/sse.md	(working copy)
@@ -9734,6 +9734,9 @@ 
 					   operands[2], operands[3],
 					   operands[4], operands[5],
 					   operands[6]));
+  if (!(flags || ecx || xmm0))
+    emit_note (NOTE_INSN_DELETED);
+
   DONE;
 }
   [(set_attr "type" "sselog")
@@ -9861,6 +9864,9 @@ 
     emit_insn (gen_sse4_2_pcmpistr_cconly (NULL, NULL,
 					   operands[2], operands[3],
 					   operands[4]));
+  if (!(flags || ecx || xmm0))
+    emit_note (NOTE_INSN_DELETED);
+
   DONE;
 }
   [(set_attr "type" "sselog")
Index: testsuite/gcc.target/i386/pr50202.c
===================================================================
--- testsuite/gcc.target/i386/pr50202.c	(revision 0)
+++ testsuite/gcc.target/i386/pr50202.c	(revision 0)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O -fno-tree-dse -fno-dce -msse4" } */
+/* { dg-require-effective-target sse4 } */
+
+typedef char __v16qi __attribute__ ((__vector_size__ (16)));
+
+__v16qi v;
+int i;
+
+void
+foo (void)
+{
+  i = __builtin_ia32_pcmpistri128 (v, v, 255);
+  i = 255;
+}