]> git.lizzy.rs Git - rust.git/commitdiff
Don't force many scalar pair values to the stack in write_cvalue_maybe_transmute
authorbjorn3 <17426603+bjorn3@users.noreply.github.com>
Wed, 1 Feb 2023 13:55:28 +0000 (13:55 +0000)
committerbjorn3 <17426603+bjorn3@users.noreply.github.com>
Wed, 1 Feb 2023 13:55:28 +0000 (13:55 +0000)
Sometimes it is necessary for handling vector to scalar pair transmutes,
but if the types are the same there is no need for this.

This improves runtime performance on simple-raytracer by 12%.

src/abi/comments.rs
src/value_and_place.rs

index 7f4619b5c940b12f3701ca2aebba46e92808a163..abf63e33c35370ce39bbccb9d0c999217a0ce330 100644 (file)
@@ -98,12 +98,12 @@ pub(super) fn add_local_place_comments<'tcx>(
         }
         CPlaceInner::VarPair(place_local, var1, var2) => {
             assert_eq!(local, place_local);
-            ("ssa", Cow::Owned(format!(",var=({}, {})", var1.index(), var2.index())))
+            ("ssa", Cow::Owned(format!("var=({}, {})", var1.index(), var2.index())))
         }
         CPlaceInner::VarLane(_local, _var, _lane) => unreachable!(),
         CPlaceInner::Addr(ptr, meta) => {
             let meta = if let Some(meta) = meta {
-                Cow::Owned(format!(",meta={}", meta))
+                Cow::Owned(format!("meta={}", meta))
             } else {
                 Cow::Borrowed("")
             };
index fa06d6c3ba7f3a2a27b9f14b73d8862cfac75d87..cc4493d442f7ddfc1e46f502d070ef74822ba1f9 100644 (file)
@@ -588,10 +588,13 @@ fn transmute_value<'tcx>(
                 return;
             }
             CPlaceInner::VarPair(_local, var1, var2) => {
-                let (ptr, meta) = from.force_stack(fx);
-                assert!(meta.is_none());
-                let (data1, data2) =
-                    CValue(CValueInner::ByRef(ptr, None), dst_layout).load_scalar_pair(fx);
+                let (data1, data2) = if self.layout().ty == dst_layout.ty {
+                    CValue(from.0, dst_layout).load_scalar_pair(fx)
+                } else {
+                    let (ptr, meta) = from.force_stack(fx);
+                    assert!(meta.is_none());
+                    CValue(CValueInner::ByRef(ptr, None), dst_layout).load_scalar_pair(fx)
+                };
                 let (dst_ty1, dst_ty2) = fx.clif_pair_type(self.layout().ty).unwrap();
                 transmute_value(fx, var1, data1, dst_ty1);
                 transmute_value(fx, var2, data2, dst_ty2);