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