aboutsummaryrefslogtreecommitdiff
path: root/test/NaCl/Bitcode/bitcast-elide.ll
diff options
context:
space:
mode:
Diffstat (limited to 'test/NaCl/Bitcode/bitcast-elide.ll')
-rw-r--r--test/NaCl/Bitcode/bitcast-elide.ll145
1 files changed, 111 insertions, 34 deletions
diff --git a/test/NaCl/Bitcode/bitcast-elide.ll b/test/NaCl/Bitcode/bitcast-elide.ll
index eeee69ffef..383673d684 100644
--- a/test/NaCl/Bitcode/bitcast-elide.ll
+++ b/test/NaCl/Bitcode/bitcast-elide.ll
@@ -17,17 +17,19 @@
; ------------------------------------------------------
-@bytes = internal global [7 x i8] c"abcdefg"
+@bytes = internal global [4 x i8] c"abcd"
+
+; ------------------------------------------------------
; Test that we elide the simple case of global.
define void @SimpleLoad() {
- %1 = bitcast [7 x i8]* @bytes to i32*
+ %1 = bitcast [4 x i8]* @bytes to i32*
%2 = load i32* %1, align 4
ret void
}
; TD1: define void @SimpleLoad() {
-; TD1-NEXT: %1 = bitcast [7 x i8]* @bytes to i32*
+; TD1-NEXT: %1 = bitcast [4 x i8]* @bytes to i32*
; TD1-NEXT: %2 = load i32* %1, align 4
; TD1-NEXT: ret void
; TD1-NEXT: }
@@ -40,7 +42,7 @@ define void @SimpleLoad() {
; PF1-NEXT: </FUNCTION_BLOCK>
; TD2: define void @SimpleLoad() {
-; TD2-NEXT: %1 = bitcast [7 x i8]* @bytes to i32*
+; TD2-NEXT: %1 = bitcast [4 x i8]* @bytes to i32*
; TD2-NEXT: %2 = load i32* %1, align 4
; TD2-NEXT: ret void
; TD2-NEXT: }
@@ -51,6 +53,8 @@ define void @SimpleLoad() {
; PF2-NEXT: <INST_RET/>
; PF2-NEXT: </FUNCTION_BLOCK>
+; ------------------------------------------------------
+
; Test that we elide the simple case of an alloca.
define void @SimpleLoadAlloca() {
%1 = alloca i8, i32 4, align 4
@@ -67,8 +71,6 @@ define void @SimpleLoadAlloca() {
; TD1-NEXT: }
; PF1: <FUNCTION_BLOCK>
-; PF1-NEXT: <DECLAREBLOCKS op0=1/>
-; PF1-NEXT: <CONSTANTS_BLOCK
; PF1: </CONSTANTS_BLOCK>
; PF1-NEXT: <INST_ALLOCA op0=1 op1=3/>
; PF1-NEXT: <INST_CAST op0=1 op1=1 op2=11/>
@@ -84,23 +86,23 @@ define void @SimpleLoadAlloca() {
; TD2-NEXT: }
; PF2: <FUNCTION_BLOCK>
-; PF2-NEXT: <DECLAREBLOCKS op0=1/>
-; PF2-NEXT: <CONSTANTS_BLOCK
; PF2: </CONSTANTS_BLOCK>
; PF2-NEXT: <INST_ALLOCA op0=1 op1=3/>
; PF2-NEXT: <INST_LOAD op0=1 op1=3 op2=0/>
; PF2-NEXT: <INST_RET/>
; PF2-NEXT: </FUNCTION_BLOCK>
+; ------------------------------------------------------
+
; Test that we don't elide an bitcast if one of its uses is not a load.
define i32* @NonsimpleLoad(i32 %i) {
- %1 = bitcast [7 x i8]* @bytes to i32*
+ %1 = bitcast [4 x i8]* @bytes to i32*
%2 = load i32* %1, align 4
ret i32* %1
}
; TD1: define i32* @NonsimpleLoad(i32 %i) {
-; TD1-NEXT: %1 = bitcast [7 x i8]* @bytes to i32*
+; TD1-NEXT: %1 = bitcast [4 x i8]* @bytes to i32*
; TD1-NEXT: %2 = load i32* %1, align 4
; TD1-NEXT: ret i32* %1
; TD1-NEXT: }
@@ -113,7 +115,7 @@ define i32* @NonsimpleLoad(i32 %i) {
; PF1: </FUNCTION_BLOCK>
; TD2: define i32* @NonsimpleLoad(i32 %i) {
-; TD2-NEXT: %1 = bitcast [7 x i8]* @bytes to i32*
+; TD2-NEXT: %1 = bitcast [4 x i8]* @bytes to i32*
; TD2-NEXT: %2 = load i32* %1, align 4
; TD2-NEXT: ret i32* %1
; TD2-NEXT: }
@@ -125,20 +127,22 @@ define i32* @NonsimpleLoad(i32 %i) {
; PF2-NEXT: <INST_RET op0=2/>
; PF2: </FUNCTION_BLOCK>
+; ------------------------------------------------------
+
; Test that we can handle multiple bitcasts.
define i32 @TwoLoads(i32 %i) {
- %1 = bitcast [7 x i8]* @bytes to i32*
+ %1 = bitcast [4 x i8]* @bytes to i32*
%2 = load i32* %1, align 4
- %3 = bitcast [7 x i8]* @bytes to i32*
+ %3 = bitcast [4 x i8]* @bytes to i32*
%4 = load i32* %3, align 4
%5 = add i32 %2, %4
ret i32 %5
}
; TD1: define i32 @TwoLoads(i32 %i) {
-; TD1-NEXT: %1 = bitcast [7 x i8]* @bytes to i32*
+; TD1-NEXT: %1 = bitcast [4 x i8]* @bytes to i32*
; TD1-NEXT: %2 = load i32* %1, align 4
-; TD1-NEXT: %3 = bitcast [7 x i8]* @bytes to i32*
+; TD1-NEXT: %3 = bitcast [4 x i8]* @bytes to i32*
; TD1-NEXT: %4 = load i32* %3, align 4
; TD1-NEXT: %5 = add i32 %2, %4
; TD1-NEXT: ret i32 %5
@@ -155,12 +159,11 @@ define i32 @TwoLoads(i32 %i) {
; PF1: </FUNCTION_BLOCK>
; TD2: define i32 @TwoLoads(i32 %i) {
-; TD2-NEXT: %1 = bitcast [7 x i8]* @bytes to i32*
+; TD2-NEXT: %1 = bitcast [4 x i8]* @bytes to i32*
; TD2-NEXT: %2 = load i32* %1, align 4
-; TD2-NEXT: %3 = bitcast [7 x i8]* @bytes to i32*
-; TD2-NEXT: %4 = load i32* %3, align 4
-; TD2-NEXT: %5 = add i32 %2, %4
-; TD2-NEXT: ret i32 %5
+; TD2-NEXT: %3 = load i32* %1, align 4
+; TD2-NEXT: %4 = add i32 %2, %3
+; TD2-NEXT: ret i32 %4
; TD2-NEXT: }
; PF2: <FUNCTION_BLOCK>
@@ -171,17 +174,20 @@ define i32 @TwoLoads(i32 %i) {
; PF2-NEXT: <INST_RET op0=1/>
; PF2: </FUNCTION_BLOCK>
-; Test how we duplicate bitcasts, even if optimized in the input file.
-define i32 @TwoLoadOpt(i32 %i) {
- %1 = bitcast [7 x i8]* @bytes to i32*
+; ------------------------------------------------------
+
+; Test how we handle bitcasts if optimized in the input file. This
+; case tests within a single block.
+define i32 @TwoLoadOptOneBlock(i32 %i) {
+ %1 = bitcast [4 x i8]* @bytes to i32*
%2 = load i32* %1, align 4
%3 = load i32* %1, align 4
%4 = add i32 %2, %3
ret i32 %4
}
-; TD1: define i32 @TwoLoadOpt(i32 %i) {
-; TD1-NEXT: %1 = bitcast [7 x i8]* @bytes to i32*
+; TD1: define i32 @TwoLoadOptOneBlock(i32 %i) {
+; TD1-NEXT: %1 = bitcast [4 x i8]* @bytes to i32*
; TD1-NEXT: %2 = load i32* %1, align 4
; TD1-NEXT: %3 = load i32* %1, align 4
; TD1-NEXT: %4 = add i32 %2, %3
@@ -197,13 +203,12 @@ define i32 @TwoLoadOpt(i32 %i) {
; PF1-NEXT: <INST_RET op0=1/>
; PF1: </FUNCTION_BLOCK>
-; TD2: define i32 @TwoLoadOpt(i32 %i) {
-; TD2-NEXT: %1 = bitcast [7 x i8]* @bytes to i32*
+; TD2: define i32 @TwoLoadOptOneBlock(i32 %i) {
+; TD2-NEXT: %1 = bitcast [4 x i8]* @bytes to i32*
; TD2-NEXT: %2 = load i32* %1, align 4
-; TD2-NEXT: %3 = bitcast [7 x i8]* @bytes to i32*
-; TD2-NEXT: %4 = load i32* %3, align 4
-; TD2-NEXT: %5 = add i32 %2, %4
-; TD2-NEXT: ret i32 %5
+; TD2-NEXT: %3 = load i32* %1, align 4
+; TD2-NEXT: %4 = add i32 %2, %3
+; TD2-NEXT: ret i32 %4
; TD2-NEXT: }
; PF2: <FUNCTION_BLOCK>
@@ -214,15 +219,87 @@ define i32 @TwoLoadOpt(i32 %i) {
; PF2-NEXT: <INST_RET op0=1/>
; PF2: </FUNCTION_BLOCK>
+; ------------------------------------------------------
+
+; Test how we handle bitcasts if optimized in the input file. This
+; case tests accross blocks.
+define i32 @TwoLoadOptTwoBlocks(i32 %i) {
+ %1 = bitcast [4 x i8]* @bytes to i32*
+ %2 = load i32* %1, align 4
+ %3 = load i32* %1, align 4
+ %4 = add i32 %2, %3
+ br label %BB
+
+BB:
+ %5 = load i32* %1, align 4
+ %6 = load i32* %1, align 4
+ %7 = add i32 %5, %6
+ ret i32 %4
+}
+
+; TD1: define i32 @TwoLoadOptTwoBlocks(i32 %i) {
+; TD1-NEXT: %1 = bitcast [4 x i8]* @bytes to i32*
+; TD1-NEXT: %2 = load i32* %1, align 4
+; TD1-NEXT: %3 = load i32* %1, align 4
+; TD1-NEXT: %4 = add i32 %2, %3
+; TD1-NEXT: br label %BB
+; TD1: BB:
+; TD1-NEXT: %5 = load i32* %1, align 4
+; TD1-NEXT: %6 = load i32* %1, align 4
+; TD1-NEXT: %7 = add i32 %5, %6
+; TD1-NEXT: ret i32 %4
+; TD1-NEXT: }
+
+; PF1: <FUNCTION_BLOCK>
+; PF1-NEXT: <DECLAREBLOCKS op0=2/>
+; PF1-NEXT: <INST_CAST op0=2 op1=1 op2=11/>
+; PF1-NEXT: <INST_LOAD op0=1 op1=3 op2=0/>
+; PF1-NEXT: <INST_LOAD op0=2 op1=3 op2=0/>
+; PF1-NEXT: <INST_BINOP op0=2 op1=1 op2=0/>
+; PF1-NEXT: <INST_BR op0=1/>
+; PF1-NEXT: <INST_LOAD op0=4 op1=3 op2=0/>
+; PF1-NEXT: <INST_LOAD op0=5 op1=3 op2=0/>
+; PF1-NEXT: <INST_BINOP op0=2 op1=1 op2=0/>
+; PF1-NEXT: <INST_RET op0=4/>
+; PF1: </FUNCTION_BLOCK>
+
+; TD2: define i32 @TwoLoadOptTwoBlocks(i32 %i) {
+; TD2-NEXT: %1 = bitcast [4 x i8]* @bytes to i32*
+; TD2-NEXT: %2 = load i32* %1, align 4
+; TD2-NEXT: %3 = load i32* %1, align 4
+; TD2-NEXT: %4 = add i32 %2, %3
+; TD2-NEXT: br label %BB
+; TD2: BB:
+; TD2-NEXT: %5 = bitcast [4 x i8]* @bytes to i32*
+; TD2-NEXT: %6 = load i32* %5, align 4
+; TD2-NEXT: %7 = load i32* %5, align 4
+; TD2-NEXT: %8 = add i32 %6, %7
+; TD2-NEXT: ret i32 %4
+; TD2-NEXT: }
+
+; PF2: <FUNCTION_BLOCK>
+; PF2-NEXT: <DECLAREBLOCKS op0=2/>
+; PF2-NEXT: <INST_LOAD op0=2 op1=3 op2=0/>
+; PF2-NEXT: <INST_LOAD op0=3 op1=3 op2=0/>
+; PF2-NEXT: <INST_BINOP op0=2 op1=1 op2=0/>
+; PF2-NEXT: <INST_BR op0=1/>
+; PF2-NEXT: <INST_LOAD op0=5 op1=3 op2=0/>
+; PF2-NEXT: <INST_LOAD op0=6 op1=3 op2=0/>
+; PF2-NEXT: <INST_BINOP op0=2 op1=1 op2=0/>
+; PF2-NEXT: <INST_RET op0=4/>
+; PF2: </FUNCTION_BLOCK>
+
+; ------------------------------------------------------
+
; Test that we elide the simple case of bitcast for a store.
define void @SimpleStore(i32 %i) {
- %1 = bitcast [7 x i8]* @bytes to i32*
+ %1 = bitcast [4 x i8]* @bytes to i32*
store i32 %i, i32* %1, align 4
ret void
}
; TD1: define void @SimpleStore(i32 %i) {
-; TD1-NEXT: %1 = bitcast [7 x i8]* @bytes to i32*
+; TD1-NEXT: %1 = bitcast [4 x i8]* @bytes to i32*
; TD1-NEXT: store i32 %i, i32* %1, align 4
; TD1-NEXT: ret void
; TD1-NEXT: }
@@ -235,7 +312,7 @@ define void @SimpleStore(i32 %i) {
; PF1: </FUNCTION_BLOCK>
; TD2: define void @SimpleStore(i32 %i) {
-; TD2-NEXT: %1 = bitcast [7 x i8]* @bytes to i32*
+; TD2-NEXT: %1 = bitcast [4 x i8]* @bytes to i32*
; TD2-NEXT: store i32 %i, i32* %1, align 4
; TD2-NEXT: ret void
; TD2-NEXT: }