case CLOBBER:
break;
+ default:
+ return NULL_RTX;
+
case SET:
/* We can consider insns having multiple sets, where all
but one are dead as single set insns. In common case
When we reach set first time, we just expect this is
the single set we are looking for and only when more
sets are found in the insn, we check them. */
+ auto unused = [] (const rtx_insn *insn, rtx dest) {
+ if (!df)
+ return false;
+ if (df_note)
+ return !!find_reg_note (insn, REG_UNUSED, dest);
+ return (REG_P (dest)
+ && !HARD_REGISTER_P (dest)
+ && REGNO (dest) < df->regs_inited
+ && DF_REG_USE_COUNT (REGNO (dest)) == 0);
+ };
if (!set_verified)
{
- if (find_reg_note (insn, REG_UNUSED, SET_DEST (set))
- && !side_effects_p (set))
+ if (unused (insn, SET_DEST (set)) && !side_effects_p (set))
set = NULL;
else
set_verified = 1;
}
if (!set)
set = sub, set_verified = 0;
- else if (!find_reg_note (insn, REG_UNUSED, SET_DEST (sub))
- || side_effects_p (sub))
+ else if (!unused (insn, SET_DEST (sub)) || side_effects_p (sub))
return NULL_RTX;
break;
-
- default:
- return NULL_RTX;
}
}
}
--- /dev/null
+/* PR rtl-optimization/121852 */
+/* { dg-do run } */
+/* { dg-options "-O2 -fno-gcse" } */
+
+int a[] = { 0 }, d, e, h, i, j, k, l, n[1], *o = n;
+volatile int m;
+
+int
+foo (char q)
+{
+ return a[e ^ (q & 5)];
+}
+
+int
+bar (int q[])
+{
+ int b = 5;
+ for (int g = 0; g < d; ++g)
+ {
+ int c = foo (q[g] >> 6);
+ int f = (c & 4095) ^ a[c & 5];
+ b = f;
+ }
+ return b;
+}
+
+int
+baz (volatile int q)
+{
+ k = 5 % q;
+ int r[] = { h, i, k, j };
+ return bar (r);
+}
+
+int
+main ()
+{
+ int t;
+ do
+ {
+ if (baz (5))
+ m = 4;
+ l--;
+ t = l - 1 % m + 1;
+ }
+ while (!baz (5));
+ o[0] = 2 % t;
+ return 0;
+}