combine: Fix PR83393
authorSegher Boessenkool <segher@kernel.crashing.org>
Wed, 13 Dec 2017 14:05:57 +0000 (15:05 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Wed, 13 Dec 2017 14:05:57 +0000 (15:05 +0100)
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

gcc/ChangeLog
gcc/combine.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr83393.c [new file with mode: 0644]

index 9b4829d670af114675a1307ea898e0d4ec004a01..5d992af707717846db57593daef91e81337342aa 100644 (file)
@@ -1,3 +1,9 @@
+2017-12-13  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       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  <law@redhat.com>
 
        PR tree-optimization/83298
index b6410c3afb0b96105fce90f15bd95ae69eb09853..eb737f64002cd53abb5b734dab38d2adeb5e87f8 100644 (file)
@@ -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
index 7159ab9bf47ce120913a6f0aca2c40c18692c96b..c5f1d44d2e938e63496e49f37a17d339ee290e97 100644 (file)
@@ -1,3 +1,8 @@
+2017-12-13  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       PR rtl-optimization/83393
+       * gcc.dg/pr83393.c: New testcase.
+
 2017-12-13  Nathan Sidwell  <nathan@acm.org>
 
        PR c++/15272
diff --git a/gcc/testsuite/gcc.dg/pr83393.c b/gcc/testsuite/gcc.dg/pr83393.c
new file mode 100644 (file)
index 0000000..a9a6b33
--- /dev/null
@@ -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;
+}