re PR ipa/66424 (wrong code at -O2 and -O3 on x86_64-linux-gnu in 32-bit mode)

2015-07-21  Vladimir Makarov  <vmakarov@redhat.com>

	PR ipa/66424.
	* lra-remat.c (operand_to_remat): Prevent using insns with input
	subregs processed separately by IRA.

2015-07-21  Vladimir Makarov  <vmakarov@redhat.com>

	PR ipa/66424.
	* gcc.target/i386/pr66424.c: New.

From-SVN: r226053
This commit is contained in:
Vladimir Makarov 2015-07-21 19:54:23 +00:00 committed by Vladimir Makarov
parent f9ffade09c
commit 6998b929fa
4 changed files with 72 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2015-07-21 Vladimir Makarov <vmakarov@redhat.com>
PR ipa/66424.
* lra-remat.c (operand_to_remat): Prevent using insns with input
subregs processed separately by IRA.
2015-07-21 Andrew MacLeod <amacleod@redhat.com>
* ssa-iterators.h (has_zero_uses, has_single_use): Implement as

View File

@ -417,6 +417,16 @@ operand_to_remat (rtx_insn *insn)
return -1;
found_reg = reg;
}
/* IRA calculates conflicts separately for subregs of two words
pseudo. Even if the pseudo lives, e.g. one its subreg can be
used lately, another subreg hard register can be already used
for something else. In such case, it is not safe to
rematerialize the insn. */
else if (reg->type == OP_IN && reg->subreg_p
&& reg->regno >= FIRST_PSEUDO_REGISTER
&& (GET_MODE_SIZE (PSEUDO_REGNO_MODE (reg->regno))
== 2 * UNITS_PER_WORD))
return -1;
if (found_reg == NULL)
return -1;
if (found_reg->regno < FIRST_PSEUDO_REGISTER)

View File

@ -1,3 +1,8 @@
2015-07-21 Vladimir Makarov <vmakarov@redhat.com>
PR ipa/66424.
* gcc.target/i386/pr66424.c: New.
2015-07-21 Alex Velenko <Alex.Velenko@arm.com>
* gcc.target/arm/thumb-bitfld1.c (foo): Add explicit return type.

View File

@ -0,0 +1,51 @@
/* { dg-do run } */
/* { dg-options "-O2" } */
/* { dg-require-effective-target ia32 } */
int a, b, c, d, e[2], f, l, m, n, o;
long long g = 1, j;
static unsigned int h;
static int i, k;
void
fn1 (long long p)
{
int q = p;
f = 1 ^ e[f ^ (q & 1)];
}
static void
fn2 (long long p)
{
f = 1 ^ e[(f ^ 1) & 1];
fn1 (p >> 1 & 1);
fn1 (p >> 32 & 1);
}
void
fn3 (int p)
{
g |= j = p;
}
int
main ()
{
e[0] = 1;
char p = l;
h = --g;
i = o = c;
m = d ? 1 / d : 0;
fn3 (l || 0);
b = a;
n = j++;
k--;
fn2 (g);
fn2 (h);
fn2 (i);
if (k + f)
__builtin_abort ();
return 0;
}