about summary refs log tree commit diff
path: root/src/optimize/stack2reg.rs
diff options
context:
space:
mode:
authorbjorn3 <bjorn3@users.noreply.github.com>2019-12-27 16:50:41 +0100
committerbjorn3 <bjorn3@users.noreply.github.com>2019-12-31 15:56:28 +0100
commitbe6cdb28d0ac896478cf784478a41b9e2c1c5234 (patch)
tree39908f7eacb364bbf2ed458a2d81aff972f3fa17 /src/optimize/stack2reg.rs
parent943b81bb409dd9239f14992aaa75f8ae2a564e62 (diff)
Refactor stack_store removal
Diffstat (limited to 'src/optimize/stack2reg.rs')
-rw-r--r--src/optimize/stack2reg.rs24
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.
             }
         }
     }