@@ -834,6 +834,46 @@ 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
+ // CHECK: [[T:_.+]] = _1 as
843
+ // CHECK-NEXT: PtrMetadata([[T]])
844
+ let t1 = CastPtrToPtr :: <_, * const T >( ps) ;
845
+ let m1 = PtrMetadata ( t1) ;
846
+
847
+ // CHECK: [[T:_.+]] = _1 as
848
+ // CHECK-NEXT: PtrMetadata(_1)
849
+ let t2 = CastPtrToPtr :: <_, * const ( & A , [ T ] ) >( ps) ;
850
+ let m2 = PtrMetadata ( t2) ;
851
+
852
+ // CHECK: [[T:_.+]] = _2 as
853
+ // CHECK-NEXT: PtrMetadata([[T]])
854
+ let t3 = CastPtrToPtr :: <_, * const ( T , B ) >( pa) ;
855
+ let m3 = PtrMetadata ( t3) ;
856
+
857
+ // CHECK: [[T:_.+]] = _2 as
858
+ // CHECK-NEXT: PtrMetadata(_2)
859
+ let t4 = CastPtrToPtr :: <_, * const ( T , A ) >( pa) ;
860
+ let m4 = PtrMetadata ( t4) ;
861
+
862
+ // CHECK: [[T:_.+]] = _3 as
863
+ // CHECK-NEXT: PtrMetadata([[T]])
864
+ let t5 = CastPtrToPtr :: <_, * mut A >( pb) ;
865
+ let m5 = PtrMetadata ( t5) ;
866
+
867
+ // CHECK: [[T:_.+]] = _3 as
868
+ // CHECK-NEXT: PtrMetadata(_3)
869
+ let t6 = CastPtrToPtr :: <_, * mut B >( pb) ;
870
+ let m6 = PtrMetadata ( t6) ;
871
+
872
+ Return ( )
873
+ }
874
+ }
875
+ }
876
+
837
877
fn main ( ) {
838
878
subexpression_elimination ( 2 , 4 , 5 ) ;
839
879
wrap_unwrap ( 5 ) ;
@@ -900,3 +940,4 @@ fn identity<T>(x: T) -> T {
900
940
// EMIT_MIR gvn.casts_before_aggregate_raw_ptr.GVN.diff
901
941
// EMIT_MIR gvn.manual_slice_mut_len.GVN.diff
902
942
// EMIT_MIR gvn.array_len.GVN.diff
943
+ // EMIT_MIR gvn.generic_cast_metadata.GVN.diff
0 commit comments