diff options
author | Steven Bosscher <steven@gcc.gnu.org> | 2012-08-08 06:29:12 +0000 |
---|---|---|
committer | Steven Bosscher <steven@gcc.gnu.org> | 2012-08-08 06:29:12 +0000 |
commit | cee784f5fb2330dfca9b64f4ae8c5d707b00ac7c (patch) | |
tree | 85ff7b9a2224e6cc10cb44bcc6599cb4bdc69a5b /gcc/ira.c | |
parent | 985e963f0c0bda074b9b71e3f443297452eee372 (diff) | |
download | gcc-cee784f5fb2330dfca9b64f4ae8c5d707b00ac7c.zip gcc-cee784f5fb2330dfca9b64f4ae8c5d707b00ac7c.tar.gz gcc-cee784f5fb2330dfca9b64f4ae8c5d707b00ac7c.tar.bz2 |
re PR middle-end/54146 (Very slow compile with attribute((flatten)))
PR middle-end/54146
* ira.c (init_live_subregs): Take live_subregs_used as a bitmap.
(build_insn_chain): Make live_subregs_used a bitmap.
Use SBITMAP_SIZE to ignore the paradoxical bytes of subregs.
Use sbitmap_free to free the live_subreg sbitmaps.
From-SVN: r190223
Diffstat (limited to 'gcc/ira.c')
-rw-r--r-- | gcc/ira.c | 39 |
1 files changed, 19 insertions, 20 deletions
@@ -3251,7 +3251,7 @@ pseudo_for_reload_consideration_p (int regno) initialization. ALLOCNUM need not be the regno of REG. */ static void init_live_subregs (bool init_value, sbitmap *live_subregs, - int *live_subregs_used, int allocnum, rtx reg) + bitmap live_subregs_used, int allocnum, rtx reg) { unsigned int regno = REGNO (SUBREG_REG (reg)); int size = GET_MODE_SIZE (GET_MODE (regno_reg_rtx[regno])); @@ -3259,10 +3259,10 @@ init_live_subregs (bool init_value, sbitmap *live_subregs, gcc_assert (size > 0); /* Been there, done that. */ - if (live_subregs_used[allocnum]) + if (bitmap_bit_p (live_subregs_used, allocnum)) return; - /* Create a new one with zeros. */ + /* Create a new one. */ if (live_subregs[allocnum] == NULL) live_subregs[allocnum] = sbitmap_alloc (size); @@ -3273,8 +3273,7 @@ init_live_subregs (bool init_value, sbitmap *live_subregs, else sbitmap_zero (live_subregs[allocnum]); - /* Set the number of bits that we really want. */ - live_subregs_used[allocnum] = size; + bitmap_set_bit (live_subregs_used, allocnum); } /* Walk the insns of the current function and build reload_insn_chain, @@ -3293,11 +3292,11 @@ build_insn_chain (void) which hardregs are live in multiword pseudos. live_subregs and live_subregs_used are indexed by pseudo number. The live_subreg entry for a particular pseudo is only used if the corresponding - element is non zero in live_subregs_used. The value in - live_subregs_used is number of bytes that the pseudo can + element is non zero in live_subregs_used. The sbitmap size of + live_subreg[allocno] is number of bytes that the pseudo can occupy. */ sbitmap *live_subregs = XCNEWVEC (sbitmap, max_regno); - int *live_subregs_used = XNEWVEC (int, max_regno); + bitmap live_subregs_used = BITMAP_ALLOC (NULL); for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) if (TEST_HARD_REG_BIT (eliminable_regset, i)) @@ -3308,7 +3307,7 @@ build_insn_chain (void) rtx insn; CLEAR_REG_SET (live_relevant_regs); - memset (live_subregs_used, 0, max_regno * sizeof (int)); + bitmap_clear (live_subregs_used); EXECUTE_IF_SET_IN_BITMAP (DF_LR_OUT (bb), 0, i, bi) { @@ -3393,8 +3392,8 @@ build_insn_chain (void) } /* Ignore the paradoxical bits. */ - if ((int)last > live_subregs_used[regno]) - last = live_subregs_used[regno]; + if (last > SBITMAP_SIZE (live_subregs[regno])) + last = SBITMAP_SIZE (live_subregs[regno]); while (start < last) { @@ -3404,7 +3403,7 @@ build_insn_chain (void) if (sbitmap_empty_p (live_subregs[regno])) { - live_subregs_used[regno] = 0; + bitmap_clear_bit (live_subregs_used, regno); bitmap_clear_bit (live_relevant_regs, regno); } else @@ -3422,8 +3421,8 @@ build_insn_chain (void) modeling the def as a killing def. */ if (!DF_REF_FLAGS_IS_SET (def, DF_REF_PARTIAL)) { + bitmap_clear_bit (live_subregs_used, regno); bitmap_clear_bit (live_relevant_regs, regno); - live_subregs_used[regno] = 0; } } } @@ -3479,8 +3478,8 @@ build_insn_chain (void) live_subregs, live_subregs_used, regno, reg); /* Ignore the paradoxical bits. */ - if ((int)last > live_subregs_used[regno]) - last = live_subregs_used[regno]; + if (last > SBITMAP_SIZE (live_subregs[regno])) + last = SBITMAP_SIZE (live_subregs[regno]); while (start < last) { @@ -3493,7 +3492,7 @@ build_insn_chain (void) effectively saying do not use the subregs because we are reading the whole pseudo. */ - live_subregs_used[regno] = 0; + bitmap_clear_bit (live_subregs_used, regno); bitmap_set_bit (live_relevant_regs, regno); } } @@ -3536,14 +3535,14 @@ build_insn_chain (void) } } - for (i = 0; i < (unsigned int) max_regno; i++) - free (live_subregs[i]); - reload_insn_chain = c; *p = NULL; + for (i = 0; i < (unsigned int) max_regno; i++) + if (live_subregs[i] != NULL) + sbitmap_free (live_subregs[i]); free (live_subregs); - free (live_subregs_used); + BITMAP_FREE (live_subregs_used); BITMAP_FREE (live_relevant_regs); BITMAP_FREE (elim_regset); |