diff options
author | Thomas Preud'homme <thomas.preudhomme@arm.com> | 2016-12-07 17:56:53 +0000 |
---|---|---|
committer | Thomas Preud'homme <thopre01@gcc.gnu.org> | 2016-12-07 17:56:53 +0000 |
commit | 8e1d640fcdf694fe1d83818b123b550e0da96705 (patch) | |
tree | fd162005580ba4dc0417cb162abdee46df8b1f76 /gcc | |
parent | 8194c537463de4a5e6bd368c1c5fab2fafc40bdf (diff) | |
download | gcc-8e1d640fcdf694fe1d83818b123b550e0da96705.zip gcc-8e1d640fcdf694fe1d83818b123b550e0da96705.tar.gz gcc-8e1d640fcdf694fe1d83818b123b550e0da96705.tar.bz2 |
re PR rtl-optimization/78617 (LRA clobbers live register during rematerialization)
2016-12-07 Thomas Preud'homme <thomas.preudhomme@arm.com>
gcc/
PR rtl-optimization/78617
* lra-remat.c (do_remat): Initialize live_hard_regs from live in
registers, also setting hard registers mapped to pseudo registers.
gcc/testsuite/
PR rtl-optimization/78617
* gcc.c-torture/execute/pr78617.c: New test.
From-SVN: r243374
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/lra-remat.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/pr78617.c | 25 |
4 files changed, 47 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1cf31bc..489ec77 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-12-07 Thomas Preud'homme <thomas.preudhomme@arm.com> + + PR rtl-optimization/78617 + * lra-remat.c (do_remat): Initialize live_hard_regs from live in + registers, also setting hard registers mapped to pseudo registers. + 2016-12-07 David Malcolm <dmalcolm@redhat.com> * cfgexpand.c (pass_expand::execute): Move stack initializations diff --git a/gcc/lra-remat.c b/gcc/lra-remat.c index f01c664..cdd7057 100644 --- a/gcc/lra-remat.c +++ b/gcc/lra-remat.c @@ -1047,6 +1047,7 @@ update_scratch_ops (rtx_insn *remat_insn) static bool do_remat (void) { + unsigned regno; rtx_insn *insn; basic_block bb; bitmap_head avail_cands; @@ -1054,12 +1055,21 @@ do_remat (void) bool changed_p = false; /* Living hard regs and hard registers of living pseudos. */ HARD_REG_SET live_hard_regs; + bitmap_iterator bi; bitmap_initialize (&avail_cands, ®_obstack); bitmap_initialize (&active_cands, ®_obstack); FOR_EACH_BB_FN (bb, cfun) { - REG_SET_TO_HARD_REG_SET (live_hard_regs, df_get_live_out (bb)); + CLEAR_HARD_REG_SET (live_hard_regs); + EXECUTE_IF_SET_IN_BITMAP (df_get_live_in (bb), 0, regno, bi) + { + int hard_regno = regno < FIRST_PSEUDO_REGISTER + ? regno + : reg_renumber[regno]; + if (hard_regno >= 0) + SET_HARD_REG_BIT (live_hard_regs, hard_regno); + } bitmap_and (&avail_cands, &get_remat_bb_data (bb)->avin_cands, &get_remat_bb_data (bb)->livein_cands); /* Activating insns are always in the same block as their corresponding diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6153fe7..71bf506 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-12-07 Thomas Preud'homme <thomas.preudhomme@arm.com> + + PR rtl-optimization/78617 + * gcc.c-torture/execute/pr78617.c: New test. + 2016-12-07 Carl Love <cel@us.ibm.com> * gcc.target/powerpc/builtins-3.c: Move built-in tests for P8 and diff --git a/gcc/testsuite/gcc.c-torture/execute/pr78617.c b/gcc/testsuite/gcc.c-torture/execute/pr78617.c new file mode 100644 index 0000000..89c4f6d --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr78617.c @@ -0,0 +1,25 @@ +int a = 0; +int d = 1; +int f = 1; + +int fn1() { + return a || 1 >> a; +} + +int fn2(int p1, int p2) { + return p2 >= 2 ? p1 : p1 >> 1; +} + +int fn3(int p1) { + return d ^ p1; +} + +int fn4(int p1, int p2) { + return fn3(!d > fn2((f = fn1() - 1000) || p2, p1)); +} + +int main() { + if (fn4(0, 0) != 1) + __builtin_abort (); + return 0; +} |