Return use domtree.dominates in temporal_order
This commit is contained in:
parent
7c4debdb7c
commit
d6c2db2aea
1 changed files with 23 additions and 26 deletions
|
@ -182,7 +182,7 @@ pub(super) fn optimize_function(
|
||||||
let store_ebb = opt_ctx.ctx.func.layout.inst_ebb(store).unwrap();
|
let store_ebb = opt_ctx.ctx.func.layout.inst_ebb(store).unwrap();
|
||||||
let stored_value = opt_ctx.ctx.func.dfg.inst_args(store)[0];
|
let stored_value = opt_ctx.ctx.func.dfg.inst_args(store)[0];
|
||||||
let stored_type = opt_ctx.ctx.func.dfg.value_type(stored_value);
|
let stored_type = opt_ctx.ctx.func.dfg.value_type(stored_value);
|
||||||
if stored_type == loaded_type && store_ebb == load_ebb {
|
if stored_type == loaded_type {
|
||||||
println!("Store to load forward {} -> {}", store, load);
|
println!("Store to load forward {} -> {}", store, load);
|
||||||
users.change_load_to_alias(&mut opt_ctx.ctx.func, load, stored_value);
|
users.change_load_to_alias(&mut opt_ctx.ctx.func, load, stored_value);
|
||||||
}
|
}
|
||||||
|
@ -379,34 +379,31 @@ enum TemporalOrder {
|
||||||
fn temporal_order(ctx: &Context, src: Inst, dest: Inst) -> TemporalOrder {
|
fn temporal_order(ctx: &Context, src: Inst, dest: Inst) -> TemporalOrder {
|
||||||
debug_assert_ne!(src, dest);
|
debug_assert_ne!(src, dest);
|
||||||
|
|
||||||
|
if ctx.domtree.dominates(src, dest, &ctx.func.layout) {
|
||||||
|
return TemporalOrder::DefinitivelyBefore;
|
||||||
|
} else if ctx.domtree.dominates(src, dest, &ctx.func.layout) {
|
||||||
|
return TemporalOrder::NeverBefore;
|
||||||
|
}
|
||||||
|
|
||||||
let src_ebb = ctx.func.layout.inst_ebb(src).unwrap();
|
let src_ebb = ctx.func.layout.inst_ebb(src).unwrap();
|
||||||
let dest_ebb = ctx.func.layout.inst_ebb(dest).unwrap();
|
let dest_ebb = ctx.func.layout.inst_ebb(dest).unwrap();
|
||||||
if src_ebb == dest_ebb {
|
|
||||||
use std::cmp::Ordering::*;
|
// FIXME O(stack_load count * ebb count)
|
||||||
match ctx.func.layout.cmp(src, dest) {
|
// FIXME reuse memory allocations
|
||||||
Less => TemporalOrder::DefinitivelyBefore,
|
let mut visited = EntitySet::new();
|
||||||
Equal => unreachable!(),
|
let mut todo = EntitySet::new();
|
||||||
Greater => TemporalOrder::MaybeBefore, // FIXME use dominator to check for loops
|
todo.insert(dest_ebb);
|
||||||
|
while let Some(ebb) = todo.pop() {
|
||||||
|
if visited.contains(ebb) {
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
} else {
|
visited.insert(ebb);
|
||||||
// FIXME O(stack_load count * ebb count)
|
if ebb == src_ebb {
|
||||||
// FIXME reuse memory allocations
|
return TemporalOrder::MaybeBefore;
|
||||||
// FIXME return DefinitivelyBefore is src dominates dest
|
}
|
||||||
let mut visited = EntitySet::new();
|
for bb in ctx.cfg.pred_iter(ebb) {
|
||||||
let mut todo = EntitySet::new();
|
todo.insert(bb.ebb);
|
||||||
todo.insert(dest_ebb);
|
|
||||||
while let Some(ebb) = todo.pop() {
|
|
||||||
if visited.contains(ebb) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
visited.insert(ebb);
|
|
||||||
if ebb == src_ebb {
|
|
||||||
return TemporalOrder::MaybeBefore;
|
|
||||||
}
|
|
||||||
for bb in ctx.cfg.pred_iter(ebb) {
|
|
||||||
todo.insert(bb.ebb);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
TemporalOrder::NeverBefore
|
|
||||||
}
|
}
|
||||||
|
TemporalOrder::NeverBefore
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue