about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBjörn Steinbrink <bsteinbr@gmail.com>2019-01-16 19:34:37 +0100
committerBjörn Steinbrink <bsteinbr@gmail.com>2019-01-17 00:30:11 +0100
commitda06898a7539ff66e636a5bf9d3b176b865a2737 (patch)
treeb15ea97189b3320c88ab8504f1853e09f3d829c5
parentceb2512144d1fc26330e85fb9d41c22ba1866259 (diff)
downloadrust-da06898a7539ff66e636a5bf9d3b176b865a2737.tar.gz
rust-da06898a7539ff66e636a5bf9d3b176b865a2737.zip
Avoid erase_regions_ty queries if there are no regions to erase
It's overall faster to perform this extra check than to perform the
query, even if the result is already in the query cache.
-rw-r--r--src/librustc/ty/erase_regions.rs7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/librustc/ty/erase_regions.rs b/src/librustc/ty/erase_regions.rs
index bbf71c62ca6..da7e021b2d5 100644
--- a/src/librustc/ty/erase_regions.rs
+++ b/src/librustc/ty/erase_regions.rs
@@ -1,4 +1,4 @@
-use ty::{self, Ty, TyCtxt};
+use ty::{self, Ty, TyCtxt, TypeFlags};
 use ty::fold::{TypeFolder, TypeFoldable};
 
 pub(super) fn provide(providers: &mut ty::query::Providers<'_>) {
@@ -21,6 +21,11 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
     pub fn erase_regions<T>(self, value: &T) -> T
         where T : TypeFoldable<'tcx>
     {
+        // If there's nothing to erase avoid performing the query at all
+        if !value.has_type_flags(TypeFlags::HAS_RE_LATE_BOUND | TypeFlags::HAS_FREE_REGIONS) {
+            return value.clone();
+        }
+
         let value1 = value.fold_with(&mut RegionEraserVisitor { tcx: self });
         debug!("erase_regions({:?}) = {:?}", value, value1);
         value1