if ((BB_END (then_bb)
&& JUMP_P (BB_END (then_bb))
&& CROSSING_JUMP_P (BB_END (then_bb)))
- || (BB_END (test_bb)
- && JUMP_P (BB_END (test_bb))
+ || (JUMP_P (BB_END (test_bb))
&& CROSSING_JUMP_P (BB_END (test_bb)))
|| (BB_END (else_bb)
&& JUMP_P (BB_END (else_bb))
&& CROSSING_JUMP_P (BB_END (else_bb))))
return FALSE;
+ /* Verify test_bb ends in a conditional jump with no other side-effects. */
+ if (!onlyjump_p (BB_END (test_bb)))
+ return FALSE;
+
/* THEN has one successor. */
if (!single_succ_p (then_bb))
return FALSE;
if ((BB_END (then_bb)
&& JUMP_P (BB_END (then_bb))
&& CROSSING_JUMP_P (BB_END (then_bb)))
- || (BB_END (test_bb)
- && JUMP_P (BB_END (test_bb))
+ || (JUMP_P (BB_END (test_bb))
&& CROSSING_JUMP_P (BB_END (test_bb)))
|| (BB_END (else_bb)
&& JUMP_P (BB_END (else_bb))
&& CROSSING_JUMP_P (BB_END (else_bb))))
return FALSE;
+ /* Verify test_bb ends in a conditional jump with no other side-effects. */
+ if (!onlyjump_p (BB_END (test_bb)))
+ return FALSE;
+
/* ELSE has one successor. */
if (!single_succ_p (else_bb))
return FALSE;
--- /dev/null
+/* PR rtl-optimization/104814 */
+
+short a = 0;
+static long b = 0;
+int c = 7;
+char d = 0;
+short *e = &a;
+long f = 0;
+
+unsigned long
+foo (unsigned long h, long j)
+{
+ return j == 0 ? h : h / j;
+}
+
+int
+main ()
+{
+ long k = f;
+ for (; c; --c)
+ {
+ for (int i = 0; i < 7; ++i)
+ ;
+ long m = foo (f, --b);
+ d = ((char) m | *e) <= 43165;
+ }
+ if (b != -7)
+ __builtin_abort ();
+ return 0;
+}