1
- // RUN: %clang_cc1 -no-opaque-pointers - triple x86_64-apple-darwin10 -emit-llvm -fobjc-arc -fexceptions -fobjc-exceptions -fcxx-exceptions -fobjc-runtime-has-weak -o - -fobjc-arc-exceptions %s | FileCheck %s
1
+ // RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fobjc-arc -fexceptions -fobjc-exceptions -fcxx-exceptions -fobjc-runtime-has-weak -o - -fobjc-arc-exceptions %s | FileCheck %s
2
2
3
3
@class Ety;
4
4
@@ -12,16 +12,12 @@ void test0(void) {
12
12
}
13
13
}
14
14
// CHECK-LABEL: define{{.*}} void @_Z5test0v()
15
- // CHECK: [[E:%.* ]] = alloca [[ETY:%.*]]* , align 8
15
+ // CHECK: [[E:%e ]] = alloca ptr , align 8
16
16
// CHECK-NEXT: invoke void @_Z12test0_helperv()
17
- // CHECK: [[T0:%.*]] = call i8* @objc_begin_catch(
18
- // CHECK-NEXT: [[T1:%.*]] = bitcast i8* [[T0]] to [[ETY]]*
19
- // CHECK-NEXT: [[T2:%.*]] = bitcast [[ETY]]* [[T1]] to i8*
20
- // CHECK-NEXT: [[T3:%.*]] = call i8* @llvm.objc.retain(i8* [[T2]]) [[NUW:#[0-9]+]]
21
- // CHECK-NEXT: [[T4:%.*]] = bitcast i8* [[T3]] to [[ETY]]*
22
- // CHECK-NEXT: store [[ETY]]* [[T4]], [[ETY]]** [[E]]
23
- // CHECK-NEXT: [[T0:%.*]] = bitcast [[ETY]]** [[E]] to i8**
24
- // CHECK-NEXT: call void @llvm.objc.storeStrong(i8** [[T0]], i8* null) [[NUW]]
17
+ // CHECK: [[T0:%.*]] = call ptr @objc_begin_catch(
18
+ // CHECK-NEXT: [[T3:%.*]] = call ptr @llvm.objc.retain(ptr [[T0]]) [[NUW:#[0-9]+]]
19
+ // CHECK-NEXT: store ptr [[T3]], ptr [[E]]
20
+ // CHECK-NEXT: call void @llvm.objc.storeStrong(ptr [[E]], ptr null) [[NUW]]
25
21
// CHECK-NEXT: call void @objc_end_catch() [[NUW]]
26
22
27
23
void test1_helper (void );
@@ -32,15 +28,11 @@ void test1(void) {
32
28
}
33
29
}
34
30
// CHECK-LABEL: define{{.*}} void @_Z5test1v()
35
- // CHECK: [[E:%.* ]] = alloca [[ETY:%.*]]* , align 8
31
+ // CHECK: [[E:%e ]] = alloca ptr , align 8
36
32
// CHECK-NEXT: invoke void @_Z12test1_helperv()
37
- // CHECK: [[T0:%.*]] = call i8* @objc_begin_catch(
38
- // CHECK-NEXT: [[T1:%.*]] = bitcast i8* [[T0]] to [[ETY]]*
39
- // CHECK-NEXT: [[T2:%.*]] = bitcast [[ETY]]** [[E]] to i8**
40
- // CHECK-NEXT: [[T3:%.*]] = bitcast [[ETY]]* [[T1]] to i8*
41
- // CHECK-NEXT: call i8* @llvm.objc.initWeak(i8** [[T2]], i8* [[T3]]) [[NUW]]
42
- // CHECK-NEXT: [[T0:%.*]] = bitcast [[ETY]]** [[E]] to i8**
43
- // CHECK-NEXT: call void @llvm.objc.destroyWeak(i8** [[T0]]) [[NUW]]
33
+ // CHECK: [[T0:%.*]] = call ptr @objc_begin_catch(
34
+ // CHECK-NEXT: call ptr @llvm.objc.initWeak(ptr [[E]], ptr [[T0]]) [[NUW]]
35
+ // CHECK-NEXT: call void @llvm.objc.destroyWeak(ptr [[E]]) [[NUW]]
44
36
// CHECK-NEXT: call void @objc_end_catch() [[NUW]]
45
37
46
38
void test2_helper (void );
@@ -51,16 +43,12 @@ void test2(void) {
51
43
}
52
44
}
53
45
// CHECK-LABEL: define{{.*}} void @_Z5test2v()
54
- // CHECK: [[E:%.* ]] = alloca [[ETY:%.*]]* , align 8
46
+ // CHECK: [[E:%e ]] = alloca ptr , align 8
55
47
// CHECK-NEXT: invoke void @_Z12test2_helperv()
56
- // CHECK: [[T0:%.*]] = call i8* @__cxa_begin_catch(
57
- // CHECK-NEXT: [[T1:%.*]] = bitcast i8* [[T0]] to [[ETY]]*
58
- // CHECK-NEXT: [[T2:%.*]] = bitcast [[ETY]]* [[T1]] to i8*
59
- // CHECK-NEXT: [[T3:%.*]] = call i8* @llvm.objc.retain(i8* [[T2]]) [[NUW]]
60
- // CHECK-NEXT: [[T4:%.*]] = bitcast i8* [[T3]] to [[ETY]]*
61
- // CHECK-NEXT: store [[ETY]]* [[T4]], [[ETY]]** [[E]]
62
- // CHECK-NEXT: [[T0:%.*]] = bitcast [[ETY]]** [[E]] to i8**
63
- // CHECK-NEXT: call void @llvm.objc.storeStrong(i8** [[T0]], i8* null) [[NUW]]
48
+ // CHECK: [[T0:%.*]] = call ptr @__cxa_begin_catch(
49
+ // CHECK-NEXT: [[T3:%.*]] = call ptr @llvm.objc.retain(ptr [[T0]]) [[NUW]]
50
+ // CHECK-NEXT: store ptr [[T3]], ptr [[E]]
51
+ // CHECK-NEXT: call void @llvm.objc.storeStrong(ptr [[E]], ptr null) [[NUW]]
64
52
// CHECK-NEXT: call void @__cxa_end_catch() [[NUW]]
65
53
66
54
void test3_helper (void );
@@ -71,15 +59,11 @@ void test3(void) {
71
59
}
72
60
}
73
61
// CHECK-LABEL: define{{.*}} void @_Z5test3v()
74
- // CHECK: [[E:%.* ]] = alloca [[ETY:%.*]]* , align 8
62
+ // CHECK: [[E:%e ]] = alloca ptr , align 8
75
63
// CHECK-NEXT: invoke void @_Z12test3_helperv()
76
- // CHECK: [[T0:%.*]] = call i8* @__cxa_begin_catch(
77
- // CHECK-NEXT: [[T1:%.*]] = bitcast i8* [[T0]] to [[ETY]]*
78
- // CHECK-NEXT: [[T2:%.*]] = bitcast [[ETY]]** [[E]] to i8**
79
- // CHECK-NEXT: [[T3:%.*]] = bitcast [[ETY]]* [[T1]] to i8*
80
- // CHECK-NEXT: call i8* @llvm.objc.initWeak(i8** [[T2]], i8* [[T3]]) [[NUW]]
81
- // CHECK-NEXT: [[T0:%.*]] = bitcast [[ETY]]** [[E]] to i8**
82
- // CHECK-NEXT: call void @llvm.objc.destroyWeak(i8** [[T0]]) [[NUW]]
64
+ // CHECK: [[T0:%.*]] = call ptr @__cxa_begin_catch(
65
+ // CHECK-NEXT: call ptr @llvm.objc.initWeak(ptr [[E]], ptr [[T0]]) [[NUW]]
66
+ // CHECK-NEXT: call void @llvm.objc.destroyWeak(ptr [[E]]) [[NUW]]
83
67
// CHECK-NEXT: call void @__cxa_end_catch() [[NUW]]
84
68
85
69
namespace test4 {
@@ -94,29 +78,28 @@ void test3(void) {
94
78
throw 0 ;
95
79
}
96
80
// CHECK-LABEL: define{{.*}} void @_ZN5test41AC2Ev(
97
- // CHECK: [[THIS:%.*]] = load [[A:%.*]]*, [[A:%.*]]** {{%.*}}
81
+ // CHECK: [[THIS:%.*]] = load ptr, ptr {{%.*}}
98
82
// Construct single.
99
- // CHECK-NEXT: [[SINGLE:%.*]] = getelementptr inbounds [[A]], [[A]]* [[THIS]], i32 0, i32 0
100
- // CHECK-NEXT: store i8* null, i8** [[SINGLE]], align 8
83
+ // CHECK-NEXT: [[SINGLE:%.*]] = getelementptr inbounds [[A:%.* ]], ptr [[THIS]], i32 0, i32 0
84
+ // CHECK-NEXT: store ptr null, ptr [[SINGLE]], align 8
101
85
// Construct array.
102
- // CHECK-NEXT: [[ARRAY:%.*]] = getelementptr inbounds [[A]], [[A]]* [[THIS]], i32 0, i32 1
103
- // CHECK-NEXT: [[T0:%.*]] = bitcast [2 x [3 x i8*]]* [[ARRAY]] to i8*
104
- // CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* align 8 [[T0]], i8 0, i64 48, i1 false)
86
+ // CHECK-NEXT: [[ARRAY:%.*]] = getelementptr inbounds [[A:%.*]], ptr [[THIS]], i32 0, i32 1
87
+ // CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[ARRAY]], i8 0, i64 48, i1 false)
105
88
// throw 0;
106
89
// CHECK: invoke void @__cxa_throw(
107
90
// Landing pad from throw site:
108
91
// CHECK: landingpad
109
92
// - First, destroy all of array.
110
- // CHECK: [[ARRAYBEGIN:%.*]] = getelementptr inbounds [2 x [3 x i8* ]], [2 x [3 x i8*]]* [[ARRAY]], i32 0, i32 0, i32 0
111
- // CHECK-NEXT: [[ARRAYEND:%.*]] = getelementptr inbounds i8*, i8** [[ARRAYBEGIN]], i64 6
93
+ // CHECK: [[ARRAYBEGIN:%.*]] = getelementptr inbounds [2 x [3 x ptr ]], ptr [[ARRAY]], i32 0, i32 0, i32 0
94
+ // CHECK-NEXT: [[ARRAYEND:%.*]] = getelementptr inbounds ptr, ptr [[ARRAYBEGIN]], i64 6
112
95
// CHECK-NEXT: br label
113
- // CHECK: [[AFTER:%.*]] = phi i8** [ [[ARRAYEND]], {{%.*}} ], [ [[ELT:%.*]], {{%.*}} ]
114
- // CHECK-NEXT: [[ELT]] = getelementptr inbounds i8*, i8** [[AFTER]], i64 -1
115
- // CHECK-NEXT: call void @llvm.objc.storeStrong(i8** [[ELT]], i8* null) [[NUW]]
116
- // CHECK-NEXT: [[DONE:%.*]] = icmp eq i8** [[ELT]], [[ARRAYBEGIN]]
96
+ // CHECK: [[AFTER:%.*]] = phi ptr [ [[ARRAYEND]], {{%.*}} ], [ [[ELT:%.*]], {{%.*}} ]
97
+ // CHECK-NEXT: [[ELT]] = getelementptr inbounds ptr, ptr [[AFTER]], i64 -1
98
+ // CHECK-NEXT: call void @llvm.objc.storeStrong(ptr [[ELT]], ptr null) [[NUW]]
99
+ // CHECK-NEXT: [[DONE:%.*]] = icmp eq ptr [[ELT]], [[ARRAYBEGIN]]
117
100
// CHECK-NEXT: br i1 [[DONE]],
118
101
// - Next, destroy single.
119
- // CHECK: call void @llvm.objc.storeStrong(i8** [[SINGLE]], i8* null) [[NUW]]
102
+ // CHECK: call void @llvm.objc.storeStrong(ptr [[SINGLE]], ptr null) [[NUW]]
120
103
// CHECK: br label
121
104
// CHECK: resume
122
105
}
@@ -132,26 +115,26 @@ void test5(void) {
132
115
};
133
116
}
134
117
// CHECK-LABEL: define{{.*}} void @_Z5test5v()
135
- // CHECK: [[ARRAY:%.*]] = alloca [2 x [2 x i8* ]], align
136
- // CHECK: [[A0:%.*]] = getelementptr inbounds [2 x [2 x i8* ]], [2 x [2 x i8*]]* [[ARRAY]], i64 0, i64 0
137
- // CHECK-NEXT: store [2 x i8*]* [[A0]],
138
- // CHECK-NEXT: [[A00:%.*]] = getelementptr inbounds [2 x i8* ], [2 x i8*]* [[A0]], i64 0, i64 0
139
- // CHECK-NEXT: store i8** [[A00]],
140
- // CHECK-NEXT: [[T0:%.*]] = invoke noundef i8* @_Z12test5_helperj(i32 noundef 0)
141
- // CHECK: store i8* [[T0]], i8** [[A00]], align
142
- // CHECK-NEXT: [[A01:%.*]] = getelementptr inbounds i8*, i8** [[A00]], i64 1
143
- // CHECK-NEXT: store i8** [[A01]],
144
- // CHECK-NEXT: [[T0:%.*]] = invoke noundef i8* @_Z12test5_helperj(i32 noundef 1)
145
- // CHECK: store i8* [[T0]], i8** [[A01]], align
146
- // CHECK-NEXT: [[A1:%.*]] = getelementptr inbounds [2 x i8* ], [2 x i8*]* [[A0]], i64 1
147
- // CHECK-NEXT: store [2 x i8*]* [[A1]],
148
- // CHECK-NEXT: [[A10:%.*]] = getelementptr inbounds [2 x i8* ], [2 x i8*]* [[A1]], i64 0, i64 0
149
- // CHECK-NEXT: store i8** [[A10]],
150
- // CHECK-NEXT: [[T0:%.*]] = invoke noundef i8* @_Z12test5_helperj(i32 noundef 2)
151
- // CHECK: store i8* [[T0]], i8** [[A10]], align
152
- // CHECK-NEXT: [[A11:%.*]] = getelementptr inbounds i8*, i8** [[A10]], i64 1
153
- // CHECK-NEXT: store i8** [[A11]],
154
- // CHECK-NEXT: [[T0:%.*]] = invoke noundef i8* @_Z12test5_helperj(i32 noundef 3)
155
- // CHECK: store i8* [[T0]], i8** [[A11]], align
118
+ // CHECK: [[ARRAY:%.*]] = alloca [2 x [2 x ptr ]], align
119
+ // CHECK: [[A0:%.*]] = getelementptr inbounds [2 x [2 x ptr ]], ptr [[ARRAY]], i64 0, i64 0
120
+ // CHECK-NEXT: store ptr [[A0]],
121
+ // CHECK-NEXT: [[A00:%.*]] = getelementptr inbounds [2 x ptr ], ptr [[A0]], i64 0, i64 0
122
+ // CHECK-NEXT: store ptr [[A00]],
123
+ // CHECK-NEXT: [[T0:%.*]] = invoke noundef ptr @_Z12test5_helperj(i32 noundef 0)
124
+ // CHECK: store ptr [[T0]], ptr [[A00]], align
125
+ // CHECK-NEXT: [[A01:%.*]] = getelementptr inbounds ptr, ptr [[A00]], i64 1
126
+ // CHECK-NEXT: store ptr [[A01]],
127
+ // CHECK-NEXT: [[T0:%.*]] = invoke noundef ptr @_Z12test5_helperj(i32 noundef 1)
128
+ // CHECK: store ptr [[T0]], ptr [[A01]], align
129
+ // CHECK-NEXT: [[A1:%.*]] = getelementptr inbounds [2 x ptr ], ptr [[A0]], i64 1
130
+ // CHECK-NEXT: store ptr [[A1]],
131
+ // CHECK-NEXT: [[A10:%.*]] = getelementptr inbounds [2 x ptr ], ptr [[A1]], i64 0, i64 0
132
+ // CHECK-NEXT: store ptr [[A10]],
133
+ // CHECK-NEXT: [[T0:%.*]] = invoke noundef ptr @_Z12test5_helperj(i32 noundef 2)
134
+ // CHECK: store ptr [[T0]], ptr [[A10]], align
135
+ // CHECK-NEXT: [[A11:%.*]] = getelementptr inbounds ptr, ptr [[A10]], i64 1
136
+ // CHECK-NEXT: store ptr [[A11]],
137
+ // CHECK-NEXT: [[T0:%.*]] = invoke noundef ptr @_Z12test5_helperj(i32 noundef 3)
138
+ // CHECK: store ptr [[T0]], ptr [[A11]], align
156
139
157
140
// CHECK: attributes [[NUW]] = { nounwind }
0 commit comments