re PR tree-optimization/77856 (wrong code at -O2 on x86_64-linux-gnu in 32-bit mode)

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  Vladimir Makarov  <vmakarov@redhat.com>

	PR tree-optimization/77856
	* gcc.target/i386.c (pr77856.c): New.

From-SVN: r243038
This commit is contained in:
Vladimir Makarov 2016-11-30 17:35:40 +00:00 committed by Vladimir Makarov
parent de683d58cf
commit f7abdf36e5
4 changed files with 105 additions and 4 deletions

View File

@ -1,3 +1,10 @@
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.

View File

@ -5888,7 +5888,9 @@ inherit_in_ebb (rtx_insn *head, rtx_insn *tail)
&& 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)
@ -6159,16 +6161,20 @@ inherit_in_ebb (rtx_insn *head, rtx_insn *tail)
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)

View File

@ -1,3 +1,8 @@
2016-11-30 Vladimir Makarov <vmakarov@redhat.com>
PR tree-optimization/77856
* gcc.target/i386.c (pr77856.c): New.
2016-11-30 David Edelsohn <dje.gcc@gmail.com>
* g++.dg/debug/dwarf2/ptrdmem-1.C: Don't XFAIL scan-assembler-not on AIX.

View File

@ -0,0 +1,83 @@
/* { 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;
}