aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2005-09-03 20:49:51 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2005-09-03 20:49:51 +0200
commit7a6b7528533ea6d23a5b1a5624b4f68faf079a38 (patch)
tree8cd0ea8189b4ec5d94a1f55e0af06a8e152bdc41
parentf7e4e4847c4b252bb232191d28c05439e7c85612 (diff)
downloadgcc-7a6b7528533ea6d23a5b1a5624b4f68faf079a38.zip
gcc-7a6b7528533ea6d23a5b1a5624b4f68faf079a38.tar.gz
gcc-7a6b7528533ea6d23a5b1a5624b4f68faf079a38.tar.bz2
re PR rtl-optimization/23454 (ICE in invert_exp_1, at jump.c:1719)
PR rtl-optimization/23454 * reorg.c (relax_delay_slots): Only call invert_jump if any_condjump_p is true. * g++.dg/opt/pr23454.C: New test. From-SVN: r103810
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/reorg.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/opt/pr23454.C41
4 files changed, 56 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4b488fa..8bbb5ba 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-09-03 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/23454
+ * reorg.c (relax_delay_slots): Only call invert_jump if any_condjump_p
+ is true.
+
2005-09-03 Richard Henderson <rth@redhat.com>
John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
diff --git a/gcc/reorg.c b/gcc/reorg.c
index cda7168..8b9d7ef 100644
--- a/gcc/reorg.c
+++ b/gcc/reorg.c
@@ -3123,10 +3123,11 @@ relax_delay_slots (rtx first)
if (target_label && target_label != JUMP_LABEL (insn))
reorg_redirect_jump (insn, target_label);
- /* See if this jump branches around an unconditional jump.
- If so, invert this jump and point it to the target of the
+ /* See if this jump conditionally branches around an unconditional
+ jump. If so, invert this jump and point it to the target of the
second jump. */
if (next && JUMP_P (next)
+ && any_condjump_p (insn)
&& (simplejump_p (next) || GET_CODE (PATTERN (next)) == RETURN)
&& target_label
&& next_active_insn (target_label) == next_active_insn (next)
@@ -3172,7 +3173,7 @@ relax_delay_slots (rtx first)
if (JUMP_P (insn)
&& (simplejump_p (insn) || GET_CODE (PATTERN (insn)) == RETURN)
&& (other = prev_active_insn (insn)) != 0
- && (condjump_p (other) || condjump_in_parallel_p (other))
+ && any_condjump_p (other)
&& no_labels_between_p (other, insn)
&& 0 > mostly_true_jump (other,
get_branch_condition (other,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0abc44f..496ecc3 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-09-03 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/23454
+ * g++.dg/opt/pr23454.C: New test.
+
2005-09-03 Mark Mitchell <mark@codesourcery.com>
PR c++/23699
diff --git a/gcc/testsuite/g++.dg/opt/pr23454.C b/gcc/testsuite/g++.dg/opt/pr23454.C
new file mode 100644
index 0000000..ab82b1f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/pr23454.C
@@ -0,0 +1,41 @@
+/* PR rtl-optimization/23454 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+void foo ();
+int a, b;
+char c;
+long long d, e;
+
+static inline int
+bar (const long long s, const long long t)
+{
+ return ((s < t) ? -1 : s > t ? 1 : 0);
+}
+
+int fn ();
+int f;
+
+void
+baz (int x)
+{
+ long long g = fn ();
+ if (f)
+ {
+ b++;
+ return;
+ }
+ if (g == 0)
+ a++;
+ if (x)
+ foo ();
+ if (!c)
+ c = 1;
+ else if (g != 0)
+ {
+ if (bar (g, d) < 0)
+ d = g;
+ if (bar (g, e) > 0)
+ e = g;
+ }
+}