Commit d0aca6ab by Andrey Belevantsev Committed by Jeff Law

re PR rtl-optimization/69307 (wrong code with -O2 -fselective-scheduling @ armv7a)

	PR rtl-optimization/69307
	* sel-sched.c (choose_best_pseudo_reg): Properly check for hard
	registers in modes that span more than one register.

	PR rtl-optimization/69307
	* gcc.dg/pr69307.c: New test.

From-SVN: r234163
parent cefe08a4
2016-03-12 Andrey Belevantsev <abel@ispras.ru>
PR rtl-optimization/69307
* sel-sched.c (choose_best_pseudo_reg): Properly check for hard
registers in modes that span more than one register.
2016-03-12 Vladimir Makarov <vmakarov@redhat.com> 2016-03-12 Vladimir Makarov <vmakarov@redhat.com>
PR target/69614 PR target/69614
......
...@@ -1457,31 +1457,44 @@ choose_best_pseudo_reg (regset used_regs, ...@@ -1457,31 +1457,44 @@ choose_best_pseudo_reg (regset used_regs,
gcc_assert (mode == GET_MODE (dest)); gcc_assert (mode == GET_MODE (dest));
orig_regno = REGNO (dest); orig_regno = REGNO (dest);
if (!REGNO_REG_SET_P (used_regs, orig_regno)) /* Check that nothing in used_regs intersects with orig_regno. When
{ we have a hard reg here, still loop over hard_regno_nregs. */
if (orig_regno < FIRST_PSEUDO_REGISTER) if (HARD_REGISTER_NUM_P (orig_regno))
{ {
gcc_assert (df_regs_ever_live_p (orig_regno)); int j, n;
for (j = 0, n = hard_regno_nregs[orig_regno][mode]; j < n; j++)
if (REGNO_REG_SET_P (used_regs, orig_regno + j))
break;
if (j < n)
continue;
}
else
{
if (REGNO_REG_SET_P (used_regs, orig_regno))
continue;
}
if (HARD_REGISTER_NUM_P (orig_regno))
{
gcc_assert (df_regs_ever_live_p (orig_regno));
/* For hard registers, we have to check hardware imposed /* For hard registers, we have to check hardware imposed
limitations (frame/stack registers, calls crossed). */ limitations (frame/stack registers, calls crossed). */
if (!TEST_HARD_REG_BIT (reg_rename_p->unavailable_hard_regs, if (!TEST_HARD_REG_BIT (reg_rename_p->unavailable_hard_regs,
orig_regno)) orig_regno))
{ {
/* Don't let register cross a call if it doesn't already /* Don't let register cross a call if it doesn't already
cross one. This condition is written in accordance with cross one. This condition is written in accordance with
that in sched-deps.c sched_analyze_reg(). */ that in sched-deps.c sched_analyze_reg(). */
if (!reg_rename_p->crosses_call if (!reg_rename_p->crosses_call
|| REG_N_CALLS_CROSSED (orig_regno) > 0) || REG_N_CALLS_CROSSED (orig_regno) > 0)
return gen_rtx_REG (mode, orig_regno); return gen_rtx_REG (mode, orig_regno);
} }
bad_hard_regs = true; bad_hard_regs = true;
} }
else else
return dest; return dest;
} }
}
*is_orig_reg_p_ptr = false; *is_orig_reg_p_ptr = false;
......
2016-03-12 Andrey Belevantsev <abel@ispras.ru>
PR rtl-optimization/69307
* gcc.dg/pr69307.c: New test.
2016-03-12 Vladimir Makarov <vmakarov@redhat.com> 2016-03-12 Vladimir Makarov <vmakarov@redhat.com>
PR target/69614 PR target/69614
......
/* { dg-do run } */
/* { dg-options "-O2 -fselective-scheduling2" } */
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long long int uint64_t;
typedef uint8_t u8;
typedef uint16_t u16;
typedef uint32_t u32;
typedef uint64_t u64;
u64 __attribute__((noinline, noclone))
foo(u8 u8_0, u16 u16_0, u32 u32_0, u64 u64_0, u8 u8_1, u16 u16_1, u32 u32_1, u64 u64_1, u8 u8_2, u16 u16_2, u32 u32_2, u64 u64_2, u8 u8_3, u16 u16_3, u32 u32_3, u64 u64_3)
{
u8 *p8_2 = &u8_2;
u16 *p16_2 = &u16_2;
u8 *p8_3 = &u8_3;
u64 *p64_3 = &u64_3;
p8_2 = &u8_3;
*p8_3 -= *p64_3;
*p8_2 = (u64)*p8_2 % ((u64)*p8_2 | 3);
u8_2 = (u64)u8_2 / ((u64)*p16_2 | 1);
u16_0 = (u64)u16_0 % ((u64)*p8_2 | 3);
return u8_0 + u16_0 + u32_0 + u64_0 + u8_1 + u16_1 + u32_1 + u64_1 + u8_2 + u16_2 + u32_2 + u64_2 + u8_3 + u16_3 + u32_3 + u64_3;
}
int main()
{
u64 x = 0;
x += foo(3llu, 6llu, 15llu, 28llu, 5llu, 11llu, 20llu, 44llu, 7llu, 10llu, 20llu, 55llu, 0llu, 9llu, 17llu, 48llu);
if (x != 0x1f3)
__builtin_abort();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment