@@ -2199,6 +2199,13 @@ expand_cbranchdi4 (rtx *operands, enum r
{
operands[1] = op1h;
operands[2] = op2h;
+ if (reload_completed
+ && ! arith_reg_or_0_operand (op2h, SImode)
+ && (true_regnum (op1h) || (comparison != EQ && comparison != NE)))
+ {
+ emit_move_insn (scratch, operands[2]);
+ operands[2] = scratch;
+ }
}
operands[3] = skip_label = gen_label_rtx ();
@@ -0,0 +1,18 @@
+/* PR target/49238 */
+extern int bar (void);
+
+void
+foo (unsigned long long a, int b)
+{
+ int i;
+
+ if (b)
+ for (a = -12; a >= 10; a = bar ())
+ break;
+ else
+ return;
+
+ for (i = 0; i < 10; i += 10)
+ if ((i == bar ()) | (bar () >= a))
+ bar ();
+}