Skip to content

Commit 289996a

Browse files
committed
Add test case for typelayout based value witness emission.
rdar://51988441
1 parent cb2235f commit 289996a

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
// RUN: %target-swift-frontend -enable-type-layout -primary-file %s -emit-ir | %FileCheck %s --check-prefix=CHECK
2+
// RUN: %target-swift-frontend -enable-type-layout -primary-file %s -O -emit-ir | %FileCheck %s --check-prefix=OPT --check-prefix=OPT-%target-ptrsize
3+
4+
public struct B<T> {
5+
var x: T
6+
var y: T
7+
}
8+
9+
public struct A<T> {
10+
var a : B<T>
11+
var b: B<T>
12+
}
13+
14+
// CHECK-LABEL: define{{.*}} %swift.opaque* @"$s30typelayout_based_value_witness1AVwCP"(
15+
// CHECK-NOT: @"$s30typelayout_based_value_witness1BVMa"(
16+
// CHECK: }
17+
18+
// CHECK-LABEL: define{{.*}} void @"$s30typelayout_based_value_witness1AVwxx"(
19+
// CHECK-NOT: @"$s30typelayout_based_value_witness1BVMa"
20+
// CHECK: }
21+
22+
// CHECK-LABEL: define{{.*}} %swift.opaque* @"$s30typelayout_based_value_witness1AVwcp"(
23+
// CHECK-NOT: @"$s30typelayout_based_value_witness1BVMa"
24+
// CHECK: }
25+
26+
// CHECK-LABEL: define{{.*}} %swift.opaque* @"$s30typelayout_based_value_witness1AVwca"(
27+
// CHECK-NOT: @"$s30typelayout_based_value_witness1BVMa"
28+
// CHECK: }
29+
30+
// CHECK-LABEL: define{{.*}} %swift.opaque* @"$s30typelayout_based_value_witness1AVwtk"(
31+
// CHECK-NOT: @"$s30typelayout_based_value_witness1BVMa"
32+
// CHECK: }
33+
34+
// CHECK-LABEL: define{{.*}} %swift.opaque* @"$s30typelayout_based_value_witness1AVwta"(
35+
// CHECK-NOT: @"$s30typelayout_based_value_witness1BVMa"
36+
// CHECK: }
37+
38+
// CHECK-LABEL: define{{.*}} i32 @"$s30typelayout_based_value_witness1AVwet"(
39+
// CHECK-NOT: @"$s30typelayout_based_value_witness1BVMa"
40+
// CHECK: }
41+
42+
// CHECK-LABEL: define{{.*}} void @"$s30typelayout_based_value_witness1AVwst"(
43+
// CHECK-NOT: @"$s30typelayout_based_value_witness1BVMa"
44+
// CHECK: }
45+
46+
47+
// OPT: define{{.*}} void @"$s30typelayout_based_value_witness1AVwxx"(%swift.opaque* noalias %object, %swift.type* nocapture readonly %"A<T>")
48+
// OPT: [[T_PARAM:%.*]] = getelementptr inbounds %swift.type, %swift.type* %"A<T>", {{(i64|i32)}} 2
49+
// OPT: [[T2:%.*]] = bitcast %swift.type* [[T_PARAM]] to %swift.type**
50+
// OPT: [[T:%.*]] = load %swift.type*, %swift.type** [[T2]]
51+
// OPT: [[VWT_ADDR:%.*]] = getelementptr inbounds %swift.type, %swift.type* [[T]], {{(i64|i32)}} -1
52+
// OPT: [[VWT2:%.*]] = bitcast %swift.type* [[VWT_ADDR]] to i8***
53+
// OPT: [[VWT:%.*]] = load i8**, i8*** [[VWT2]]
54+
// OPT: [[DESTROY_VW:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], {{(i64|i32)}} 1
55+
// OPT: [[DESTROY2:%.*]] = bitcast i8** [[DESTROY_VW]] to void (%swift.opaque*, %swift.type*)**
56+
// OPT: [[DESTROY:%.*]] = load void (%swift.opaque*, %swift.type*)*, void (%swift.opaque*, %swift.type*)** [[DESTROY2]]
57+
// OPT: tail call void [[DESTROY]](%swift.opaque* noalias %object, %swift.type* [[T]])
58+
// OPT: [[SIZE_VW:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], {{(i64|i32)}} 8
59+
// OPT: [[SIZE2:%.*]] = bitcast i8** [[SIZE_VW]] to {{(i64|i32)}}*
60+
// OPT: [[SIZE_T:%.*]] = load {{(i64|i32)}}, {{(i64|i32)}}* [[SIZE2]]
61+
// OPT: [[OBJECT:%.*]] = ptrtoint %swift.opaque* %object to {{(i64|i32)}}
62+
// OPT: [[FLAGS_VW:%.*]] = getelementptr inbounds i8*, i8** [[VWT]], {{(i64|i32)}} 10
63+
// OPT: [[FLAGS2:%.*]] = bitcast i8** [[FLAGS_VW]] to i32*
64+
// OPT: [[FLAGS3:%.*]] = load i32, i32* [[FLAGS2]]
65+
// OPT: [[FLAGS:%.*]] = and i32 [[FLAGS3]], 255
66+
// OPT-64: %flags.alignmentMask = zext i32 [[FLAGS]] to i64
67+
// OPT-64: [[TMP:%.*]] = add {{(i64|i32)}} [[SIZE_T]], %flags.alignmentMask
68+
// OPT-32: [[TMP:%.*]] = add {{(i64|i32)}} %flags.alignmentMask, [[SIZE_T]]
69+
// OPT: [[TMP2:%.*]] = add {{(i64|i32)}} [[TMP]], [[OBJECT]]
70+
// OPT: [[INVERTED:%.*]] = xor {{(i64|i32)}} %flags.alignmentMask, -1
71+
// OPT: [[ADDR2:%.*]] = and {{(i64|i32)}} [[TMP2:%.*]], [[INVERTED:%.*]]
72+
// OPT: [[ADDR_T2:%.*]] = inttoptr {{(i64|i32)}} [[ADDR2]] to %swift.opaque*
73+
// OPT: tail call void [[DESTROY]](%swift.opaque* noalias [[ADDR_T2]], %swift.type* [[T]])
74+
// OPT: [[TMP3:%.*]] = and {{(i64|i32)}} [[TMP]], [[INVERTED:%.*]]
75+
// OPT: [[TMP4:%.*]] = add {{(i64|i32)}} [[TMP2:%.*]], [[TMP3]]
76+
// OPT: [[ADDR3:%.*]] = and {{(i64|i32)}} [[TMP4]], [[INVERTED:%.*]]
77+
// OPT: [[ADDR_T3:%.*]] = inttoptr {{(i64|i32)}} [[ADDR3]] to %swift.opaque*
78+
// OPT: tail call void [[DESTROY]](%swift.opaque* noalias [[ADDR_T3]], %swift.type* [[T]])
79+
// OPT: [[TMP5:%.*]] = add {{(i64|i32)}} [[TMP]], [[ADDR3]]
80+
// OPT: [[ADDR4:%.*]] = and {{(i64|i32)}} [[TMP5]], [[INVERTED:%.*]]
81+
// OPT: [[ADDR_T4:%.*]] = inttoptr {{(i64|i32)}} [[ADDR4]] to %swift.opaque*
82+
// OPT: tail call void [[DESTROY]](%swift.opaque* noalias [[ADDR_T4]], %swift.type* [[T]])
83+
// OPT: ret void
84+
// CHECK: }

0 commit comments

Comments
 (0)