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