diff options
Diffstat (limited to 'test/Transforms/Inline/alloca-bonus.ll')
-rw-r--r-- | test/Transforms/Inline/alloca-bonus.ll | 47 |
1 files changed, 39 insertions, 8 deletions
diff --git a/test/Transforms/Inline/alloca-bonus.ll b/test/Transforms/Inline/alloca-bonus.ll index fb4062f..d04d54e 100644 --- a/test/Transforms/Inline/alloca-bonus.ll +++ b/test/Transforms/Inline/alloca-bonus.ll @@ -1,5 +1,7 @@ ; RUN: opt -inline < %s -S -o - -inline-threshold=8 | FileCheck %s +target datalayout = "p:32:32" + declare void @llvm.lifetime.start(i64 %size, i8* nocapture %ptr) @glbl = external global i32 @@ -15,8 +17,8 @@ define void @outer1() { define void @inner1(i32 *%ptr) { %A = load i32* %ptr store i32 0, i32* %ptr - %C = getelementptr i32* %ptr, i32 0 - %D = getelementptr i32* %ptr, i32 1 + %C = getelementptr inbounds i32* %ptr, i32 0 + %D = getelementptr inbounds i32* %ptr, i32 1 %E = bitcast i32* %ptr to i8* %F = select i1 false, i32* %ptr, i32* @glbl call void @llvm.lifetime.start(i64 0, i8* %E) @@ -35,8 +37,8 @@ define void @outer2() { define void @inner2(i32 *%ptr) { %A = load i32* %ptr store i32 0, i32* %ptr - %C = getelementptr i32* %ptr, i32 0 - %D = getelementptr i32* %ptr, i32 %A + %C = getelementptr inbounds i32* %ptr, i32 0 + %D = getelementptr inbounds i32* %ptr, i32 %A %E = bitcast i32* %ptr to i8* %F = select i1 false, i32* %ptr, i32* @glbl call void @llvm.lifetime.start(i64 0, i8* %E) @@ -90,12 +92,12 @@ define void @outer4(i32 %A) { ret void } -; %D poisons this call, scalar-repl can't handle that instruction. However, we +; %B poisons this call, scalar-repl can't handle that instruction. However, we ; still want to detect that the icmp and branch *can* be handled. define void @inner4(i32 *%ptr, i32 %A) { - %B = getelementptr i32* %ptr, i32 %A - %E = icmp eq i32* %ptr, null - br i1 %E, label %bb.true, label %bb.false + %B = getelementptr inbounds i32* %ptr, i32 %A + %C = icmp eq i32* %ptr, null + br i1 %C, label %bb.true, label %bb.false bb.true: ; This block musn't be counted in the inline cost. %t1 = load i32* %ptr @@ -122,3 +124,32 @@ bb.true: bb.false: ret void } + +define void @outer5() { +; CHECK: @outer5 +; CHECK-NOT: call void @inner5 + %ptr = alloca i32 + call void @inner5(i1 false, i32* %ptr) + ret void +} + +; %D poisons this call, scalar-repl can't handle that instruction. However, if +; the flag is set appropriately, the poisoning instruction is inside of dead +; code, and so shouldn't be counted. +define void @inner5(i1 %flag, i32 *%ptr) { + %A = load i32* %ptr + store i32 0, i32* %ptr + %C = getelementptr inbounds i32* %ptr, i32 0 + br i1 %flag, label %if.then, label %exit + +if.then: + %D = getelementptr inbounds i32* %ptr, i32 %A + %E = bitcast i32* %ptr to i8* + %F = select i1 false, i32* %ptr, i32* @glbl + call void @llvm.lifetime.start(i64 0, i8* %E) + ret void + +exit: + ret void +} + |