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-28 11:36:00 +0100
committerbjorn3 <bjorn3@users.noreply.github.com>2019-12-31 15:56:28 +0100
commitc5f42aef1d7a7c0e4097fc0e8f76fff47b8d32b8 (patch)
tree20cac096ca8bcb27d771e23eb4c64095b1805997 /src/optimize/stack2reg.rs
parent7d35db53196f5170374482700a71ffee51186c10 (diff)
Run dead stack_store removal after stack_store to stack_load forwarding
Diffstat (limited to 'src/optimize/stack2reg.rs')
-rw-r--r--src/optimize/stack2reg.rs89
1 files changed, 43 insertions, 46 deletions
diff --git a/src/optimize/stack2reg.rs b/src/optimize/stack2reg.rs
index d368d50a032..edf507b9760 100644
--- a/src/optimize/stack2reg.rs
+++ b/src/optimize/stack2reg.rs
@@ -84,58 +84,55 @@ pub(super) fn optimize_function(
             continue;
         }
 
-        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) => {
-                for load in users.stack_load.clone().drain() {
-                    let load_ebb = func.layout.inst_ebb(load).unwrap();
-                    let loaded_value = func.dfg.inst_results(load)[0];
-                    let loaded_type = func.dfg.value_type(loaded_value);
-
-                    let potential_stores = users.stack_store.iter().cloned().filter(|&store| {
-                        match spatial_overlap(func, load, store) {
-                            SpatialOverlap::No => false, // Can never be the source of the loaded value.
-                            SpatialOverlap::Partial | SpatialOverlap::Full => true,
-                        }
-                    }).filter(|&store| {
-                        if load_ebb == func.layout.inst_ebb(store).unwrap() {
-                            func.layout.cmp(store, load) == std::cmp::Ordering::Less
-                        } else {
-                            true // FIXME
-                        }
-                    }).collect::<Vec<Inst>>();
-                    for &store in &potential_stores {
-                        println!("Potential store -> load forwarding {} -> {} ({:?})", func.dfg.display_inst(store, None), func.dfg.display_inst(load, None), spatial_overlap(func, load, store));
-                    }
-                    match *potential_stores {
-                        [] => println!("[{}] [BUG?] Reading uninitialized memory", name),
-                        [store] if spatial_overlap(func, load, store) == SpatialOverlap::Full => {
-                            let store_ebb = func.layout.inst_ebb(store).unwrap();
-                            let stored_value = func.dfg.inst_args(store)[0];
-                            let stored_type = func.dfg.value_type(stored_value);
-                            if stored_type == loaded_type && store_ebb == load_ebb {
-                                println!("Store to load forward {} -> {}", store, load);
-                                func.dfg.detach_results(load);
-                                func.dfg.replace(load).nop();
-                                func.dfg.change_to_alias(loaded_value, stored_value);
-                            }
-                        }
-                        _ => {} // FIXME implement this
-                    }
+        for load in users.stack_load.clone().drain() {
+            let load_ebb = func.layout.inst_ebb(load).unwrap();
+            let loaded_value = func.dfg.inst_results(load)[0];
+            let loaded_type = func.dfg.value_type(loaded_value);
+
+            let potential_stores = users.stack_store.iter().cloned().filter(|&store| {
+                match spatial_overlap(func, load, store) {
+                    SpatialOverlap::No => false, // Can never be the source of the loaded value.
+                    SpatialOverlap::Partial | SpatialOverlap::Full => true,
+                }
+            }).filter(|&store| {
+                if load_ebb == func.layout.inst_ebb(store).unwrap() {
+                    func.layout.cmp(store, load) == std::cmp::Ordering::Less
+                } else {
+                    true // FIXME
                 }
+            }).collect::<Vec<Inst>>();
+            for &store in &potential_stores {
+                println!("Potential store -> load forwarding {} -> {} ({:?})", func.dfg.display_inst(store, None), func.dfg.display_inst(load, None), spatial_overlap(func, load, store));
             }
-            (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();
+            match *potential_stores {
+                [] => println!("[{}] [BUG?] Reading uninitialized memory", name),
+                [store] if spatial_overlap(func, load, store) == SpatialOverlap::Full => {
+                    let store_ebb = func.layout.inst_ebb(store).unwrap();
+                    let stored_value = func.dfg.inst_args(store)[0];
+                    let stored_type = func.dfg.value_type(stored_value);
+                    if stored_type == loaded_type && store_ebb == load_ebb {
+                        println!("Store to load forward {} -> {}", store, load);
+                        func.dfg.detach_results(load);
+                        func.dfg.replace(load).nop();
+                        func.dfg.change_to_alias(loaded_value, stored_value);
+                        users.stack_load.remove(&load);
+                    }
                 }
+                _ => {} // FIXME implement this
+            }
+        }
 
-                // FIXME make stack_slot zero sized.
+        if users.stack_load.is_empty() {
+            // 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();
             }
         }
+
+        if users.stack_store.is_empty() && users.stack_load.is_empty() {
+            // FIXME make stack_slot zero sized.
+        }
     }
 
     println!();