re PR rtl-optimization/87761 ([MIPS] New FAIL: gcc.target/mips/fix-r4000-10.c ...
authorJeff Law <law@redhat.com>
Wed, 27 Mar 2019 16:18:06 +0000 (10:18 -0600)
committerJeff Law <law@gcc.gnu.org>
Wed, 27 Mar 2019 16:18:06 +0000 (10:18 -0600)
PR rtl-optimization/87761
PR rtl-optimization/89826
* regcprop.c (copyprop_hardreg_forward_1): Move may_trap_p test
slightly later.
(pass_cprop_hardreg::execute): Call df_analyze after adding the
note problem to get REG_DEAD/REG_UNUSED notes updated.

PR rtl-optimization/87761
PR rtl-optimization/89826
* gcc.c-torture/execute/pr89826.c: New test.

From-SVN: r269967

gcc/ChangeLog
gcc/regcprop.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr89826.c [new file with mode: 0644]

index 07a1333cee03369bd24bedcf490f601d57d88431..f8a353d16c096bab262c87d722dafa3f7e17eb66 100644 (file)
@@ -1,3 +1,13 @@
+2019-03-27  Jeff Law  <law@redhat.com>
+
+
+       PR rtl-optimization/87761
+       PR rtl-optimization/89826
+       * regcprop.c (copyprop_hardreg_forward_1): Move may_trap_p test
+       slightly later.
+       (pass_cprop_hardreg::execute): Call df_analyze after adding the
+       note problem to get REG_DEAD/REG_UNUSED notes updated.
+
 2019-03-27  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/89463
index 8ca523ffe23adba6be1cd3197c3f76e466a21b14..3efe21f377c39f6b8f459dc344b22236ca72b88c 100644 (file)
@@ -800,9 +800,9 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd)
 
       /* Detect obviously dead sets (via REG_UNUSED notes) and remove them.  */
       if (set
-         && !may_trap_p (set)
          && !RTX_FRAME_RELATED_P (insn)
          && INSN_P (insn)
+         && !may_trap_p (set)
          && find_reg_note (insn, REG_UNUSED, SET_DEST (set))
          && !side_effects_p (SET_SRC (set))
          && !side_effects_p (SET_DEST (set)))
@@ -1293,7 +1293,10 @@ pass_cprop_hardreg::execute (function *fun)
   auto_sbitmap visited (last_basic_block_for_fn (fun));
   bitmap_clear (visited);
 
+  /* We need accurate notes.  Earlier passes such as if-conversion may
+     leave notes in an inconsistent state.  */
   df_note_add_problem ();
+  df_analyze ();
 
   /* It is tempting to set DF_LR_RUN_DCE, but DCE may choose to delete
      an insn and this pass would not have visibility into the removal.
index 0679cb72e529d81ab1875d994a640831a7da0f22..b2c649cfb3e970ea2d78086e0a81276760f1892c 100644 (file)
@@ -1,3 +1,9 @@
+2019-03-26  Jeff Law  <law@redhat.com>
+
+       PR rtl-optimization/87761
+       PR rtl-optimization/89826
+       * gcc.c-torture/execute/pr89826.c: New test.
+
 2019-03-27  Richard Biener  <rguenther@suse.de>
 
        * gcc.dg/torture/20190327-1.c: New testcase.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr89826.c b/gcc/testsuite/gcc.c-torture/execute/pr89826.c
new file mode 100644 (file)
index 0000000..0916448
--- /dev/null
@@ -0,0 +1,21 @@
+typedef unsigned int u32;
+typedef unsigned long long u64;
+u64 a;
+u32 b;
+
+u64
+foo (u32 d)
+{
+  a -= d ? 0 : ~a;
+  return a + b;
+}
+
+int
+main (void)
+{
+  u64 x = foo (2);
+  if (x != 0)
+    __builtin_abort();
+  return 0;
+}
+