1
Fork 0

Return use domtree.dominates in temporal_order

This commit is contained in:
bjorn3 2019-12-30 20:52:57 +01:00
parent 7c4debdb7c
commit d6c2db2aea

View file

@ -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
} }