re PR rtl-optimization/78559 (wrong code due to tree if-conversion?)
authorBin Cheng <bin.cheng@arm.com>
Fri, 27 Jan 2017 14:42:23 +0000 (14:42 +0000)
committerBin Cheng <amker@gcc.gnu.org>
Fri, 27 Jan 2017 14:42:23 +0000 (14:42 +0000)
PR rtl-optimization/78559
* combine.c (try_combine): Discard REG_EQUAL and REG_EQUIV for
other_insn in combine.

gcc/testsuite
PR rtl-optimization/78559
* gcc.c-torture/execute/pr78559.c: New test.

From-SVN: r244979

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

index 0a553789ccd3629f36c10e5ace5b5275696fd0c2..b70acef6953e1a8d867a5a949f7bc0bb8a6ac6e4 100644 (file)
@@ -1,3 +1,9 @@
+2017-01-27  Bin Cheng  <bin.cheng@arm.com>
+
+       PR rtl-optimization/78559
+       * combine.c (try_combine): Discard REG_EQUAL and REG_EQUIV for
+       other_insn in combine.
+
 2017-01-27  Pekka Jääskeläinen  <pekka.jaaskelainen@parmance.com>
 
        * builtin-types.def: Use unsigned_char_type_node for BT_UINT8.  Use
index c643a0eb28fef30ae44158e0fe43def8c95040b1..727299bdf501d8cf0a9d1d9d5ea1d0df677b89d9 100644 (file)
@@ -4148,7 +4148,16 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
                                     PATTERN (undobuf.other_insn)))
              ||(REG_NOTE_KIND (note) == REG_UNUSED
                 && !reg_set_p (XEXP (note, 0),
-                               PATTERN (undobuf.other_insn))))
+                               PATTERN (undobuf.other_insn)))
+             /* Simply drop equal note since it may be no longer valid
+                for other_insn.  It may be possible to record that CC
+                register is changed and only discard those notes, but
+                in practice it's unnecessary complication and doesn't
+                give any meaningful improvement.
+
+                See PR78559.  */
+             || REG_NOTE_KIND (note) == REG_EQUAL
+             || REG_NOTE_KIND (note) == REG_EQUIV)
            remove_note (undobuf.other_insn, note);
        }
 
index e3ad4caca2bef27ec162ab2aef225b5e66c16839..2dce32ecd59377fc295881a4e092e2ef53e7dfff 100644 (file)
@@ -1,3 +1,8 @@
+2017-01-27  Bin Cheng  <bin.cheng@arm.com>
+
+       PR rtl-optimization/78559
+       * gcc.c-torture/execute/pr78559.c: New test.
+
 2017-01-27  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/79245
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr78559.c b/gcc/testsuite/gcc.c-torture/execute/pr78559.c
new file mode 100644 (file)
index 0000000..8d7b8e3
--- /dev/null
@@ -0,0 +1,34 @@
+/* PR rtl-optimization/78559 */
+
+int g = 20;
+int d = 0;
+
+short
+fn2 (int p1, int p2)
+{
+  return p2 >= 2 || 5 >> p2 ? p1 : p1 << p2;
+}
+
+int
+main ()
+{
+  int result = 0;
+lbl_2582:
+  if (g)
+    {
+      for (int c = -3; c; c++)
+        result = fn2 (1, g);
+    }
+  else
+    {
+      for (int i = 0; i < 2; i += 2)
+        if (d)
+          goto lbl_2582;
+    }
+  if (result != 1)
+    __builtin_abort ();
+  return 0;
+}
+
+
+