aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBin Cheng <bin.cheng@arm.com>2017-01-27 14:42:23 +0000
committerBin Cheng <amker@gcc.gnu.org>2017-01-27 14:42:23 +0000
commit3f54004b095d1cd513e63753ee0f8f9f13698347 (patch)
treeae40843953b1dc70672e14ac10486ab8b3e101a6
parentf6a24a94a63abf72a349346c0af46426a63aba1a (diff)
downloadgcc-3f54004b095d1cd513e63753ee0f8f9f13698347.zip
gcc-3f54004b095d1cd513e63753ee0f8f9f13698347.tar.gz
gcc-3f54004b095d1cd513e63753ee0f8f9f13698347.tar.bz2
re PR rtl-optimization/78559 (wrong code due to tree if-conversion?)
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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/combine.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr78559.c34
4 files changed, 55 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0a55378..b70acef 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/combine.c b/gcc/combine.c
index c643a0e..727299b 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -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);
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e3ad4ca..2dce32e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..8d7b8e3
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr78559.c
@@ -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;
+}
+
+
+