+2016-11-30 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR tree-optimization/77856
+ * lra-constraints.c (inherit_in_ebb): Check original regno for
+ invalid invariant regs too. Set only clobbered hard regs for the
+ invalid invariant regs.
+
2016-11-30 Pitchumani Sivanupandi <pitchumani.sivanupandi@microchip.com>
Commit files forgotten in r242966.
&& dst_regno >= lra_constraint_new_regno_start
&& invariant_p (SET_SRC (curr_set))
&& (cl = lra_get_allocno_class (dst_regno)) != NO_REGS
- && ! bitmap_bit_p (&invalid_invariant_regs, dst_regno))
+ && ! bitmap_bit_p (&invalid_invariant_regs, dst_regno)
+ && ! bitmap_bit_p (&invalid_invariant_regs,
+ ORIGINAL_REGNO(regno_reg_rtx[dst_regno])))
{
/* 'reload_pseudo <- invariant'. */
if (ira_class_hard_regs_num[cl] <= max_small_class_regs_num)
curr_id = lra_get_insn_recog_data (curr_insn);
for (reg = curr_id->regs; reg != NULL; reg = reg->next)
if (reg->type != OP_IN)
- bitmap_set_bit (&invalid_invariant_regs, reg->regno);
+ {
+ bitmap_set_bit (&invalid_invariant_regs, reg->regno);
+ bitmap_set_bit (&invalid_invariant_regs,
+ ORIGINAL_REGNO (regno_reg_rtx[reg->regno]));
+ }
curr_static_id = curr_id->insn_static_data;
for (reg = curr_static_id->hard_regs; reg != NULL; reg = reg->next)
if (reg->type != OP_IN)
bitmap_set_bit (&invalid_invariant_regs, reg->regno);
if (curr_id->arg_hard_regs != NULL)
for (i = 0; (regno = curr_id->arg_hard_regs[i]) >= 0; i++)
+ if (regno >= FIRST_PSEUDO_REGISTER)
bitmap_set_bit (&invalid_invariant_regs,
- regno >= FIRST_PSEUDO_REGISTER
- ? regno : regno - FIRST_PSEUDO_REGISTER);
+ regno - FIRST_PSEUDO_REGISTER);
}
/* We reached the start of the current basic block. */
if (prev_insn == NULL_RTX || prev_insn == PREV_INSN (head)
--- /dev/null
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+extern void abort (void);
+
+unsigned a, e;
+
+struct S0
+{
+ int f1;
+ int f8;
+} c = {4, 6};
+
+int b, f, g, h, i, j, l, p;
+short d, o = -7;
+char k, n = 5;
+
+unsigned fn1 (int p1, int p2)
+{
+ return p2 >= 2 || p1 >> p2 ? p1 : p1 << p2;
+}
+
+static short fn2 (struct S0 p1)
+{
+ int *q = 0;
+ int r = 7;
+ if (!a)
+ {
+ c.f1 = 1;
+ for (; c.f1; c.f1--)
+ if (fn1 (10 != 0, p1.f8))
+ {
+ short s = 9 << ~o % (d ^ n);
+ int t = s >> h % ~d;
+ p = r;
+ r = s | p * (d && 9) | t;
+ int u = i & c.f1;
+ unsigned v = ~(~(u & h) | (~(8 >> c.f1) & i));
+ int w = v;
+ if (u < 9)
+ w = c.f1;
+ if (i > h && u)
+ {
+ __builtin_printf ("%d\n", c.f1);
+ continue;
+ }
+ c.f1 = w;
+ if (!p)
+ continue;
+ return 0;
+ }
+ for (;;)
+ *q = 0;
+ }
+ return 0;
+}
+
+static void fn3 ()
+{
+ fn2 (c);
+ l = c.f1 < b;
+ if (l)
+ {
+ L1:
+ e = l | j / e % ~f;
+ j = f - 4 % k < c.f1 / e / b - j - 1;
+ if (l)
+ {
+ __builtin_printf ("%d\n", b);
+ goto L1;
+ }
+ int m[245];
+ g = m[2];
+ }
+}
+
+int main ()
+{
+ fn3 ();
+ if (c.f1 != 1)
+ abort ();
+ return 0;
+}