diff options
author | Sergey Grechanik <mouseentity@ispras.ru> | 2011-08-11 11:48:07 +0000 |
---|---|---|
committer | Alexander Monakov <amonakov@ispras.ru> | 2011-08-11 11:48:07 +0000 |
commit | cb817c235963bab4c52caf77a966891a09dc3fdf (patch) | |
tree | 9d57a3785185bcda20a54547abd30689a33358ab /gcc/sel-sched-ir.c | |
parent | 4dcc66a787cfc877fbbe864ad4fff4cfe66405d9 (diff) |
2011-08-11 Sergey Grechanik <mouseentity@ispras.ru>
* sel-sched-ir.h (register_unavailable_p): Declare.
* sel-sched-ir.c (register_unavailable_p): New. Use it...
(set_unavailable_target_for_expr): ... here to properly test
availability of a register.
(speculate_expr): Ditto.
* sel-sched.c (substitute_reg_in_expr): Ditto.
(av_set_could_be_blocked_by_bookkeeping_p): Ditto.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@177654 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/sel-sched-ir.c')
-rw-r--r-- | gcc/sel-sched-ir.c | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c index 1e6e55e6632..58aec1190f6 100644 --- a/gcc/sel-sched-ir.c +++ b/gcc/sel-sched-ir.c @@ -1883,7 +1883,7 @@ set_unavailable_target_for_expr (expr_t expr, regset lv_set) if (EXPR_SEPARABLE_P (expr)) { if (REG_P (EXPR_LHS (expr)) - && bitmap_bit_p (lv_set, REGNO (EXPR_LHS (expr)))) + && register_unavailable_p (lv_set, EXPR_LHS (expr))) { /* If it's an insn like r1 = use (r1, ...), and it exists in different forms in each of the av_sets being merged, we can't say @@ -1904,8 +1904,8 @@ set_unavailable_target_for_expr (expr_t expr, regset lv_set) miss a unifying code motion along both branches using a renamed register, but it won't affect a code correctness since upon an actual code motion a bookkeeping code would be generated. */ - if (bitmap_bit_p (VINSN_REG_USES (EXPR_VINSN (expr)), - REGNO (EXPR_LHS (expr)))) + if (register_unavailable_p (VINSN_REG_USES (EXPR_VINSN (expr)), + EXPR_LHS (expr))) EXPR_TARGET_AVAILABLE (expr) = -1; else EXPR_TARGET_AVAILABLE (expr) = false; @@ -1971,8 +1971,8 @@ speculate_expr (expr_t expr, ds_t ds) /* Do not allow clobbering the address register of speculative insns. */ - if (bitmap_bit_p (VINSN_REG_USES (EXPR_VINSN (expr)), - expr_dest_regno (expr))) + if (register_unavailable_p (VINSN_REG_USES (EXPR_VINSN (expr)), + expr_dest_reg (expr))) { EXPR_TARGET_AVAILABLE (expr) = false; return 2; @@ -2026,6 +2026,25 @@ mark_unavailable_targets (av_set_t join_set, av_set_t av_set, regset lv_set) } +/* Returns true if REG (at least partially) is present in REGS. */ +bool +register_unavailable_p (regset regs, rtx reg) +{ + unsigned regno, end_regno; + + regno = REGNO (reg); + if (bitmap_bit_p (regs, regno)) + return true; + + end_regno = END_REGNO (reg); + + while (++regno < end_regno) + if (bitmap_bit_p (regs, regno)) + return true; + + return false; +} + /* Av set functions. */ /* Add a new element to av set SETP. |