@@ -834,6 +834,55 @@ fn array_len(x: &mut [i32; 42]) -> usize {
834
834
std:: intrinsics:: ptr_metadata ( x)
835
835
}
836
836
837
+ #[ custom_mir( dialect = "runtime" ) ]
838
+ fn generic_cast_metadata < T , A : ?Sized , B : ?Sized > ( ps : * const [ T ] , pa : * const A , pb : * const B ) {
839
+ // CHECK-LABEL: fn generic_cast_metadata
840
+ mir ! {
841
+ {
842
+ // These tests check that we correctly do or don't elide casts
843
+ // when the pointee metadata do or don't match, respectively.
844
+
845
+ // Metadata usize -> (), do not optimize.
846
+ // CHECK: [[T:_.+]] = _1 as
847
+ // CHECK-NEXT: PtrMetadata([[T]])
848
+ let t1 = CastPtrToPtr :: <_, * const T >( ps) ;
849
+ let m1 = PtrMetadata ( t1) ;
850
+
851
+ // `(&A, [T])` has `usize` metadata, same as `[T]`, yes optimize.
852
+ // CHECK: [[T:_.+]] = _1 as
853
+ // CHECK-NEXT: PtrMetadata(_1)
854
+ let t2 = CastPtrToPtr :: <_, * const ( & A , [ T ] ) >( ps) ;
855
+ let m2 = PtrMetadata ( t2) ;
856
+
857
+ // Tail `A` and tail `B`, do not optimize.
858
+ // CHECK: [[T:_.+]] = _2 as
859
+ // CHECK-NEXT: PtrMetadata([[T]])
860
+ let t3 = CastPtrToPtr :: <_, * const ( T , B ) >( pa) ;
861
+ let m3 = PtrMetadata ( t3) ;
862
+
863
+ // Both have tail `A`, yes optimize.
864
+ // CHECK: [[T:_.+]] = _2 as
865
+ // CHECK-NEXT: PtrMetadata(_2)
866
+ let t4 = CastPtrToPtr :: <_, * const ( T , A ) >( pa) ;
867
+ let m4 = PtrMetadata ( t4) ;
868
+
869
+ // Tail `B` and tail `A`, do not optimize.
870
+ // CHECK: [[T:_.+]] = _3 as
871
+ // CHECK-NEXT: PtrMetadata([[T]])
872
+ let t5 = CastPtrToPtr :: <_, * mut A >( pb) ;
873
+ let m5 = PtrMetadata ( t5) ;
874
+
875
+ // Both have tail `B`, yes optimize.
876
+ // CHECK: [[T:_.+]] = _3 as
877
+ // CHECK-NEXT: PtrMetadata(_3)
878
+ let t6 = CastPtrToPtr :: <_, * mut B >( pb) ;
879
+ let m6 = PtrMetadata ( t6) ;
880
+
881
+ Return ( )
882
+ }
883
+ }
884
+ }
885
+
837
886
fn main ( ) {
838
887
subexpression_elimination ( 2 , 4 , 5 ) ;
839
888
wrap_unwrap ( 5 ) ;
@@ -900,3 +949,4 @@ fn identity<T>(x: T) -> T {
900
949
// EMIT_MIR gvn.casts_before_aggregate_raw_ptr.GVN.diff
901
950
// EMIT_MIR gvn.manual_slice_mut_len.GVN.diff
902
951
// EMIT_MIR gvn.array_len.GVN.diff
952
+ // EMIT_MIR gvn.generic_cast_metadata.GVN.diff
0 commit comments