202 lines · plain
1; RUN: opt -passes=inline < %s -S -o - -inline-threshold=3 | FileCheck %s2 3target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"4target triple = "x86_64-unknown-linux-gnu"5 6declare void @pad() readnone7 8define void @outer1(ptr %a) {9; CHECK-LABEL: @outer1(10; CHECK-NOT: call void @inner111 %b = alloca i3212 call void @inner1(ptr %a, ptr %b)13 ret void14}15 16define void @inner1(ptr %a, ptr %b) {17 %1 = load i32, ptr %a18 store i32 %1, ptr %b ; This store does not clobber the first load.19 %2 = load i32, ptr %a20 call void @pad()21 %3 = load i32, ptr %a22 ret void23}24 25 26define void @outer2(ptr %a, ptr %b) {27; CHECK-LABEL: @outer2(28; CHECK: call void @inner229 call void @inner2(ptr %a, ptr %b)30 ret void31}32 33define void @inner2(ptr %a, ptr %b) {34 %1 = load i32, ptr %a35 store i32 %1, ptr %b ; This store clobbers the first load.36 %2 = load i32, ptr %a37 call void @pad()38 ret void39}40 41 42define void @outer3(ptr %a) {43; CHECK-LABEL: @outer3(44; CHECK: call void @inner345 call void @inner3(ptr %a)46 ret void47}48 49declare void @ext()50 51define void @inner3(ptr %a) {52 %1 = load i32, ptr %a53 call void @ext() ; This call clobbers the first load.54 %2 = load i32, ptr %a55 ret void56}57 58 59define void @outer4(ptr %a, ptr %b, ptr %c) {60; CHECK-LABEL: @outer4(61; CHECK-NOT: call void @inner462 call void @inner4(ptr %a, ptr %b, i1 false)63 ret void64}65 66define void @inner4(ptr %a, ptr %b, i1 %pred) {67 %1 = load i32, ptr %a68 br i1 %pred, label %cond_true, label %cond_false69 70cond_true:71 store i32 %1, ptr %b ; This store does not clobber the first load.72 br label %cond_false73 74cond_false:75 %2 = load i32, ptr %a76 call void @pad()77 %3 = load i32, ptr %a78 %4 = load i32, ptr %a79 ret void80}81 82 83define void @outer5(ptr %a, double %b) {84; CHECK-LABEL: @outer5(85; CHECK-NOT: call void @inner586 call void @inner5(ptr %a, double %b)87 ret void88}89 90declare double @llvm.fabs.f64(double) nounwind readnone91 92define void @inner5(ptr %a, double %b) {93 %1 = load i32, ptr %a94 %2 = call double @llvm.fabs.f64(double %b) ; This intrinsic does not clobber the first load.95 %3 = load i32, ptr %a96 call void @pad()97 ret void98}99 100define void @outer6(ptr %a, ptr %ptr) {101; CHECK-LABEL: @outer6(102; CHECK-NOT: call void @inner6103 call void @inner6(ptr %a, ptr %ptr)104 ret void105}106 107define void @inner6(ptr %a, ptr %ptr) {108 %1 = load i32, ptr %a109 %2 = load i32, ptr %a110 call void @pad()111 %3 = load i32, ptr %a112 ret void113}114 115define void @outer7(ptr %a) {116; CHECK-LABEL: @outer7(117; CHECK-NOT: call void @inner7118 call void @inner7(ptr %a)119 ret void120}121 122declare void @ext2() readnone123 124define void @inner7(ptr %a) {125 %1 = load i32, ptr %a126 call void @ext2() ; This call does not clobber the first load.127 %2 = load i32, ptr %a128 ret void129}130 131 132define void @outer8(ptr %a) {133; CHECK-LABEL: @outer8(134; CHECK-NOT: call void @inner8135 call void @inner8(ptr %a, ptr @ext2)136 ret void137}138 139define void @inner8(ptr %a, ptr %f) {140 %1 = load i32, ptr %a141 call void %f() ; This indirect call does not clobber the first load.142 %2 = load i32, ptr %a143 call void @pad()144 call void @pad()145 call void @pad()146 call void @pad()147 call void @pad()148 call void @pad()149 call void @pad()150 call void @pad()151 call void @pad()152 call void @pad()153 call void @pad()154 call void @pad()155 ret void156}157 158 159define void @outer9(ptr %a) {160; CHECK-LABEL: @outer9(161; CHECK: call void @inner9162 call void @inner9(ptr %a, ptr @ext)163 ret void164}165 166define void @inner9(ptr %a, ptr %f) {167 %1 = load i32, ptr %a168 call void %f() ; This indirect call clobbers the first load.169 %2 = load i32, ptr %a170 call void @pad()171 call void @pad()172 call void @pad()173 call void @pad()174 call void @pad()175 call void @pad()176 call void @pad()177 call void @pad()178 call void @pad()179 call void @pad()180 call void @pad()181 call void @pad()182 ret void183}184 185 186define void @outer10(ptr %a) {187; CHECK-LABEL: @outer10(188; CHECK: call void @inner10189 %b = alloca i32190 call void @inner10(ptr %a, ptr %b)191 ret void192}193 194define void @inner10(ptr %a, ptr %b) {195 %1 = load i32, ptr %a196 store i32 %1, ptr %b197 %2 = load volatile i32, ptr %a ; volatile load should be kept.198 call void @pad()199 %3 = load volatile i32, ptr %a ; Same as the above.200 ret void201}202