xref: /aosp_15_r20/external/llvm/test/Transforms/ObjCARC/gvn.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -basicaa -objc-arc-aa -gvn < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker@x = common global i8* null, align 8
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdeclare i8* @objc_retain(i8*)
6*9880d681SAndroid Build Coastguard Workerdeclare i32 @objc_sync_enter(i8*)
7*9880d681SAndroid Build Coastguard Workerdeclare i32 @objc_sync_exit(i8*)
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; GVN should be able to eliminate this redundant load, with ARC-specific
10*9880d681SAndroid Build Coastguard Worker; alias analysis.
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker; CHECK: define i8* @test0(i32 %n)
13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry:
14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %s = load i8*, i8** @x
15*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
16*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8* %s
17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: }
18*9880d681SAndroid Build Coastguard Workerdefine i8* @test0(i32 %n) nounwind {
19*9880d681SAndroid Build Coastguard Workerentry:
20*9880d681SAndroid Build Coastguard Worker  %s = load i8*, i8** @x
21*9880d681SAndroid Build Coastguard Worker  %0 = tail call i8* @objc_retain(i8* %s) nounwind
22*9880d681SAndroid Build Coastguard Worker  %t = load i8*, i8** @x
23*9880d681SAndroid Build Coastguard Worker  ret i8* %t
24*9880d681SAndroid Build Coastguard Worker}
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker; GVN should not be able to eliminate this redundant load, with ARC-specific
27*9880d681SAndroid Build Coastguard Worker; alias analysis.
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i8* @test1(
30*9880d681SAndroid Build Coastguard Worker; CHECK: load
31*9880d681SAndroid Build Coastguard Worker; CHECK: load
32*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8* %t
33*9880d681SAndroid Build Coastguard Worker; CHECK: }
34*9880d681SAndroid Build Coastguard Workerdefine i8* @test1(i32 %n) nounwind {
35*9880d681SAndroid Build Coastguard Workerentry:
36*9880d681SAndroid Build Coastguard Worker  %s = load i8*, i8** @x
37*9880d681SAndroid Build Coastguard Worker  %0 = call i32 @objc_sync_enter(i8* %s)
38*9880d681SAndroid Build Coastguard Worker  %t = load i8*, i8** @x
39*9880d681SAndroid Build Coastguard Worker  %1 = call i32 @objc_sync_exit(i8* %s)
40*9880d681SAndroid Build Coastguard Worker  ret i8* %t
41*9880d681SAndroid Build Coastguard Worker}
42