diff options
| author | bjorn3 <bjorn3@users.noreply.github.com> | 2019-12-27 16:50:41 +0100 |
|---|---|---|
| committer | bjorn3 <bjorn3@users.noreply.github.com> | 2019-12-31 15:56:28 +0100 |
| commit | be6cdb28d0ac896478cf784478a41b9e2c1c5234 (patch) | |
| tree | 39908f7eacb364bbf2ed458a2d81aff972f3fa17 /src/optimize/stack2reg.rs | |
| parent | 943b81bb409dd9239f14992aaa75f8ae2a564e62 (diff) | |
Refactor stack_store removal
Diffstat (limited to 'src/optimize/stack2reg.rs')
| -rw-r--r-- | src/optimize/stack2reg.rs | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/src/optimize/stack2reg.rs b/src/optimize/stack2reg.rs index 2e531d1cb55..70917436003 100644 --- a/src/optimize/stack2reg.rs +++ b/src/optimize/stack2reg.rs @@ -78,17 +78,25 @@ pub(super) fn optimize_function( println!("stack slot usage (after): {:?}", stack_slot_usage_map); for (stack_slot, users) in stack_slot_usage_map.iter_mut() { - if users.stack_addr.is_empty().not() || (users.stack_load.is_empty().not() && users.stack_store.is_empty().not()) { + if users.stack_addr.is_empty().not() { + // Stack addr leaked; there may be unknown loads and stores. + // FIXME use stacked borrows to optimize continue; } - if users.stack_load.is_empty().not() { - println!("[{}] [BUG?] Reading uninitialized memory", name); - } else { - // Stored value never read; just remove reads. - for user in users.stack_store.drain() { - println!("[{}] Remove dead stack store {} of {}", name, user, stack_slot.0); - func.dfg.replace(user).nop(); + let is_loaded = users.stack_load.is_empty().not(); + let is_stored = users.stack_store.is_empty().not(); + match (is_loaded, is_stored) { + (true, true) => {} // FIXME perform store to load optimization + (true, false) => println!("[{}] [BUG?] Reading uninitialized memory", name), + (false, _) => { + // Never loaded; can safely remove all stores and the stack slot. + for user in users.stack_store.drain() { + println!("[{}] Remove dead stack store {} of {}", name, user, stack_slot.0); + func.dfg.replace(user).nop(); + } + + // FIXME make stack_slot zero sized. } } } |
