aboutsummaryrefslogtreecommitdiff
path: root/gcc/lra-remat.c
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2015-10-30 17:45:16 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2015-10-30 17:45:16 +0000
commit99a04f4fc55931d920a27b0efb61fc46eb96a628 (patch)
tree9c22b56e448db2f38d5dc5d805ffe0412d57fca1 /gcc/lra-remat.c
parentedcc76d5aebb6492ebbfb705b0b7b2c425b804ff (diff)
downloadgcc-99a04f4fc55931d920a27b0efb61fc46eb96a628.zip
gcc-99a04f4fc55931d920a27b0efb61fc46eb96a628.tar.gz
gcc-99a04f4fc55931d920a27b0efb61fc46eb96a628.tar.bz2
re PR rtl-optimization/68106 (c-c++-common/torture/builtin-arith-overflow-11.c FAILs with -flra-remat @ aarch64)
2015-10-30 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/68106 * lra-remat.c (input_regno_present_p): Process hard regs explicitly present in machine description insns. (call_used_input_regno_present_p): Ditto. (calculate_gen_cands): Ditto. (do_remat): Ditto. 2015-10-30 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/68106 * gcc.target/aarch64/pr68106.c: New. From-SVN: r229593
Diffstat (limited to 'gcc/lra-remat.c')
-rw-r--r--gcc/lra-remat.c105
1 files changed, 62 insertions, 43 deletions
diff --git a/gcc/lra-remat.c b/gcc/lra-remat.c
index 7fcdda6..3fbee4b 100644
--- a/gcc/lra-remat.c
+++ b/gcc/lra-remat.c
@@ -695,12 +695,17 @@ calculate_local_reg_remat_bb_data (void)
static bool
input_regno_present_p (rtx_insn *insn, int regno)
{
+ int iter;
lra_insn_recog_data_t id = lra_get_insn_recog_data (insn);
+ struct lra_static_insn_data *static_id = id->insn_static_data;
struct lra_insn_reg *reg;
-
- for (reg = id->regs; reg != NULL; reg = reg->next)
- if (reg->type == OP_IN && reg->regno == regno)
- return true;
+
+ for (iter = 0; iter < 2; iter++)
+ for (reg = (iter == 0 ? id->regs : static_id->hard_regs);
+ reg != NULL;
+ reg = reg->next)
+ if (reg->type == OP_IN && reg->regno == regno)
+ return true;
return false;
}
@@ -708,13 +713,18 @@ input_regno_present_p (rtx_insn *insn, int regno)
static bool
call_used_input_regno_present_p (rtx_insn *insn)
{
+ int iter;
lra_insn_recog_data_t id = lra_get_insn_recog_data (insn);
+ struct lra_static_insn_data *static_id = id->insn_static_data;
struct lra_insn_reg *reg;
- for (reg = id->regs; reg != NULL; reg = reg->next)
- if (reg->type == OP_IN && reg->regno <= FIRST_PSEUDO_REGISTER
- && TEST_HARD_REG_BIT (call_used_reg_set, reg->regno))
- return true;
+ for (iter = 0; iter < 2; iter++)
+ for (reg = (iter == 0 ? id->regs : static_id->hard_regs);
+ reg != NULL;
+ reg = reg->next)
+ if (reg->type == OP_IN && reg->regno <= FIRST_PSEUDO_REGISTER
+ && TEST_HARD_REG_BIT (call_used_reg_set, reg->regno))
+ return true;
return false;
}
@@ -761,11 +771,13 @@ calculate_gen_cands (void)
if (INSN_P (insn))
{
lra_insn_recog_data_t id = lra_get_insn_recog_data (insn);
+ struct lra_static_insn_data *static_id = id->insn_static_data;
struct lra_insn_reg *reg;
unsigned int uid;
bitmap_iterator bi;
cand_t cand;
rtx set;
+ int iter;
int src_regno = -1, dst_regno = -1;
if ((set = single_set (insn)) != NULL
@@ -777,26 +789,29 @@ calculate_gen_cands (void)
/* Update gen_cands: */
bitmap_clear (&temp_bitmap);
- for (reg = id->regs; reg != NULL; reg = reg->next)
- if (reg->type != OP_IN
- || find_regno_note (insn, REG_DEAD, reg->regno) != NULL)
- EXECUTE_IF_SET_IN_BITMAP (&gen_insns, 0, uid, bi)
- {
- rtx_insn *insn2 = lra_insn_recog_data[uid]->insn;
-
- cand = insn_to_cand[INSN_UID (insn2)];
- gcc_assert (cand != NULL);
- /* Ignore the reload insn. */
- if (src_regno == cand->reload_regno
- && dst_regno == cand->regno)
- continue;
- if (cand->regno == reg->regno
- || input_regno_present_p (insn2, reg->regno))
- {
- bitmap_clear_bit (gen_cands, cand->index);
- bitmap_set_bit (&temp_bitmap, uid);
- }
- }
+ for (iter = 0; iter < 2; iter++)
+ for (reg = (iter == 0 ? id->regs : static_id->hard_regs);
+ reg != NULL;
+ reg = reg->next)
+ if (reg->type != OP_IN
+ || find_regno_note (insn, REG_DEAD, reg->regno) != NULL)
+ EXECUTE_IF_SET_IN_BITMAP (&gen_insns, 0, uid, bi)
+ {
+ rtx_insn *insn2 = lra_insn_recog_data[uid]->insn;
+
+ cand = insn_to_cand[INSN_UID (insn2)];
+ gcc_assert (cand != NULL);
+ /* Ignore the reload insn. */
+ if (src_regno == cand->reload_regno
+ && dst_regno == cand->regno)
+ continue;
+ if (cand->regno == reg->regno
+ || input_regno_present_p (insn2, reg->regno))
+ {
+ bitmap_clear_bit (gen_cands, cand->index);
+ bitmap_set_bit (&temp_bitmap, uid);
+ }
+ }
if (CALL_P (insn))
EXECUTE_IF_SET_IN_BITMAP (&gen_insns, 0, uid, bi)
@@ -1070,6 +1085,7 @@ do_remat (void)
unsigned int cid;
bitmap_iterator bi;
rtx set;
+ int iter;
int src_regno = -1, dst_regno = -1;
if ((set = single_set (insn)) != NULL
@@ -1155,21 +1171,24 @@ do_remat (void)
bitmap_clear (&temp_bitmap);
/* Update avail_cands (see analogous code for
calculate_gen_cands). */
- for (reg = id->regs; reg != NULL; reg = reg->next)
- if (reg->type != OP_IN
- || find_regno_note (insn, REG_DEAD, reg->regno) != NULL)
- EXECUTE_IF_SET_IN_BITMAP (&avail_cands, 0, cid, bi)
- {
- cand = all_cands[cid];
-
- /* Ignore the reload insn. */
- if (src_regno == cand->reload_regno
- && dst_regno == cand->regno)
- continue;
- if (cand->regno == reg->regno
- || input_regno_present_p (cand->insn, reg->regno))
- bitmap_set_bit (&temp_bitmap, cand->index);
- }
+ for (iter = 0; iter < 2; iter++)
+ for (reg = (iter == 0 ? id->regs : static_id->hard_regs);
+ reg != NULL;
+ reg = reg->next)
+ if (reg->type != OP_IN
+ || find_regno_note (insn, REG_DEAD, reg->regno) != NULL)
+ EXECUTE_IF_SET_IN_BITMAP (&avail_cands, 0, cid, bi)
+ {
+ cand = all_cands[cid];
+
+ /* Ignore the reload insn. */
+ if (src_regno == cand->reload_regno
+ && dst_regno == cand->regno)
+ continue;
+ if (cand->regno == reg->regno
+ || input_regno_present_p (cand->insn, reg->regno))
+ bitmap_set_bit (&temp_bitmap, cand->index);
+ }
if (CALL_P (insn))
EXECUTE_IF_SET_IN_BITMAP (&avail_cands, 0, cid, bi)