aboutsummaryrefslogtreecommitdiffstats
path: root/test/Transforms/Inline/alloca-bonus.ll
diff options
context:
space:
mode:
Diffstat (limited to 'test/Transforms/Inline/alloca-bonus.ll')
-rw-r--r--test/Transforms/Inline/alloca-bonus.ll47
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
+}
+