1*9880d681SAndroid Build Coastguard Worker; RUN: opt -inline < %s -S -o - -inline-threshold=8 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workertarget datalayout = "p:32:32" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.lifetime.start(i64 %size, i8* nocapture %ptr) 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker@glbl = external global i32 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerdefine void @outer1() { 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @outer1( 11*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @inner1 12*9880d681SAndroid Build Coastguard Worker %ptr = alloca i32 13*9880d681SAndroid Build Coastguard Worker call void @inner1(i32* %ptr) 14*9880d681SAndroid Build Coastguard Worker ret void 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerdefine void @inner1(i32 *%ptr) { 18*9880d681SAndroid Build Coastguard Worker %A = load i32, i32* %ptr 19*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %ptr 20*9880d681SAndroid Build Coastguard Worker %C = getelementptr inbounds i32, i32* %ptr, i32 0 21*9880d681SAndroid Build Coastguard Worker %D = getelementptr inbounds i32, i32* %ptr, i32 1 22*9880d681SAndroid Build Coastguard Worker %E = bitcast i32* %ptr to i8* 23*9880d681SAndroid Build Coastguard Worker %F = select i1 false, i32* %ptr, i32* @glbl 24*9880d681SAndroid Build Coastguard Worker call void @llvm.lifetime.start(i64 0, i8* %E) 25*9880d681SAndroid Build Coastguard Worker ret void 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerdefine void @outer2() { 29*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @outer2( 30*9880d681SAndroid Build Coastguard Worker; CHECK: call void @inner2 31*9880d681SAndroid Build Coastguard Worker %ptr = alloca i32 32*9880d681SAndroid Build Coastguard Worker call void @inner2(i32* %ptr) 33*9880d681SAndroid Build Coastguard Worker ret void 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker; %D poisons this call, scalar-repl can't handle that instruction. 37*9880d681SAndroid Build Coastguard Workerdefine void @inner2(i32 *%ptr) { 38*9880d681SAndroid Build Coastguard Worker %A = load i32, i32* %ptr 39*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %ptr 40*9880d681SAndroid Build Coastguard Worker %C = getelementptr inbounds i32, i32* %ptr, i32 0 41*9880d681SAndroid Build Coastguard Worker %D = getelementptr inbounds i32, i32* %ptr, i32 %A 42*9880d681SAndroid Build Coastguard Worker %E = bitcast i32* %ptr to i8* 43*9880d681SAndroid Build Coastguard Worker %F = select i1 false, i32* %ptr, i32* @glbl 44*9880d681SAndroid Build Coastguard Worker call void @llvm.lifetime.start(i64 0, i8* %E) 45*9880d681SAndroid Build Coastguard Worker ret void 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Workerdefine void @outer3() { 49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @outer3( 50*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @inner3 51*9880d681SAndroid Build Coastguard Worker %ptr = alloca i32 52*9880d681SAndroid Build Coastguard Worker call void @inner3(i32* %ptr, i1 undef) 53*9880d681SAndroid Build Coastguard Worker ret void 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerdefine void @inner3(i32 *%ptr, i1 %x) { 57*9880d681SAndroid Build Coastguard Worker %A = icmp eq i32* %ptr, null 58*9880d681SAndroid Build Coastguard Worker %B = and i1 %x, %A 59*9880d681SAndroid Build Coastguard Worker br i1 %A, label %bb.true, label %bb.false 60*9880d681SAndroid Build Coastguard Workerbb.true: 61*9880d681SAndroid Build Coastguard Worker ; This block musn't be counted in the inline cost. 62*9880d681SAndroid Build Coastguard Worker %t1 = load i32, i32* %ptr 63*9880d681SAndroid Build Coastguard Worker %t2 = add i32 %t1, 1 64*9880d681SAndroid Build Coastguard Worker %t3 = add i32 %t2, 1 65*9880d681SAndroid Build Coastguard Worker %t4 = add i32 %t3, 1 66*9880d681SAndroid Build Coastguard Worker %t5 = add i32 %t4, 1 67*9880d681SAndroid Build Coastguard Worker %t6 = add i32 %t5, 1 68*9880d681SAndroid Build Coastguard Worker %t7 = add i32 %t6, 1 69*9880d681SAndroid Build Coastguard Worker %t8 = add i32 %t7, 1 70*9880d681SAndroid Build Coastguard Worker %t9 = add i32 %t8, 1 71*9880d681SAndroid Build Coastguard Worker %t10 = add i32 %t9, 1 72*9880d681SAndroid Build Coastguard Worker %t11 = add i32 %t10, 1 73*9880d681SAndroid Build Coastguard Worker %t12 = add i32 %t11, 1 74*9880d681SAndroid Build Coastguard Worker %t13 = add i32 %t12, 1 75*9880d681SAndroid Build Coastguard Worker %t14 = add i32 %t13, 1 76*9880d681SAndroid Build Coastguard Worker %t15 = add i32 %t14, 1 77*9880d681SAndroid Build Coastguard Worker %t16 = add i32 %t15, 1 78*9880d681SAndroid Build Coastguard Worker %t17 = add i32 %t16, 1 79*9880d681SAndroid Build Coastguard Worker %t18 = add i32 %t17, 1 80*9880d681SAndroid Build Coastguard Worker %t19 = add i32 %t18, 1 81*9880d681SAndroid Build Coastguard Worker %t20 = add i32 %t19, 1 82*9880d681SAndroid Build Coastguard Worker ret void 83*9880d681SAndroid Build Coastguard Workerbb.false: 84*9880d681SAndroid Build Coastguard Worker ret void 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerdefine void @outer4(i32 %A) { 88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @outer4( 89*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @inner4 90*9880d681SAndroid Build Coastguard Worker %ptr = alloca i32 91*9880d681SAndroid Build Coastguard Worker call void @inner4(i32* %ptr, i32 %A) 92*9880d681SAndroid Build Coastguard Worker ret void 93*9880d681SAndroid Build Coastguard Worker} 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker; %B poisons this call, scalar-repl can't handle that instruction. However, we 96*9880d681SAndroid Build Coastguard Worker; still want to detect that the icmp and branch *can* be handled. 97*9880d681SAndroid Build Coastguard Workerdefine void @inner4(i32 *%ptr, i32 %A) { 98*9880d681SAndroid Build Coastguard Worker %B = getelementptr inbounds i32, i32* %ptr, i32 %A 99*9880d681SAndroid Build Coastguard Worker %C = icmp eq i32* %ptr, null 100*9880d681SAndroid Build Coastguard Worker br i1 %C, label %bb.true, label %bb.false 101*9880d681SAndroid Build Coastguard Workerbb.true: 102*9880d681SAndroid Build Coastguard Worker ; This block musn't be counted in the inline cost. 103*9880d681SAndroid Build Coastguard Worker %t1 = load i32, i32* %ptr 104*9880d681SAndroid Build Coastguard Worker %t2 = add i32 %t1, 1 105*9880d681SAndroid Build Coastguard Worker %t3 = add i32 %t2, 1 106*9880d681SAndroid Build Coastguard Worker %t4 = add i32 %t3, 1 107*9880d681SAndroid Build Coastguard Worker %t5 = add i32 %t4, 1 108*9880d681SAndroid Build Coastguard Worker %t6 = add i32 %t5, 1 109*9880d681SAndroid Build Coastguard Worker %t7 = add i32 %t6, 1 110*9880d681SAndroid Build Coastguard Worker %t8 = add i32 %t7, 1 111*9880d681SAndroid Build Coastguard Worker %t9 = add i32 %t8, 1 112*9880d681SAndroid Build Coastguard Worker %t10 = add i32 %t9, 1 113*9880d681SAndroid Build Coastguard Worker %t11 = add i32 %t10, 1 114*9880d681SAndroid Build Coastguard Worker %t12 = add i32 %t11, 1 115*9880d681SAndroid Build Coastguard Worker %t13 = add i32 %t12, 1 116*9880d681SAndroid Build Coastguard Worker %t14 = add i32 %t13, 1 117*9880d681SAndroid Build Coastguard Worker %t15 = add i32 %t14, 1 118*9880d681SAndroid Build Coastguard Worker %t16 = add i32 %t15, 1 119*9880d681SAndroid Build Coastguard Worker %t17 = add i32 %t16, 1 120*9880d681SAndroid Build Coastguard Worker %t18 = add i32 %t17, 1 121*9880d681SAndroid Build Coastguard Worker %t19 = add i32 %t18, 1 122*9880d681SAndroid Build Coastguard Worker %t20 = add i32 %t19, 1 123*9880d681SAndroid Build Coastguard Worker ret void 124*9880d681SAndroid Build Coastguard Workerbb.false: 125*9880d681SAndroid Build Coastguard Worker ret void 126*9880d681SAndroid Build Coastguard Worker} 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Workerdefine void @outer5() { 129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @outer5( 130*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @inner5 131*9880d681SAndroid Build Coastguard Worker %ptr = alloca i32 132*9880d681SAndroid Build Coastguard Worker call void @inner5(i1 false, i32* %ptr) 133*9880d681SAndroid Build Coastguard Worker ret void 134*9880d681SAndroid Build Coastguard Worker} 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Worker; %D poisons this call, scalar-repl can't handle that instruction. However, if 137*9880d681SAndroid Build Coastguard Worker; the flag is set appropriately, the poisoning instruction is inside of dead 138*9880d681SAndroid Build Coastguard Worker; code, and so shouldn't be counted. 139*9880d681SAndroid Build Coastguard Workerdefine void @inner5(i1 %flag, i32 *%ptr) { 140*9880d681SAndroid Build Coastguard Worker %A = load i32, i32* %ptr 141*9880d681SAndroid Build Coastguard Worker store i32 0, i32* %ptr 142*9880d681SAndroid Build Coastguard Worker %C = getelementptr inbounds i32, i32* %ptr, i32 0 143*9880d681SAndroid Build Coastguard Worker br i1 %flag, label %if.then, label %exit 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Workerif.then: 146*9880d681SAndroid Build Coastguard Worker %D = getelementptr inbounds i32, i32* %ptr, i32 %A 147*9880d681SAndroid Build Coastguard Worker %E = bitcast i32* %ptr to i8* 148*9880d681SAndroid Build Coastguard Worker %F = select i1 false, i32* %ptr, i32* @glbl 149*9880d681SAndroid Build Coastguard Worker call void @llvm.lifetime.start(i64 0, i8* %E) 150*9880d681SAndroid Build Coastguard Worker ret void 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workerexit: 153*9880d681SAndroid Build Coastguard Worker ret void 154*9880d681SAndroid Build Coastguard Worker} 155*9880d681SAndroid Build Coastguard Worker 156