OSDN Git Service

2009-07-25 David Daney <ddaney@caviumnetworks.com>
authordaney <daney@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 25 Jul 2009 20:20:59 +0000 (20:20 +0000)
committerdaney <daney@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 25 Jul 2009 20:20:59 +0000 (20:20 +0000)
* cfgcleanup.c (old_insns_match_p): Handle the case of empty
blocks.

2009-07-25  David Daney  <ddaney@caviumnetworks.com>

* gcc.dg/builtin-unreachable-4.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@150089 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cfgcleanup.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/builtin-unreachable-4.c [new file with mode: 0644]

index e223f44..54806d1 100644 (file)
@@ -1,3 +1,8 @@
+2009-07-25  David Daney  <ddaney@caviumnetworks.com>
+
+       * cfgcleanup.c (old_insns_match_p): Handle the case of empty
+       blocks.
+       
 2009-07-25  Martin Jambor  <mjambor@suse.cz>
 
        * c-common.c (c_common_attribute_table): New element for noclone.
index 757a0ff..01ddf99 100644 (file)
@@ -953,7 +953,12 @@ old_insns_match_p (int mode ATTRIBUTE_UNUSED, rtx i1, rtx i2)
   if (GET_CODE (i1) != GET_CODE (i2))
     return false;
 
-  p1 = PATTERN (i1);
+  /* __builtin_unreachable() may lead to empty blocks (ending with
+     NOTE_INSN_BASIC_BLOCK).  They may be crossjumped. */
+  if (NOTE_INSN_BASIC_BLOCK_P (i1) && NOTE_INSN_BASIC_BLOCK_P (i2))
+    return true;
+
+   p1 = PATTERN (i1);
   p2 = PATTERN (i2);
 
   if (GET_CODE (p1) != GET_CODE (p2))
index c013628..c982c25 100644 (file)
@@ -1,3 +1,7 @@
+2009-07-25  David Daney  <ddaney@caviumnetworks.com>
+
+       * gcc.dg/builtin-unreachable-4.c: New test.
+
 2009-07-25  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/33197
diff --git a/gcc/testsuite/gcc.dg/builtin-unreachable-4.c b/gcc/testsuite/gcc.dg/builtin-unreachable-4.c
new file mode 100644 (file)
index 0000000..90bc99c
--- /dev/null
@@ -0,0 +1,14 @@
+/* Check that this valid code doesn't ICE.  */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+void
+g (int a, int b, int c, int d)
+{
+  if (d)
+    {
+      ((void)
+       (!(a && b && c) ? __builtin_unreachable (), 0 : 0));
+    }
+  ((void)
+   (!(a && b && c) ? __builtin_unreachable (), 0 : 0));
+}