Commit cf3d5824 by Sergey Grechanik Committed by Alexander Monakov

sel-sched-ir.h (register_unavailable_p): Declare.

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.

From-SVN: r177654
parent 944499ed
2011-08-11 Sergey Grechanik <mouseentity@ispras.ru> 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.
2011-08-11 Sergey Grechanik <mouseentity@ispras.ru>
* sel-sched.c (verify_target_availability): Fix usage of * sel-sched.c (verify_target_availability): Fix usage of
hard_regno_nregs. hard_regno_nregs.
......
...@@ -1883,7 +1883,7 @@ set_unavailable_target_for_expr (expr_t expr, regset lv_set) ...@@ -1883,7 +1883,7 @@ set_unavailable_target_for_expr (expr_t expr, regset lv_set)
if (EXPR_SEPARABLE_P (expr)) if (EXPR_SEPARABLE_P (expr))
{ {
if (REG_P (EXPR_LHS (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 /* 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 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) ...@@ -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 miss a unifying code motion along both branches using a renamed
register, but it won't affect a code correctness since upon register, but it won't affect a code correctness since upon
an actual code motion a bookkeeping code would be generated. */ an actual code motion a bookkeeping code would be generated. */
if (bitmap_bit_p (VINSN_REG_USES (EXPR_VINSN (expr)), if (register_unavailable_p (VINSN_REG_USES (EXPR_VINSN (expr)),
REGNO (EXPR_LHS (expr)))) EXPR_LHS (expr)))
EXPR_TARGET_AVAILABLE (expr) = -1; EXPR_TARGET_AVAILABLE (expr) = -1;
else else
EXPR_TARGET_AVAILABLE (expr) = false; EXPR_TARGET_AVAILABLE (expr) = false;
...@@ -1971,8 +1971,8 @@ speculate_expr (expr_t expr, ds_t ds) ...@@ -1971,8 +1971,8 @@ speculate_expr (expr_t expr, ds_t ds)
/* Do not allow clobbering the address register of speculative /* Do not allow clobbering the address register of speculative
insns. */ insns. */
if (bitmap_bit_p (VINSN_REG_USES (EXPR_VINSN (expr)), if (register_unavailable_p (VINSN_REG_USES (EXPR_VINSN (expr)),
expr_dest_regno (expr))) expr_dest_reg (expr)))
{ {
EXPR_TARGET_AVAILABLE (expr) = false; EXPR_TARGET_AVAILABLE (expr) = false;
return 2; return 2;
...@@ -2026,6 +2026,25 @@ mark_unavailable_targets (av_set_t join_set, av_set_t av_set, regset lv_set) ...@@ -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. */ /* Av set functions. */
/* Add a new element to av set SETP. /* Add a new element to av set SETP.
......
...@@ -1573,6 +1573,7 @@ extern void sel_init_global_and_expr (bb_vec_t); ...@@ -1573,6 +1573,7 @@ extern void sel_init_global_and_expr (bb_vec_t);
extern void sel_finish_global_and_expr (void); extern void sel_finish_global_and_expr (void);
extern regset compute_live (insn_t); extern regset compute_live (insn_t);
extern bool register_unavailable_p (regset, rtx);
/* Dependence analysis functions. */ /* Dependence analysis functions. */
extern void sel_clear_has_dependence (void); extern void sel_clear_has_dependence (void);
......
...@@ -794,8 +794,8 @@ substitute_reg_in_expr (expr_t expr, insn_t insn, bool undo) ...@@ -794,8 +794,8 @@ substitute_reg_in_expr (expr_t expr, insn_t insn, bool undo)
/* Do not allow clobbering the address register of speculative /* Do not allow clobbering the address register of speculative
insns. */ insns. */
if ((EXPR_SPEC_DONE_DS (expr) & SPECULATIVE) if ((EXPR_SPEC_DONE_DS (expr) & SPECULATIVE)
&& bitmap_bit_p (VINSN_REG_USES (EXPR_VINSN (expr)), && register_unavailable_p (VINSN_REG_USES (EXPR_VINSN (expr)),
expr_dest_regno (expr))) expr_dest_reg (expr)))
EXPR_TARGET_AVAILABLE (expr) = false; EXPR_TARGET_AVAILABLE (expr) = false;
return true; return true;
...@@ -3631,12 +3631,12 @@ av_set_could_be_blocked_by_bookkeeping_p (av_set_t orig_ops, void *static_params ...@@ -3631,12 +3631,12 @@ av_set_could_be_blocked_by_bookkeeping_p (av_set_t orig_ops, void *static_params
renaming. Check with the right register instead. */ renaming. Check with the right register instead. */
if (sparams->dest && REG_P (sparams->dest)) if (sparams->dest && REG_P (sparams->dest))
{ {
unsigned regno = REGNO (sparams->dest); rtx reg = sparams->dest;
vinsn_t failed_vinsn = INSN_VINSN (sparams->failed_insn); vinsn_t failed_vinsn = INSN_VINSN (sparams->failed_insn);
if (bitmap_bit_p (VINSN_REG_SETS (failed_vinsn), regno) if (register_unavailable_p (VINSN_REG_SETS (failed_vinsn), reg)
|| bitmap_bit_p (VINSN_REG_USES (failed_vinsn), regno) || register_unavailable_p (VINSN_REG_USES (failed_vinsn), reg)
|| bitmap_bit_p (VINSN_REG_CLOBBERS (failed_vinsn), regno)) || register_unavailable_p (VINSN_REG_CLOBBERS (failed_vinsn), reg))
return true; return true;
} }
......
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