xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/compare-alloca.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -instcombine -S %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Workertarget datalayout = "p:32:32"
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdefine i1 @alloca_argument_compare(i64* %arg) {
6*9880d681SAndroid Build Coastguard Worker  %alloc = alloca i64
7*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i64* %arg, %alloc
8*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
9*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: alloca_argument_compare
10*9880d681SAndroid Build Coastguard Worker  ; CHECK: ret i1 false
11*9880d681SAndroid Build Coastguard Worker}
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Workerdefine i1 @alloca_argument_compare_swapped(i64* %arg) {
14*9880d681SAndroid Build Coastguard Worker  %alloc = alloca i64
15*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i64* %alloc, %arg
16*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
17*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: alloca_argument_compare_swapped
18*9880d681SAndroid Build Coastguard Worker  ; CHECK: ret i1 false
19*9880d681SAndroid Build Coastguard Worker}
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerdefine i1 @alloca_argument_compare_ne(i64* %arg) {
22*9880d681SAndroid Build Coastguard Worker  %alloc = alloca i64
23*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i64* %arg, %alloc
24*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
25*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: alloca_argument_compare_ne
26*9880d681SAndroid Build Coastguard Worker  ; CHECK: ret i1 true
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerdefine i1 @alloca_argument_compare_derived_ptrs(i64* %arg, i64 %x) {
30*9880d681SAndroid Build Coastguard Worker  %alloc = alloca i64, i64 8
31*9880d681SAndroid Build Coastguard Worker  %p = getelementptr i64, i64* %arg, i64 %x
32*9880d681SAndroid Build Coastguard Worker  %q = getelementptr i64, i64* %alloc, i64 3
33*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i64* %p, %q
34*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
35*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: alloca_argument_compare_derived_ptrs
36*9880d681SAndroid Build Coastguard Worker  ; CHECK: ret i1 false
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Workerdeclare void @escape(i64*)
40*9880d681SAndroid Build Coastguard Workerdefine i1 @alloca_argument_compare_escaped_alloca(i64* %arg) {
41*9880d681SAndroid Build Coastguard Worker  %alloc = alloca i64
42*9880d681SAndroid Build Coastguard Worker  call void @escape(i64* %alloc)
43*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i64* %alloc, %arg
44*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
45*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: alloca_argument_compare_escaped_alloca
46*9880d681SAndroid Build Coastguard Worker  ; CHECK: %cmp = icmp eq i64* %alloc, %arg
47*9880d681SAndroid Build Coastguard Worker  ; CHECK: ret i1 %cmp
48*9880d681SAndroid Build Coastguard Worker}
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workerdeclare void @check_compares(i1, i1)
51*9880d681SAndroid Build Coastguard Workerdefine void @alloca_argument_compare_two_compares(i64* %p) {
52*9880d681SAndroid Build Coastguard Worker  %q = alloca i64, i64 8
53*9880d681SAndroid Build Coastguard Worker  %r = getelementptr i64, i64* %p, i64 1
54*9880d681SAndroid Build Coastguard Worker  %s = getelementptr i64, i64* %q, i64 2
55*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp eq i64* %p, %q
56*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp eq i64* %r, %s
57*9880d681SAndroid Build Coastguard Worker  call void @check_compares(i1 %cmp1, i1 %cmp2)
58*9880d681SAndroid Build Coastguard Worker  ret void
59*9880d681SAndroid Build Coastguard Worker  ; We will only fold if there is a single cmp.
60*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: alloca_argument_compare_two_compares
61*9880d681SAndroid Build Coastguard Worker  ; CHECK: call void @check_compares(i1 %cmp1, i1 %cmp2)
62*9880d681SAndroid Build Coastguard Worker}
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Workerdefine i1 @alloca_argument_compare_escaped_through_store(i64* %arg, i64** %ptr) {
65*9880d681SAndroid Build Coastguard Worker  %alloc = alloca i64
66*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i64* %alloc, %arg
67*9880d681SAndroid Build Coastguard Worker  %p = getelementptr i64, i64* %alloc, i64 1
68*9880d681SAndroid Build Coastguard Worker  store i64* %p, i64** %ptr
69*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
70*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: alloca_argument_compare_escaped_through_store
71*9880d681SAndroid Build Coastguard Worker  ; CHECK: %cmp = icmp eq i64* %alloc, %arg
72*9880d681SAndroid Build Coastguard Worker  ; CHECK: ret i1 %cmp
73*9880d681SAndroid Build Coastguard Worker}
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.lifetime.start(i64, i8* nocapture)
76*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.lifetime.end(i64, i8* nocapture)
77*9880d681SAndroid Build Coastguard Workerdefine i1 @alloca_argument_compare_benign_instrs(i8* %arg) {
78*9880d681SAndroid Build Coastguard Worker  %alloc = alloca i8
79*9880d681SAndroid Build Coastguard Worker  call void @llvm.lifetime.start(i64 1, i8* %alloc)
80*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8* %arg, %alloc
81*9880d681SAndroid Build Coastguard Worker  %x = load i8, i8* %arg
82*9880d681SAndroid Build Coastguard Worker  store i8 %x, i8* %alloc
83*9880d681SAndroid Build Coastguard Worker  call void @llvm.lifetime.end(i64 1, i8* %alloc)
84*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
85*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: alloca_argument_compare_benign_instrs
86*9880d681SAndroid Build Coastguard Worker  ; CHECK: ret i1 false
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdeclare i64* @allocator()
90*9880d681SAndroid Build Coastguard Workerdefine i1 @alloca_call_compare() {
91*9880d681SAndroid Build Coastguard Worker  %p = alloca i64
92*9880d681SAndroid Build Coastguard Worker  %q = call i64* @allocator()
93*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i64* %p, %q
94*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
95*9880d681SAndroid Build Coastguard Worker  ; CHECK-LABEL: alloca_call_compare
96*9880d681SAndroid Build Coastguard Worker  ; CHECK: ret i1 false
97*9880d681SAndroid Build Coastguard Worker}
98