diff options
author | Bin Cheng <bin.cheng@arm.com> | 2017-01-27 14:42:23 +0000 |
---|---|---|
committer | Bin Cheng <amker@gcc.gnu.org> | 2017-01-27 14:42:23 +0000 |
commit | 3f54004b095d1cd513e63753ee0f8f9f13698347 (patch) | |
tree | ae40843953b1dc70672e14ac10486ab8b3e101a6 | |
parent | f6a24a94a63abf72a349346c0af46426a63aba1a (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/combine.c | 11 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr78559.c | 34 |
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; +} + + + |