Skip to content

Commit a96ab3c

Browse files
committed
[CGObjC] Allow clang.arc.attachedcall on -O0 on AArch64
It is supported in GlobalISel there. It is not supported on X86 GlobalISel.
1 parent 0198e8f commit a96ab3c

File tree

14 files changed

+452
-151
lines changed

14 files changed

+452
-151
lines changed

clang/lib/CodeGen/CGObjC.cpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2415,9 +2415,7 @@ static llvm::Value *emitOptimizedARCReturnCall(llvm::Value *value,
24152415
emitAutoreleasedReturnValueMarker(CGF);
24162416

24172417
// Add operand bundle "clang.arc.attachedcall" to the call instead of emitting
2418-
// retainRV or claimRV calls in the IR. We currently do this only when the
2419-
// optimization level isn't -O0 since global-isel, which is currently run at
2420-
// -O0, doesn't know about the operand bundle.
2418+
// retainRV or claimRV calls in the IR.
24212419
ObjCEntrypoints &EPs = CGF.CGM.getObjCEntrypoints();
24222420
llvm::Function *&EP = IsRetainRV
24232421
? EPs.objc_retainAutoreleasedReturnValue
@@ -2429,11 +2427,8 @@ static llvm::Value *emitOptimizedARCReturnCall(llvm::Value *value,
24292427

24302428
llvm::Triple::ArchType Arch = CGF.CGM.getTriple().getArch();
24312429

2432-
// FIXME: Do this on all targets and at -O0 too. This can be enabled only if
2433-
// the target backend knows how to handle the operand bundle.
2434-
if (CGF.CGM.getCodeGenOpts().OptimizationLevel > 0 &&
2435-
(Arch == llvm::Triple::aarch64 || Arch == llvm::Triple::aarch64_32 ||
2436-
Arch == llvm::Triple::x86_64)) {
2430+
if (Arch == llvm::Triple::x86_64 ||
2431+
(Arch == llvm::Triple::aarch64 || Arch == llvm::Triple::aarch64_32)) {
24372432
llvm::Value *bundleArgs[] = {EP};
24382433
llvm::OperandBundleDef OB("clang.arc.attachedcall", bundleArgs);
24392434
auto *oldCall = cast<llvm::CallBase>(value);

clang/test/CodeGenObjC/arc-arm.m

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
// RUN: %clang_cc1 -triple armv7-apple-darwin10 -emit-llvm -fblocks -fobjc-arc -o - %s | FileCheck %s
2-
// RUN: %clang_cc1 -triple arm64-apple-ios -emit-llvm -fblocks -fobjc-arc -o - %s | FileCheck %s
2+
// RUN: %clang_cc1 -triple arm64-apple-ios -emit-llvm -fblocks -fobjc-arc -o - %s | FileCheck %s -check-prefix=ARM64-ATTACHED
33

44
// use an autorelease marker on ARM64.
55

66
id test0(void) {
77
extern id test0_helper(void);
88
// CHECK: [[T0:%.*]] = call [[CC:(arm_aapcscc )?]]ptr @test0_helper()
99
// CHECK-NEXT: ret ptr [[T0]]
10+
// ARM64-ATTACHED: %call1 = call ptr @test0_helper() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
11+
// ARM64-ATTACHED: call void asm sideeffect "mov\09fp, fp\09\09// marker for objc_retainAutoreleaseReturnValue", ""()
12+
// ARM64-ATTACHED: call void (...) @llvm.objc.clang.arc.noop.use(ptr %call1) #2
13+
// ARM64-ATTACHED: %0 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %call1) #2
14+
// ARM64-ATTACHED: ret ptr %0
1015
return test0_helper();
1116
}
1217

@@ -18,6 +23,12 @@ void test1(void) {
1823
// CHECK-NEXT: store ptr [[T1]],
1924
// CHECK-NEXT: call [[CC]]void @llvm.objc.storeStrong(
2025
// CHECK-NEXT: ret void
26+
// ARM64-ATTACHED: %call1 = call ptr @test1_helper() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
27+
// ARM64-ATTACHED: call void asm sideeffect "mov\09fp, fp\09\09// marker for objc_retainAutoreleaseReturnValue", ""()
28+
// ARM64-ATTACHED: call void (...) @llvm.objc.clang.arc.noop.use(ptr %call1) #2
29+
// ARM64-ATTACHED: store ptr %call1,
30+
// ARM64-ATTACHED: call void @llvm.objc.storeStrong(
31+
// ARM64-ATTACHED: ret void
2132
id x = test1_helper();
2233
}
2334

@@ -26,12 +37,22 @@ void test1(void) {
2637
extern A *test2_helper(void);
2738
// CHECK: [[T0:%.*]] = call [[CC]]ptr @test2_helper()
2839
// CHECK-NEXT: ret ptr [[T0]]
40+
// ARM64-ATTACHED: %call1 = call ptr @test2_helper() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
41+
// ARM64-ATTACHED: call void asm sideeffect "mov\09fp, fp\09\09// marker for objc_retainAutoreleaseReturnValue", ""()
42+
// ARM64-ATTACHED: call void (...) @llvm.objc.clang.arc.noop.use(ptr %call1) #2
43+
// ARM64-ATTACHED: %0 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %call1) #2
44+
// ARM64-ATTACHED: ret ptr %0
2945
return test2_helper();
3046
}
3147

3248
id test3(void) {
3349
extern A *test3_helper(void);
3450
// CHECK: [[T0:%.*]] = call [[CC]]ptr @test3_helper()
3551
// CHECK-NEXT: ret ptr [[T0]]
52+
// ARM64-ATTACHED: %call1 = call ptr @test3_helper() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
53+
// ARM64-ATTACHED: call void asm sideeffect "mov\09fp, fp\09\09// marker for objc_retainAutoreleaseReturnValue", ""()
54+
// ARM64-ATTACHED: call void (...) @llvm.objc.clang.arc.noop.use(ptr %call1) #2
55+
// ARM64-ATTACHED: %0 = tail call ptr @llvm.objc.autoreleaseReturnValue(ptr %call1) #2
56+
// ARM64-ATTACHED: ret ptr %0
3657
return test3_helper();
3758
}

clang/test/CodeGenObjC/arc-foreach.m

Lines changed: 93 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -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

8888
void 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 }

clang/test/CodeGenObjC/arc-property.m

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,9 @@ - (id) copyMachine {
104104
return test3_helper();
105105
}
106106
// CHECK: define internal ptr @"\01-[Test3 copyMachine]"(
107-
// CHECK: [[T0:%.*]] = call ptr @test3_helper()
108-
// CHECK-NEXT: [[T1:%.*]] = notail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr [[T0]])
109-
// CHECK-NEXT: ret ptr [[T1]]
107+
// CHECK: %call1 = call ptr @test3_helper() [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
108+
// CHECK: call void (...) @llvm.objc.clang.arc.noop.use(ptr %call1) #1
109+
// CHECK: ret ptr %call1
110110
- (void) setCopyMachine: (id) x {}
111111
@end
112112

clang/test/CodeGenObjC/arc-related-result-type.m

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ void test0(Test0 *val) {
1313
// CHECK-NEXT: call void @llvm.objc.storeStrong(
1414
// CHECK-NEXT: load ptr, ptr [[VAL]],
1515
// CHECK-NEXT: load
16-
// CHECK-NEXT: [[T0:%.*]] = call ptr
17-
// CHECK-NEXT: [[T1:%.*]] = notail call ptr @llvm.objc.retainAutoreleasedReturnValue(ptr [[T0]])
18-
// CHECK-NEXT: store ptr [[T1]], ptr [[X]]
16+
// CHECK-NEXT: %call1 = call ptr @objc_msgSend(ptr noundef %0, ptr noundef %1) [ "clang.arc.attachedcall"(ptr @llvm.objc.retainAutoreleasedReturnValue) ]
17+
// CHECK-NEXT: call void (...) @llvm.objc.clang.arc.noop.use(ptr %call1) #1
18+
// CHECK-NEXT: store ptr %call1, ptr %x, align 8
1919
// CHECK-NEXT: call void @llvm.objc.storeStrong(ptr [[X]], ptr null)
2020
// CHECK-NEXT: call void @llvm.objc.storeStrong(ptr [[VAL]], ptr null)
2121
// CHECK-NEXT: ret void

0 commit comments

Comments
 (0)