[x86] Fix disassembly of callw instruction
[oota-llvm.git] / test / Transforms / Inline / alloca-bonus.ll
index 90fa1923c6dd9d1be37f8bf936db24e774946620..3c5052b883b2f2670fbf8c2083f3ab842f15ead7 100644 (file)
@@ -1,11 +1,13 @@
 ; 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
 
 define void @outer1() {
-; CHECK: @outer1
+; CHECK-LABEL: @outer1(
 ; CHECK-NOT: call void @inner1
   %ptr = alloca i32
   call void @inner1(i32* %ptr)
@@ -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)
@@ -24,7 +26,7 @@ define void @inner1(i32 *%ptr) {
 }
 
 define void @outer2() {
-; CHECK: @outer2
+; CHECK-LABEL: @outer2(
 ; CHECK: call void @inner2
   %ptr = alloca i32
   call void @inner2(i32* %ptr)
@@ -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)
@@ -44,7 +46,7 @@ define void @inner2(i32 *%ptr) {
 }
 
 define void @outer3() {
-; CHECK: @outer3
+; CHECK-LABEL: @outer3(
 ; CHECK-NOT: call void @inner3
   %ptr = alloca i32
   call void @inner3(i32* %ptr, i1 undef)
@@ -83,7 +85,7 @@ bb.false:
 }
 
 define void @outer4(i32 %A) {
-; CHECK: @outer4
+; CHECK-LABEL: @outer4(
 ; CHECK-NOT: call void @inner4
   %ptr = alloca i32
   call void @inner4(i32* %ptr, i32 %A)
@@ -93,7 +95,7 @@ define void @outer4(i32 %A) {
 ; %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
+  %B = getelementptr inbounds i32* %ptr, i32 %A
   %C = icmp eq i32* %ptr, null
   br i1 %C, label %bb.true, label %bb.false
 bb.true:
@@ -122,3 +124,32 @@ bb.true:
 bb.false:
   ret void
 }
+
+define void @outer5() {
+; CHECK-LABEL: @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
+}
+