brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.5 KiB · 45ff527 Raw
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