about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAriel Ben-Yehuda <ariel.byd@gmail.com>2016-10-04 16:27:27 +0300
committerAriel Ben-Yehuda <ariel.byd@gmail.com>2016-10-04 17:07:34 +0300
commit44ac0160cef4824082f738ce5d2b847b0b8f88ea (patch)
tree215f93378bc581a9dfac85134ca64159d9b00dab
parentae51ccfa771ffdfae63ad2a5a9deecf9712833d8 (diff)
downloadrust-44ac0160cef4824082f738ce5d2b847b0b8f88ea.tar.gz
rust-44ac0160cef4824082f738ce5d2b847b0b8f88ea.zip
SimplifyCfg: don't incref target when collapsing a goto with 1 pred
-rw-r--r--src/librustc_mir/transform/simplify_cfg.rs12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/librustc_mir/transform/simplify_cfg.rs b/src/librustc_mir/transform/simplify_cfg.rs
index 228fa468841..ca8556496fa 100644
--- a/src/librustc_mir/transform/simplify_cfg.rs
+++ b/src/librustc_mir/transform/simplify_cfg.rs
@@ -160,8 +160,16 @@ impl<'a, 'tcx: 'a> CfgSimplifier<'a, 'tcx> {
         debug!("collapsing goto chain from {:?} to {:?}", *start, target);
 
         *changed |= *start != target;
-        self.pred_count[target] += 1;
-        self.pred_count[*start] -= 1;
+
+        if self.pred_count[*start] == 1 {
+            // This is the last reference to *start, so the pred-count to
+            // to target is moved into the current block.
+            self.pred_count[*start] = 0;
+        } else {
+            self.pred_count[target] += 1;
+            self.pred_count[*start] -= 1;
+        }
+
         *start = target;
     }