xref: /llvm-project/llvm/test/Transforms/ObjCARC/gvn.ll (revision 01e4f41b43b57dee751146fde9992c660bd7c714)
1; RUN: opt -S -aa-pipeline=basic-aa,objc-arc-aa -passes=gvn < %s | FileCheck %s
2
3@x = common global ptr null, align 8
4
5declare ptr @llvm.objc.retain(ptr)
6declare i32 @llvm.objc.sync.enter(ptr)
7declare i32 @llvm.objc.sync.exit(ptr)
8
9; GVN should be able to eliminate this redundant load, with ARC-specific
10; alias analysis.
11
12; CHECK: define ptr @test0(i32 %n)
13; CHECK-NEXT: entry:
14; CHECK-NEXT: %s = load ptr, ptr @x
15; CHECK-NOT: load
16; CHECK: ret ptr %s
17; CHECK-NEXT: }
18define ptr @test0(i32 %n) nounwind {
19entry:
20  %s = load ptr, ptr @x
21  %0 = tail call ptr @llvm.objc.retain(ptr %s) nounwind
22  %t = load ptr, ptr @x
23  ret ptr %t
24}
25
26; GVN should not be able to eliminate this redundant load, with ARC-specific
27; alias analysis.
28
29; CHECK-LABEL: define ptr @test1(
30; CHECK: load
31; CHECK: load
32; CHECK: ret ptr %t
33; CHECK: }
34define ptr @test1(i32 %n) nounwind {
35entry:
36  %s = load ptr, ptr @x
37  %0 = call i32 @llvm.objc.sync.enter(ptr %s)
38  %t = load ptr, ptr @x
39  %1 = call i32 @llvm.objc.sync.exit(ptr %s)
40  ret ptr %t
41}
42