re PR middle-end/13392 (ICE in convert_from_eh_region_ranges_1, at except.c:1133)
authorJakub Jelinek <jakub@redhat.com>
Sun, 11 Jan 2004 19:05:34 +0000 (20:05 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sun, 11 Jan 2004 19:05:34 +0000 (20:05 +0100)
PR middle-end/13392
* builtins.c (expand_builtin_expect_jump): Handle conditional jumps
to drop through label.  Don't fall back to SCC even when conditional
jump has not been found.

* g++.dg/opt/expect2.C: New test.

From-SVN: r75684

gcc/ChangeLog
gcc/builtins.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/expect2.C [new file with mode: 0644]

index aa162c6f66d805cec883e5f8fb1145d03957703d..1904cf6f230b699969575664807af6502faacaaf 100644 (file)
@@ -1,3 +1,10 @@
+2004-01-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/13392
+       * builtins.c (expand_builtin_expect_jump): Handle conditional jumps
+       to drop through label.  Don't fall back to SCC even when conditional
+       jump has not been found.
+
 2004-01-11  Jan Hubicka  <jh@suse.cz>
 
        * invoke.texi: Fix syntax error in previous patch.
index 266039632f687aa56a15ee364733364469c25741..10c753b82106f9a7f537c1abe54c02f531d4cf4b 100644 (file)
@@ -4441,39 +4441,24 @@ expand_builtin_expect_jump (tree exp, rtx if_false_label, rtx if_true_label)
   if (TREE_CODE (TREE_TYPE (arg1)) == INTEGER_TYPE
       && (integer_zerop (arg1) || integer_onep (arg1)))
     {
-      int num_jumps = 0;
-      int save_pending_stack_adjust = pending_stack_adjust;
-      rtx insn;
-
-      /* If we fail to locate an appropriate conditional jump, we'll
-        fall back to normal evaluation.  Ensure that the expression
-        can be re-evaluated.  */
-      switch (unsafe_for_reeval (arg0))
-       {
-       case 0: /* Safe.  */
-         break;
-
-       case 1: /* Mildly unsafe.  */
-         arg0 = unsave_expr (arg0);
-         break;
-
-       case 2: /* Wildly unsafe.  */
-         return NULL_RTX;
-       }
+      rtx insn, drop_through_label;
 
       /* Expand the jump insns.  */
       start_sequence ();
       do_jump (arg0, if_false_label, if_true_label);
       ret = get_insns ();
+
+      drop_through_label = get_last_insn ();
+      if (drop_through_label && GET_CODE (drop_through_label) == NOTE)
+       drop_through_label = prev_nonnote_insn (drop_through_label);
+      if (drop_through_label && GET_CODE (drop_through_label) != CODE_LABEL)
+       drop_through_label = NULL_RTX;
       end_sequence ();
 
-      /* For mildly unsafe builtin jump's, if unsave_expr_now
-        creates a new tree instead of changing the old one
-        TREE_VALUE (arglist) needs to be updated.  */
-      if (arg0 != TREE_VALUE (arglist)
-         && TREE_CODE (arg0) == UNSAVE_EXPR
-         && TREE_OPERAND (arg0, 0) != TREE_VALUE (arglist))
-       TREE_VALUE (arglist) = TREE_OPERAND (arg0, 0);
+      if (! if_true_label)
+       if_true_label = drop_through_label;
+      if (! if_false_label)
+       if_false_label = drop_through_label;
 
       /* Now that the __builtin_expect has been validated, go through and add
         the expect's to each of the conditional jumps.  If we run into an
@@ -4531,21 +4516,12 @@ expand_builtin_expect_jump (tree exp, rtx if_false_label, rtx if_true_label)
              else if (label != if_true_label)
                goto do_next_insn;
 
-             num_jumps++;
              predict_insn_def (insn, PRED_BUILTIN_EXPECT, taken);
            }
 
        do_next_insn:
          insn = next;
        }
-
-      /* If no jumps were modified, fail and do __builtin_expect the normal
-        way.  */
-      if (num_jumps == 0)
-       {
-         ret = NULL_RTX;
-         pending_stack_adjust = save_pending_stack_adjust;
-       }
     }
 
   return ret;
index 2d7b5067e19fe20f9c68ec29da16e9d058887ef5..4aa8241db6343a82edbf751a1193e850dc7c3c8b 100644 (file)
@@ -1,3 +1,8 @@
+2004-01-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/13392
+       * g++.dg/opt/expect2.C: New test.
+
 2004-01-10  Zack Weinberg  <zack@codesourcery.com>
 
        * gcc.dg/Wshadow-1.c, gcc.dg/attr-noinline.c, gcc.dg/decl3.c
diff --git a/gcc/testsuite/g++.dg/opt/expect2.C b/gcc/testsuite/g++.dg/opt/expect2.C
new file mode 100644 (file)
index 0000000..1bb5d83
--- /dev/null
@@ -0,0 +1,11 @@
+// PR c++/13392
+// { dg-do compile }
+// { dg-options "-O0" }
+
+extern "C" void abort (void);
+struct X { ~X () throw() {} };
+bool foo (X s = X ()) { return false; }
+void bar ()
+{
+  __builtin_expect (foo () && true, 1) ? 0 : (abort (), 0);
+}