@@ -20,95 +20,95 @@ void test0(NSArray *array) {
2020 }
2121}
2222
23- // CHECK-LP64-LABEL: define{{.*}} void @test0(
24- // CHECK-LP64: [[ARRAY:%.*]] = alloca ptr,
25- // CHECK-LP64-NEXT: [[X:%.*]] = alloca ptr,
26- // CHECK-LP64-NEXT: [[STATE:%.*]] = alloca [[STATE_T:%.*]],
27- // CHECK-LP64-NEXT: [[BUFFER:%.*]] = alloca [16 x ptr], align 8
28- // CHECK-LP64-NEXT: [[BLOCK:%.*]] = alloca [[BLOCK_T:<{.*}>]],
23+ // CHECK-LP64-ATTACHED- LABEL: define{{.*}} void @test0(
24+ // CHECK-LP64-ATTACHED : [[ARRAY:%.*]] = alloca ptr,
25+ // CHECK-LP64-ATTACHED- NEXT: [[X:%.*]] = alloca ptr,
26+ // CHECK-LP64-ATTACHED- NEXT: [[STATE:%.*]] = alloca [[STATE_T:%.*]],
27+ // CHECK-LP64-ATTACHED- NEXT: [[BUFFER:%.*]] = alloca [16 x ptr], align 8
28+ // CHECK-LP64-ATTACHED- NEXT: [[BLOCK:%.*]] = alloca [[BLOCK_T:<{.*}>]],
2929
3030// CHECK-LP64-OPT-LABEL: define{{.*}} void @test0
3131// CHECK-LP64-OPT: [[STATE:%.*]] = alloca [[STATE_T:%.*]], align 8
3232// CHECK-LP64-OPT-NEXT: [[BUFFER:%.*]] = alloca [16 x ptr], align 8
3333// CHECK-LP64-OPT-NEXT: [[BLOCK:%.*]] = alloca [[BLOCK_T:<{.*}>]], align 8
3434
3535// Initialize 'array'.
36- // CHECK-LP64-NEXT: store ptr null, ptr [[ARRAY]]
37- // CHECK-LP64-NEXT: call void @llvm.objc.storeStrong(ptr [[ARRAY]], ptr {{%.*}}) [[NUW:#[0-9]+]]
36+ // CHECK-LP64-ATTACHED- NEXT: store ptr null, ptr [[ARRAY]]
37+ // CHECK-LP64-ATTACHED- NEXT: call void @llvm.objc.storeStrong(ptr [[ARRAY]], ptr {{%.*}}) [[NUW:#[0-9]+]]
3838
3939// Initialize the fast enumaration state.
40- // CHECK-LP64-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[STATE]], i8 0, i64 64, i1 false)
40+ // CHECK-LP64-ATTACHED- NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[STATE]], i8 0, i64 64, i1 false)
4141
4242// Evaluate the collection expression and retain.
43- // CHECK-LP64-NEXT: [[T0:%.*]] = load ptr, ptr [[ARRAY]], align 8
44- // CHECK-LP64-NEXT: [[SAVED_ARRAY:%.*]] = call ptr @llvm.objc.retain(ptr [[T0]])
43+ // CHECK-LP64-ATTACHED- NEXT: [[T0:%.*]] = load ptr, ptr [[ARRAY]], align 8
44+ // CHECK-LP64-ATTACHED- NEXT: [[SAVED_ARRAY:%.*]] = call ptr @llvm.objc.retain(ptr [[T0]])
4545
4646// Call the enumeration method.
47- // CHECK-LP64-NEXT: [[T1:%.*]] = load ptr, ptr @OBJC_SELECTOR_REFERENCES_
48- // CHECK-LP64-NEXT: [[SIZE:%.*]] = call i64 @objc_msgSend(ptr [[SAVED_ARRAY]], ptr [[T1]], ptr [[STATE]], ptr [[BUFFER]], i64 16)
47+ // CHECK-LP64-ATTACHED- NEXT: [[T1:%.*]] = load ptr, ptr @OBJC_SELECTOR_REFERENCES_
48+ // CHECK-LP64-ATTACHED- NEXT: [[SIZE:%.*]] = call i64 @objc_msgSend(ptr [[SAVED_ARRAY]], ptr [[T1]], ptr [[STATE]], ptr [[BUFFER]], i64 16)
4949
5050// Check for a nonzero result.
51- // CHECK-LP64-NEXT: [[T0:%.*]] = icmp eq i64 [[SIZE]], 0
52- // CHECK-LP64-NEXT: br i1 [[T0]]
53-
54- // CHECK-LP64: [[T0:%.*]] = getelementptr inbounds nuw [[STATE_T]], ptr [[STATE]], i32 0, i32 1
55- // CHECK-LP64-NEXT: [[T1:%.*]] = load ptr, ptr [[T0]]
56- // CHECK-LP64-NEXT: [[T2:%.*]] = getelementptr inbounds ptr, ptr [[T1]], i64
57- // CHECK-LP64-NEXT: [[T3:%.*]] = load ptr, ptr [[T2]]
58- // CHECK-LP64-NEXT: store ptr [[T3]], ptr [[X]]
59-
60- // CHECK-LP64: [[CAPTURED:%.*]] = getelementptr inbounds nuw [[BLOCK_T]], ptr [[BLOCK]], i32 0, i32 5
61- // CHECK-LP64-NEXT: [[T1:%.*]] = load ptr, ptr [[X]]
62- // CHECK-LP64-NEXT: [[T2:%.*]] = call ptr @llvm.objc.retain(ptr [[T1]])
63- // CHECK-LP64-NEXT: store ptr [[T2]], ptr [[CAPTURED]]
64- // CHECK-LP64-NEXT: call void @use_block(ptr [[BLOCK]])
65- // CHECK-LP64-NEXT: call void @llvm.objc.storeStrong(ptr [[CAPTURED]], ptr null)
66- // CHECK-LP64-NOT: call void (...) @llvm.objc.clang.arc.use(
51+ // CHECK-LP64-ATTACHED- NEXT: [[T0:%.*]] = icmp eq i64 [[SIZE]], 0
52+ // CHECK-LP64-ATTACHED- NEXT: br i1 [[T0]]
53+
54+ // CHECK-LP64-ATTACHED : [[T0:%.*]] = getelementptr inbounds nuw [[STATE_T]], ptr [[STATE]], i32 0, i32 1
55+ // CHECK-LP64-ATTACHED- NEXT: [[T1:%.*]] = load ptr, ptr [[T0]]
56+ // CHECK-LP64-ATTACHED- NEXT: [[T2:%.*]] = getelementptr inbounds ptr, ptr [[T1]], i64
57+ // CHECK-LP64-ATTACHED- NEXT: [[T3:%.*]] = load ptr, ptr [[T2]]
58+ // CHECK-LP64-ATTACHED- NEXT: store ptr [[T3]], ptr [[X]]
59+
60+ // CHECK-LP64-ATTACHED : [[CAPTURED:%.*]] = getelementptr inbounds nuw [[BLOCK_T]], ptr [[BLOCK]], i32 0, i32 5
61+ // CHECK-LP64-ATTACHED- NEXT: [[T1:%.*]] = load ptr, ptr [[X]]
62+ // CHECK-LP64-ATTACHED- NEXT: [[T2:%.*]] = call ptr @llvm.objc.retain(ptr [[T1]])
63+ // CHECK-LP64-ATTACHED- NEXT: store ptr [[T2]], ptr [[CAPTURED]]
64+ // CHECK-LP64-ATTACHED- NEXT: call void @use_block(ptr [[BLOCK]])
65+ // CHECK-LP64-ATTACHED- NEXT: call void @llvm.objc.storeStrong(ptr [[CAPTURED]], ptr null)
66+ // CHECK-LP64-ATTACHED- NOT: call void (...) @llvm.objc.clang.arc.use(
6767
6868// CHECK-LP64-OPT: [[D0:%.*]] = getelementptr inbounds nuw i8, ptr [[BLOCK]], i64 32
6969// CHECK-LP64-OPT: [[CAPTURE:%.*]] = load ptr, ptr [[D0]]
7070// CHECK-LP64-OPT: call void (...) @llvm.objc.clang.arc.use(ptr [[CAPTURE]])
7171
72- // CHECK-LP64: [[T1:%.*]] = load ptr, ptr @OBJC_SELECTOR_REFERENCES_
73- // CHECK-LP64-NEXT: [[SIZE:%.*]] = call i64 @objc_msgSend(ptr [[SAVED_ARRAY]], ptr [[T1]], ptr [[STATE]], ptr [[BUFFER]], i64 16)
72+ // CHECK-LP64-ATTACHED : [[T1:%.*]] = load ptr, ptr @OBJC_SELECTOR_REFERENCES_
73+ // CHECK-LP64-ATTACHED- NEXT: [[SIZE:%.*]] = call i64 @objc_msgSend(ptr [[SAVED_ARRAY]], ptr [[T1]], ptr [[STATE]], ptr [[BUFFER]], i64 16)
7474
7575// Release the array.
76- // CHECK-LP64: call void @llvm.objc.release(ptr [[SAVED_ARRAY]])
76+ // CHECK-LP64-ATTACHED : call void @llvm.objc.release(ptr [[SAVED_ARRAY]])
7777
7878// Destroy 'array'.
79- // CHECK-LP64: call void @llvm.objc.storeStrong(ptr [[ARRAY]], ptr null)
80- // CHECK-LP64-NEXT: ret void
79+ // CHECK-LP64-ATTACHED : call void @llvm.objc.storeStrong(ptr [[ARRAY]], ptr null)
80+ // CHECK-LP64-ATTACHED- NEXT: ret void
8181
82- // CHECK-LP64-LABEL: define internal void @__test0_block_invoke
83- // CHECK-LP64-NOT: ret
84- // CHECK-LP64: [[T0:%.*]] = getelementptr inbounds nuw [[BLOCK_T]], ptr {{%.*}}, i32 0, i32 5
85- // CHECK-LP64-NEXT: [[T2:%.*]] = load ptr, ptr [[T0]], align 8
86- // CHECK-LP64-NEXT: call void @use(ptr [[T2]])
82+ // CHECK-LP64-ATTACHED- LABEL: define internal void @__test0_block_invoke
83+ // CHECK-LP64-ATTACHED- NOT: ret
84+ // CHECK-LP64-ATTACHED : [[T0:%.*]] = getelementptr inbounds nuw [[BLOCK_T]], ptr {{%.*}}, i32 0, i32 5
85+ // CHECK-LP64-ATTACHED- NEXT: [[T2:%.*]] = load ptr, ptr [[T0]], align 8
86+ // CHECK-LP64-ATTACHED- NEXT: call void @use(ptr [[T2]])
8787
8888void test1 (NSArray *array) {
8989 for (__weak id x in array) {
9090 use_block (^{ use (x); });
9191 }
9292}
9393
94- // CHECK-LP64-LABEL: define{{.*}} void @test1(
95- // CHECK-LP64: alloca ptr,
96- // CHECK-LP64-NEXT: [[X:%.*]] = alloca ptr,
97- // CHECK-LP64-NEXT: [[STATE:%.*]] = alloca [[STATE_T:%.*]],
98- // CHECK-LP64-NEXT: alloca [16 x ptr], align 8
99- // CHECK-LP64-NEXT: [[BLOCK:%.*]] = alloca [[BLOCK_T:<{.*}>]],
100-
101- // CHECK-LP64: [[T0:%.*]] = getelementptr inbounds nuw [[STATE_T]], ptr [[STATE]], i32 0, i32 1
102- // CHECK-LP64-NEXT: [[T1:%.*]] = load ptr, ptr [[T0]]
103- // CHECK-LP64-NEXT: [[T2:%.*]] = getelementptr inbounds ptr, ptr [[T1]], i64
104- // CHECK-LP64-NEXT: [[T3:%.*]] = load ptr, ptr [[T2]]
105- // CHECK-LP64-NEXT: call ptr @llvm.objc.initWeak(ptr [[X]], ptr [[T3]])
106-
107- // CHECK-LP64: [[T0:%.*]] = getelementptr inbounds nuw [[BLOCK_T]], ptr [[BLOCK]], i32 0, i32 5
108- // CHECK-LP64: call void @llvm.objc.copyWeak(ptr [[T0]], ptr [[X]])
109- // CHECK-LP64: call void @use_block
110- // CHECK-LP64-NEXT: call void @llvm.objc.destroyWeak(ptr [[T0]])
111- // CHECK-LP64-NEXT: call void @llvm.objc.destroyWeak(ptr [[X]])
94+ // CHECK-LP64-ATTACHED- LABEL: define{{.*}} void @test1(
95+ // CHECK-LP64-ATTACHED : alloca ptr,
96+ // CHECK-LP64-ATTACHED- NEXT: [[X:%.*]] = alloca ptr,
97+ // CHECK-LP64-ATTACHED- NEXT: [[STATE:%.*]] = alloca [[STATE_T:%.*]],
98+ // CHECK-LP64-ATTACHED- NEXT: alloca [16 x ptr], align 8
99+ // CHECK-LP64-ATTACHED- NEXT: [[BLOCK:%.*]] = alloca [[BLOCK_T:<{.*}>]],
100+
101+ // CHECK-LP64-ATTACHED : [[T0:%.*]] = getelementptr inbounds nuw [[STATE_T]], ptr [[STATE]], i32 0, i32 1
102+ // CHECK-LP64-ATTACHED- NEXT: [[T1:%.*]] = load ptr, ptr [[T0]]
103+ // CHECK-LP64-ATTACHED- NEXT: [[T2:%.*]] = getelementptr inbounds ptr, ptr [[T1]], i64
104+ // CHECK-LP64-ATTACHED- NEXT: [[T3:%.*]] = load ptr, ptr [[T2]]
105+ // CHECK-LP64-ATTACHED- NEXT: call ptr @llvm.objc.initWeak(ptr [[X]], ptr [[T3]])
106+
107+ // CHECK-LP64-ATTACHED : [[T0:%.*]] = getelementptr inbounds nuw [[BLOCK_T]], ptr [[BLOCK]], i32 0, i32 5
108+ // CHECK-LP64-ATTACHED : call void @llvm.objc.copyWeak(ptr [[T0]], ptr [[X]])
109+ // CHECK-LP64-ATTACHED : call void @use_block
110+ // CHECK-LP64-ATTACHED- NEXT: call void @llvm.objc.destroyWeak(ptr [[T0]])
111+ // CHECK-LP64-ATTACHED- NEXT: call void @llvm.objc.destroyWeak(ptr [[X]])
112112
113113@interface Test2
114114- (NSArray *) array ;
@@ -120,19 +120,19 @@ void test2(Test2 *a) {
120120}
121121
122122// CHECK-LP64-LABEL: define{{.*}} void @test2(
123- // CHECK-LP64: [[T0:%.*]] = call ptr @objc_msgSend(
124- // CHECK-LP64-NEXT: [[T2:%.*]] = notail call ptr @llvm.objc.retainAutoreleasedReturnValue (ptr [[T0]])
123+ // CHECK-LP64: %call1 = call ptr @objc_msgSend(ptr %0, ptr %1) [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
124+ // CHECK-LP64: call void (...) @llvm.objc.clang.arc.noop.use (ptr %call1) #1
125125
126126// Make sure it's not immediately released before starting the iteration.
127127// CHECK-LP64-NEXT: load ptr, ptr @OBJC_SELECTOR_REFERENCES_
128128// CHECK-LP64-NEXT: @objc_msgSend
129129
130- // CHECK-LP64: @objc_enumerationMutation
130+ // CHECK-LP64-ATTACHED : @objc_enumerationMutation
131131
132- // CHECK-LP64: load ptr, ptr @OBJC_SELECTOR_REFERENCES_
133- // CHECK-LP64-NEXT: @objc_msgSend
132+ // CHECK-LP64-ATTACHED : load ptr, ptr @OBJC_SELECTOR_REFERENCES_
133+ // CHECK-LP64-ATTACHED- NEXT: @objc_msgSend
134134
135- // CHECK-LP64: call void @llvm.objc.release(ptr [[T2]])
135+ // CHECK-LP64-ATTACHED : call void @llvm.objc.release(ptr [[T2]])
136136
137137
138138// Check that the 'continue' label is positioned appropriately
@@ -143,16 +143,16 @@ void test3(NSArray *array) {
143143 use (x);
144144 }
145145
146- // CHECK-LP64-LABEL: define{{.*}} void @test3(
147- // CHECK-LP64: [[ARRAY:%.*]] = alloca ptr, align 8
148- // CHECK-LP64-NEXT: [[X:%.*]] = alloca ptr, align 8
149- // CHECK-LP64: [[T0:%.*]] = load ptr, ptr [[X]], align 8
150- // CHECK-LP64-NEXT: [[T1:%.*]] = icmp ne ptr [[T0]], null
151- // CHECK-LP64-NEXT: br i1 [[T1]],
152- // CHECK-LP64: br label [[L:%[^ ]+]]
153- // CHECK-LP64: [[T0:%.*]] = load ptr, ptr [[X]], align 8
154- // CHECK-LP64-NEXT: call void @use(ptr [[T0]])
155- // CHECK-LP64-NEXT: br label [[L]]
146+ // CHECK-LP64-ATTACHED- LABEL: define{{.*}} void @test3(
147+ // CHECK-LP64-ATTACHED : [[ARRAY:%.*]] = alloca ptr, align 8
148+ // CHECK-LP64-ATTACHED- NEXT: [[X:%.*]] = alloca ptr, align 8
149+ // CHECK-LP64-ATTACHED : [[T0:%.*]] = load ptr, ptr [[X]], align 8
150+ // CHECK-LP64-ATTACHED- NEXT: [[T1:%.*]] = icmp ne ptr [[T0]], null
151+ // CHECK-LP64-ATTACHED- NEXT: br i1 [[T1]],
152+ // CHECK-LP64-ATTACHED : br label [[L:%[^ ]+]]
153+ // CHECK-LP64-ATTACHED : [[T0:%.*]] = load ptr, ptr [[X]], align 8
154+ // CHECK-LP64-ATTACHED- NEXT: call void @use(ptr [[T0]])
155+ // CHECK-LP64-ATTACHED- NEXT: br label [[L]]
156156}
157157
158158@interface NSObject @end
@@ -178,36 +178,36 @@ - (void) foo2 {
178178}
179179@end
180180
181- // CHECK-LP64-LABEL: define internal void @"\01-[I1 foo2]"(
182- // CHECK-LP64: [[SELF_ADDR:%.*]] = alloca ptr,
183- // CHECK-LP64: [[BLOCK:%.*]] = alloca <{ ptr, i32, i32, ptr, ptr, ptr }>,
184- // CHECK-LP64: store ptr %self, ptr [[SELF_ADDR]]
185- // CHECK-LP64: [[BC:%.*]] = getelementptr inbounds nuw <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr [[BLOCK]], i32 0, i32 5
186- // CHECK-LP64: [[T1:%.*]] = load ptr, ptr [[SELF_ADDR]]
187- // CHECK-LP64: call ptr @llvm.objc.retain(ptr [[T1]])
181+ // CHECK-LP64-ATTACHED- LABEL: define internal void @"\01-[I1 foo2]"(
182+ // CHECK-LP64-ATTACHED : [[SELF_ADDR:%.*]] = alloca ptr,
183+ // CHECK-LP64-ATTACHED : [[BLOCK:%.*]] = alloca <{ ptr, i32, i32, ptr, ptr, ptr }>,
184+ // CHECK-LP64-ATTACHED : store ptr %self, ptr [[SELF_ADDR]]
185+ // CHECK-LP64-ATTACHED : [[BC:%.*]] = getelementptr inbounds nuw <{ ptr, i32, i32, ptr, ptr, ptr }>, ptr [[BLOCK]], i32 0, i32 5
186+ // CHECK-LP64-ATTACHED : [[T1:%.*]] = load ptr, ptr [[SELF_ADDR]]
187+ // CHECK-LP64-ATTACHED : call ptr @llvm.objc.retain(ptr [[T1]])
188188
189189// CHECK-LP64-OPT-LABEL: define internal void @"\01-[I1 foo2]"(
190190// CHECK-LP64-OPT: ptr %self
191191// CHECK-LP64-OPT: [[BLOCK:%.*]] = alloca [[BLOCK_T:<{.*}>]],
192192// CHECK-LP64-OPT: [[T0:%.*]] = getelementptr inbounds nuw i8, ptr [[BLOCK]], i64 32
193193
194- // CHECK-LP64: call void @llvm.objc.storeStrong(ptr [[BC]], ptr null)
195- // CHECK-LP64-NOT: call void (...) @llvm.objc.clang.arc.use(ptr [[BC]])
196- // CHECK-LP64: switch i32 {{%.*}}, label %[[UNREACHABLE:.*]] [
197- // CHECK-LP64-NEXT: i32 0, label %[[CLEANUP_CONT:.*]]
198- // CHECK-LP64-NEXT: i32 2, label %[[FORCOLL_END:.*]]
199- // CHECK-LP64-NEXT: ]
194+ // CHECK-LP64-ATTACHED : call void @llvm.objc.storeStrong(ptr [[BC]], ptr null)
195+ // CHECK-LP64-ATTACHED- NOT: call void (...) @llvm.objc.clang.arc.use(ptr [[BC]])
196+ // CHECK-LP64-ATTACHED : switch i32 {{%.*}}, label %[[UNREACHABLE:.*]] [
197+ // CHECK-LP64-ATTACHED- NEXT: i32 0, label %[[CLEANUP_CONT:.*]]
198+ // CHECK-LP64-ATTACHED- NEXT: i32 2, label %[[FORCOLL_END:.*]]
199+ // CHECK-LP64-ATTACHED- NEXT: ]
200200
201201// CHECK-LP64-OPT: [[T5:%.*]] = load ptr, ptr [[T0]]
202202// CHECK-LP64-OPT: call void (...) @llvm.objc.clang.arc.use(ptr [[T5]])
203203
204- // CHECK-LP64: {{^|:}}[[CLEANUP_CONT]]
205- // CHECK-LP64-NEXT: br label %[[FORCOLL_END]]
204+ // CHECK-LP64-ATTACHED : {{^|:}}[[CLEANUP_CONT]]
205+ // CHECK-LP64-ATTACHED- NEXT: br label %[[FORCOLL_END]]
206206
207- // CHECK-LP64: {{^|:}}[[FORCOLL_END]]
208- // CHECK-LP64-NEXT: ret void
207+ // CHECK-LP64-ATTACHED : {{^|:}}[[FORCOLL_END]]
208+ // CHECK-LP64-ATTACHED- NEXT: ret void
209209
210- // CHECK-LP64: {{^|:}}[[UNREACHABLE]]
211- // CHECK-LP64-NEXT: unreachable
210+ // CHECK-LP64-ATTACHED : {{^|:}}[[UNREACHABLE]]
211+ // CHECK-LP64-ATTACHED- NEXT: unreachable
212212
213- // CHECK-LP64: attributes [[NUW]] = { nounwind }
213+ // CHECK-LP64-ATTACHED : attributes [[NUW]] = { nounwind }
0 commit comments