Fix crit-edge detection logic in CFGInfo analysis
This commit is contained in:
@@ -72,10 +72,12 @@ impl CFGInfo {
|
|||||||
block_entry[block.index()] = ProgPoint::before(f.block_insns(block).first());
|
block_entry[block.index()] = ProgPoint::before(f.block_insns(block).first());
|
||||||
block_exit[block.index()] = ProgPoint::after(f.block_insns(block).last());
|
block_exit[block.index()] = ProgPoint::after(f.block_insns(block).last());
|
||||||
|
|
||||||
if f.block_preds(block).len() > 1 {
|
let preds = f.block_preds(block).len() + if block == f.entry_block() { 1 } else { 0 };
|
||||||
|
if preds > 1 {
|
||||||
for (i, &pred) in f.block_preds(block).iter().enumerate() {
|
for (i, &pred) in f.block_preds(block).iter().enumerate() {
|
||||||
// Check critical edge condition.
|
// Check critical edge condition.
|
||||||
if f.block_succs(pred).len() > 1 {
|
let succs = f.block_succs(pred).len();
|
||||||
|
if succs > 1 {
|
||||||
return Err(RegAllocError::CritEdge(pred, block));
|
return Err(RegAllocError::CritEdge(pred, block));
|
||||||
}
|
}
|
||||||
pred_pos[pred.index()] = i;
|
pred_pos[pred.index()] = i;
|
||||||
|
|||||||
Reference in New Issue
Block a user