about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNicholas Nethercote <nnethercote@mozilla.com>2016-10-12 16:59:53 +1100
committerNicholas Nethercote <nnethercote@mozilla.com>2016-10-18 20:55:23 +1100
commit1e4241ab31372c7efb5d59b6b6a6711bcbae0e59 (patch)
treeb4e52c5c09a850b2ec17e7fd369a7c09976e110e /src
parent1d3dfa5301f59e86547a4034fb654c4efb47ac0e (diff)
downloadrust-1e4241ab31372c7efb5d59b6b6a6711bcbae0e59.tar.gz
rust-1e4241ab31372c7efb5d59b6b6a6711bcbae0e59.zip
Optimize `Substs::super_fold_with`.
This speeds up several rustc-benchmarks by 1--4%.
Diffstat (limited to 'src')
-rw-r--r--src/librustc/ty/subst.rs11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/librustc/ty/subst.rs b/src/librustc/ty/subst.rs
index 7d7bbd93122..6beb2b968e2 100644
--- a/src/librustc/ty/subst.rs
+++ b/src/librustc/ty/subst.rs
@@ -304,8 +304,15 @@ impl<'a, 'gcx, 'tcx> Substs<'tcx> {
 
 impl<'tcx> TypeFoldable<'tcx> for &'tcx Substs<'tcx> {
     fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {
-        let params = self.iter().map(|k| k.fold_with(folder)).collect();
-        folder.tcx().mk_substs(params)
+        let params: Vec<_> = self.iter().map(|k| k.fold_with(folder)).collect();
+
+        // If folding doesn't change the substs, it's faster to avoid calling
+        // `mk_substs` and instead reuse the existing substs.
+        if params[..] == self[..] {
+            self
+        } else {
+            folder.tcx().mk_substs(params)
+        }
     }
 
     fn fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, folder: &mut F) -> Self {