about summary refs log tree commit diff
path: root/compiler
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2024-04-20 12:54:15 +0000
committerbors <bors@rust-lang.org>2024-04-20 12:54:15 +0000
commitc3ceb00281f9557dcf5bba54fc44c9931cc90d42 (patch)
treebb54325e932c890d5787b6e8ced7928e798dbd62 /compiler
parent584f183dc0e0ce8d981811ebbf67886c0cfef9e0 (diff)
parent727fe81fd6f1c52e7858e6e248bda1a607c7fabf (diff)
downloadrust-c3ceb00281f9557dcf5bba54fc44c9931cc90d42.tar.gz
rust-c3ceb00281f9557dcf5bba54fc44c9931cc90d42.zip
Auto merge of #124190 - RalfJung:pat-compare-with-fast-path, r=Nadrieril
PatRangeBoundary::compare_with: als add a fast-path for signed integers

Not sure if we have a benchmark that hits this... but it seems odd to only do this for unsigned integers.
Diffstat (limited to 'compiler')
-rw-r--r--compiler/rustc_middle/src/thir.rs13
1 files changed, 8 insertions, 5 deletions
diff --git a/compiler/rustc_middle/src/thir.rs b/compiler/rustc_middle/src/thir.rs
index 66130a8dde0..d52b1efce4b 100644
--- a/compiler/rustc_middle/src/thir.rs
+++ b/compiler/rustc_middle/src/thir.rs
@@ -1006,15 +1006,18 @@ impl<'tcx> PatRangeBoundary<'tcx> {
 
             // This code is hot when compiling matches with many ranges. So we
             // special-case extraction of evaluated scalars for speed, for types where
-            // unsigned int comparisons are appropriate. E.g. `unicode-normalization` has
+            // we can do scalar comparisons. E.g. `unicode-normalization` has
             // many ranges such as '\u{037A}'..='\u{037F}', and chars can be compared
             // in this way.
-            (Finite(a), Finite(b)) if matches!(ty.kind(), ty::Uint(_) | ty::Char) => {
+            (Finite(a), Finite(b)) if matches!(ty.kind(), ty::Int(_) | ty::Uint(_) | ty::Char) => {
                 if let (Some(a), Some(b)) = (a.try_to_scalar_int(), b.try_to_scalar_int()) {
                     let sz = ty.primitive_size(tcx);
-                    let a = a.assert_uint(sz);
-                    let b = b.assert_uint(sz);
-                    return Some(a.cmp(&b));
+                    let cmp = match ty.kind() {
+                        ty::Uint(_) | ty::Char => a.assert_uint(sz).cmp(&b.assert_uint(sz)),
+                        ty::Int(_) => a.assert_int(sz).cmp(&b.assert_int(sz)),
+                        _ => unreachable!(),
+                    };
+                    return Some(cmp);
                 }
             }
             _ => {}