152 lines · plain
1; RUN: opt -passes=inline < %s -S -o - -inline-threshold=8 | FileCheck %s2; RUN: opt -passes='cgscc(inline)' < %s -S -o - -inline-threshold=8 | FileCheck %s3 4target datalayout = "p:32:32"5 6@glbl = external global i327 8define void @outer1() {9; CHECK-LABEL: @outer1(10; CHECK-NOT: call void @inner111 %ptr = alloca i3212 call void @inner1(ptr %ptr)13 ret void14}15 16define void @inner1(ptr %ptr) {17 %A = load i32, ptr %ptr18 store i32 0, ptr %ptr19 %D = getelementptr inbounds i32, ptr %ptr, i32 120 %F = select i1 false, ptr %ptr, ptr @glbl21 call void @extern()22 ret void23}24 25define void @outer2() {26; CHECK-LABEL: @outer2(27; CHECK: call void @inner228 %ptr = alloca i3229 call void @inner2(ptr %ptr)30 ret void31}32 33; %D poisons this call, scalar-repl can't handle that instruction.34define void @inner2(ptr %ptr) {35 %A = load i32, ptr %ptr36 store i32 0, ptr %ptr37 %D = getelementptr inbounds i32, ptr %ptr, i32 %A38 %F = select i1 false, ptr %ptr, ptr @glbl39 call void @extern()40 ret void41}42 43define void @outer3() {44; CHECK-LABEL: @outer3(45; CHECK-NOT: call void @inner346 %ptr = alloca i3247 call void @inner3(ptr %ptr, i1 undef)48 ret void49}50 51define void @inner3(ptr %ptr, i1 %x) {52 %A = icmp eq ptr %ptr, null53 %B = and i1 %x, %A54 call void @extern()55 br i1 %A, label %bb.true, label %bb.false56bb.true:57 ; This block musn't be counted in the inline cost.58 %t1 = load i32, ptr %ptr59 %t2 = add i32 %t1, 160 %t3 = add i32 %t2, 161 %t4 = add i32 %t3, 162 %t5 = add i32 %t4, 163 %t6 = add i32 %t5, 164 %t7 = add i32 %t6, 165 %t8 = add i32 %t7, 166 %t9 = add i32 %t8, 167 %t10 = add i32 %t9, 168 %t11 = add i32 %t10, 169 %t12 = add i32 %t11, 170 %t13 = add i32 %t12, 171 %t14 = add i32 %t13, 172 %t15 = add i32 %t14, 173 %t16 = add i32 %t15, 174 %t17 = add i32 %t16, 175 %t18 = add i32 %t17, 176 %t19 = add i32 %t18, 177 %t20 = add i32 %t19, 178 ret void79bb.false:80 ret void81}82 83define void @outer4(i32 %A) {84; CHECK-LABEL: @outer4(85; CHECK-NOT: call void @inner486 %ptr = alloca i3287 call void @inner4(ptr %ptr, i32 %A)88 ret void89}90 91; %B poisons this call, scalar-repl can't handle that instruction. However, we92; still want to detect that the icmp and branch *can* be handled.93define void @inner4(ptr %ptr, i32 %A) {94 %B = getelementptr inbounds i32, ptr %ptr, i32 %A95 %C = icmp eq ptr %ptr, null96 call void @extern()97 br i1 %C, label %bb.true, label %bb.false98bb.true:99 ; This block musn't be counted in the inline cost.100 %t1 = load i32, ptr %ptr101 %t2 = add i32 %t1, 1102 %t3 = add i32 %t2, 1103 %t4 = add i32 %t3, 1104 %t5 = add i32 %t4, 1105 %t6 = add i32 %t5, 1106 %t7 = add i32 %t6, 1107 %t8 = add i32 %t7, 1108 %t9 = add i32 %t8, 1109 %t10 = add i32 %t9, 1110 %t11 = add i32 %t10, 1111 %t12 = add i32 %t11, 1112 %t13 = add i32 %t12, 1113 %t14 = add i32 %t13, 1114 %t15 = add i32 %t14, 1115 %t16 = add i32 %t15, 1116 %t17 = add i32 %t16, 1117 %t18 = add i32 %t17, 1118 %t19 = add i32 %t18, 1119 %t20 = add i32 %t19, 1120 ret void121bb.false:122 ret void123}124 125define void @outer5() {126; CHECK-LABEL: @outer5(127; CHECK-NOT: call void @inner5128 %ptr = alloca i32129 call void @inner5(i1 false, ptr %ptr)130 ret void131}132 133; %D poisons this call, scalar-repl can't handle that instruction. However, if134; the flag is set appropriately, the poisoning instruction is inside of dead135; code, and so shouldn't be counted.136define void @inner5(i1 %flag, ptr %ptr) {137 %A = load i32, ptr %ptr138 store i32 0, ptr %ptr139 call void @extern()140 br i1 %flag, label %if.then, label %exit141 142if.then:143 %D = getelementptr inbounds i32, ptr %ptr, i32 %A144 %F = select i1 false, ptr %ptr, ptr @glbl145 ret void146 147exit:148 ret void149}150 151declare void @extern()152