diff options
Diffstat (limited to 'test/Transforms/Inline/inline_constprop.ll')
-rw-r--r-- | test/Transforms/Inline/inline_constprop.ll | 123 |
1 files changed, 73 insertions, 50 deletions
diff --git a/test/Transforms/Inline/inline_constprop.ll b/test/Transforms/Inline/inline_constprop.ll index cc7aaac..dc35b60 100644 --- a/test/Transforms/Inline/inline_constprop.ll +++ b/test/Transforms/Inline/inline_constprop.ll @@ -1,4 +1,4 @@ -; RUN: opt < %s -inline -S | FileCheck %s +; RUN: opt < %s -inline -inline-threshold=20 -S | FileCheck %s define internal i32 @callee1(i32 %A, i32 %B) { %C = sdiv i32 %A, %B @@ -14,17 +14,18 @@ define i32 @caller1() { } define i32 @caller2() { +; Check that we can constant-prop through instructions after inlining callee21 +; to get constants in the inlined callsite to callee22. +; FIXME: Currently, the threshold is fixed at 20 because we don't perform +; *recursive* cost analysis to realize that the nested call site will definitely +; inline and be cheap. We should eventually do that and lower the threshold here +; to 1. +; ; CHECK: @caller2 ; CHECK-NOT: call void @callee2 ; CHECK: ret -; We contrive to make this hard for *just* the inline pass to do in order to -; simulate what can actually happen with large, complex functions getting -; inlined. - %a = add i32 42, 0 - %b = add i32 48, 0 - - %x = call i32 @callee21(i32 %a, i32 %b) + %x = call i32 @callee21(i32 42, i32 48) ret i32 %x } @@ -41,49 +42,71 @@ define i32 @callee22(i32 %x) { br i1 %icmp, label %bb.true, label %bb.false bb.true: ; This block musn't be counted in the inline cost. - %ptr = call i8* @getptr() - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr - load volatile i8* %ptr + %x1 = add i32 %x, 1 + %x2 = add i32 %x1, 1 + %x3 = add i32 %x2, 1 + %x4 = add i32 %x3, 1 + %x5 = add i32 %x4, 1 + %x6 = add i32 %x5, 1 + %x7 = add i32 %x6, 1 + %x8 = add i32 %x7, 1 - ret i32 %x + ret i32 %x8 bb.false: ret i32 %x } + +define i32 @caller3() { +; Check that even if the expensive path is hidden behind several basic blocks, +; it doesn't count toward the inline cost when constant-prop proves those paths +; dead. +; +; CHECK: @caller3 +; CHECK-NOT: call +; CHECK: ret i32 6 + +entry: + %x = call i32 @callee3(i32 42, i32 48) + ret i32 %x +} + +define i32 @callee3(i32 %x, i32 %y) { + %sub = sub i32 %y, %x + %icmp = icmp ugt i32 %sub, 42 + br i1 %icmp, label %bb.true, label %bb.false + +bb.true: + %icmp2 = icmp ult i32 %sub, 64 + br i1 %icmp2, label %bb.true.true, label %bb.true.false + +bb.true.true: + ; This block musn't be counted in the inline cost. + %x1 = add i32 %x, 1 + %x2 = add i32 %x1, 1 + %x3 = add i32 %x2, 1 + %x4 = add i32 %x3, 1 + %x5 = add i32 %x4, 1 + %x6 = add i32 %x5, 1 + %x7 = add i32 %x6, 1 + %x8 = add i32 %x7, 1 + br label %bb.merge + +bb.true.false: + ; This block musn't be counted in the inline cost. + %y1 = add i32 %y, 1 + %y2 = add i32 %y1, 1 + %y3 = add i32 %y2, 1 + %y4 = add i32 %y3, 1 + %y5 = add i32 %y4, 1 + %y6 = add i32 %y5, 1 + %y7 = add i32 %y6, 1 + %y8 = add i32 %y7, 1 + br label %bb.merge + +bb.merge: + %result = phi i32 [ %x8, %bb.true.true ], [ %y8, %bb.true.false ] + ret i32 %result + +bb.false: + ret i32 %sub +} |