From: Segher Boessenkool Date: Wed, 13 Dec 2017 14:05:57 +0000 (+0100) Subject: combine: Fix PR83393 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2046f23f52d5ed4299f12e5f98a88491e4936c44;p=gcc.git combine: Fix PR83393 In move_deaths we move a REG_DEAD note if the instruction combination has extended the lifetime of a register so that the existing note is no longer valid. We find that note using reg_stat, but what that finds can refer to a later insn. If so, we cannot use the cached value. This patch implements that. PR rtl-optimization/83393 * combine.c (move_deaths): If reg_stat points to a too new insn in last_death, do not use it: find the proper insn instead. gcc/testsuite/ PR rtl-optimization/83393 * gcc.dg/pr83393.c: New testcase. From-SVN: r255606 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9b4829d670a..5d992af7077 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-12-13 Segher Boessenkool + + PR rtl-optimization/83393 + * combine.c (move_deaths): If reg_stat points to a too new insn in + last_death, do not use it: find the proper insn instead. + 2017-12-12 Jeff Law PR tree-optimization/83298 diff --git a/gcc/combine.c b/gcc/combine.c index b6410c3afb0..eb737f64002 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -13880,7 +13880,7 @@ move_deaths (rtx x, rtx maybe_kill_insn, int from_luid, rtx_insn *to_insn, /* If we do not know where the register died, it may still die between FROM_LUID and TO_INSN. If so, find it. This is PR83304. */ - if (!where_dead) + if (!where_dead || DF_INSN_LUID (where_dead) >= DF_INSN_LUID (to_insn)) { rtx_insn *insn = prev_real_insn (to_insn); while (insn diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7159ab9bf47..c5f1d44d2e9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-12-13 Segher Boessenkool + + PR rtl-optimization/83393 + * gcc.dg/pr83393.c: New testcase. + 2017-12-13 Nathan Sidwell PR c++/15272 diff --git a/gcc/testsuite/gcc.dg/pr83393.c b/gcc/testsuite/gcc.dg/pr83393.c new file mode 100644 index 00000000000..a9a6b338e0b --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr83393.c @@ -0,0 +1,38 @@ +/* PR rtl-optimization/83393 */ +/* { dg-do run } */ +/* { dg-options "-O2 -fno-forward-propagate -fno-tree-bit-ccp" } */ + +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned int u32; +typedef unsigned long long u64; + +u32 a, d; +u64 b; +u8 c; + +static u64 __attribute__ ((noinline, noclone)) +foo (u16 f, u64 g) +{ + f <<= 15; + f *= d; + f -= g %= 44; + f <<= f <= g; + c = 255; + c >>= (u8) f == 0; + f *= g; + c -= ~c; + return f + a + b + f; +} + +int +main (void) +{ +#if (__SIZEOF_LONG_LONG__ == 8 && __SIZEOF_INT__ == 4 \ + && __SIZEOF_SHORT__ == 2 && __CHAR_BIT__ == 8) + u64 x = foo (3, 0xE6C0011BBA6DBD7LL); + if (x != 0x1f66e) + __builtin_abort (); +#endif + return 0; +}