Commit 8e1d640f by Thomas Preud'homme Committed by Thomas Preud'homme

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
parent 8194c537
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
......@@ -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, &reg_obstack);
bitmap_initialize (&active_cands, &reg_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
......
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
......
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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment