diff options
Diffstat (limited to 'test/NaCl/Bitcode/inttoptr-elide.ll')
-rw-r--r-- | test/NaCl/Bitcode/inttoptr-elide.ll | 96 |
1 files changed, 82 insertions, 14 deletions
diff --git a/test/NaCl/Bitcode/inttoptr-elide.ll b/test/NaCl/Bitcode/inttoptr-elide.ll index 029f67adef..679f5f1d47 100644 --- a/test/NaCl/Bitcode/inttoptr-elide.ll +++ b/test/NaCl/Bitcode/inttoptr-elide.ll @@ -118,13 +118,11 @@ define i32 @TwoLoads(i32 %i) { ; TD2: define i32 @TwoLoads(i32 %i) { ; TD2-NEXT: %1 = inttoptr i32 %i to i32* ; TD2-NEXT: %2 = load i32* %1, align 4 -; TD2-NEXT: %3 = inttoptr i32 %i 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> ; PF2-NEXT: <DECLAREBLOCKS op0=1/> ; PF2-NEXT: <INST_LOAD op0=1 op1=3 op2=0/> @@ -135,8 +133,9 @@ define i32 @TwoLoads(i32 %i) { ; ------------------------------------------------------ -; Test how we duplicate inttoptrs, even if optimized in the input file. -define i32 @TwoLoadOpt(i32 %i) { +; Test how we handle inttoptrs, if optimized in the input file. This +; case tests within a single block. +define i32 @TwoLoadOptOneBlock(i32 %i) { %1 = inttoptr i32 %i to i32* %2 = load i32* %1, align 4 %3 = load i32* %1, align 4 @@ -144,7 +143,7 @@ define i32 @TwoLoadOpt(i32 %i) { ret i32 %4 } -; TD1: define i32 @TwoLoadOpt(i32 %i) { +; TD1: define i32 @TwoLoadOptOneBlock(i32 %i) { ; TD1-NEXT: %1 = inttoptr i32 %i to i32* ; TD1-NEXT: %2 = load i32* %1, align 4 ; TD1-NEXT: %3 = load i32* %1, align 4 @@ -161,13 +160,12 @@ define i32 @TwoLoadOpt(i32 %i) { ; PF1-NEXT: <INST_RET op0=1/> ; PF1: </FUNCTION_BLOCK> -; TD2: define i32 @TwoLoadOpt(i32 %i) { +; TD2: define i32 @TwoLoadOptOneBlock(i32 %i) { ; TD2-NEXT: %1 = inttoptr i32 %i to i32* ; TD2-NEXT: %2 = load i32* %1, align 4 -; TD2-NEXT: %3 = inttoptr i32 %i 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> @@ -180,6 +178,76 @@ define i32 @TwoLoadOpt(i32 %i) { ; ------------------------------------------------------ +; Test how we handle inttoptrs if optimized in the input file. This +; case tests accross blocks. +define i32 @TwoLoadOptTwoBlocks(i32 %i) { + %1 = inttoptr i32 %i 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 %7 +} + +; TD1: define i32 @TwoLoadOptTwoBlocks(i32 %i) { +; TD1-NEXT: %1 = inttoptr i32 %i 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 %7 +; TD1-NEXT: } + +; PF1: <FUNCTION_BLOCK> +; PF1-NEXT: <DECLAREBLOCKS op0=2/> +; PF1-NEXT: <INST_CAST op0=1 op1=1 op2=10/> +; 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=1/> +; PF1: </FUNCTION_BLOCK> + +; TD2: define i32 @TwoLoadOptTwoBlocks(i32 %i) { +; TD2-NEXT: %1 = inttoptr i32 %i 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 = inttoptr i32 %i 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 %8 +; TD2-NEXT: } + +; PF2: <FUNCTION_BLOCK> +; PF2-NEXT: <DECLAREBLOCKS op0=2/> +; PF2-NEXT: <INST_LOAD op0=1 op1=3 op2=0/> +; PF2-NEXT: <INST_LOAD op0=2 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=4 op1=3 op2=0/> +; PF2-NEXT: <INST_LOAD op0=5 op1=3 op2=0/> +; PF2-NEXT: <INST_BINOP op0=2 op1=1 op2=0/> +; PF2-NEXT: <INST_RET op0=1/> +; PF2: </FUNCTION_BLOCK> + +; ------------------------------------------------------ + ; Test that we elide the simple case of inttoptr for a store. define void @SimpleStore(i32 %i) { %1 = inttoptr i32 %i to i32* @@ -210,4 +278,4 @@ define void @SimpleStore(i32 %i) { ; PF2-NEXT: <DECLAREBLOCKS op0=1/> ; PF2-NEXT: <INST_STORE op0=1 op1=1 op2=3/> ; PF2-NEXT: <INST_RET/> -; PF2T: </FUNCTION_BLOCK> +; PF2: </FUNCTION_BLOCK> |