diff options
| author | Craig Topper <craig.topper@intel.com> | 2017-08-05 20:00:41 +0000 |
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2017-08-05 20:00:41 +0000 |
| commit | 1bbcab9ca59e371f73074c052242f06cdd53038d (patch) | |
| tree | b27e089cc8d69d78c548ae0473ba1f40659d57d9 /llvm/test/Transforms/InstCombine/select-with-bitwise-ops.ll | |
| parent | cc2294a4ebfe628a3ced5539083494d3ecd7b51a (diff) | |
| download | bcm5719-llvm-1bbcab9ca59e371f73074c052242f06cdd53038d.tar.gz bcm5719-llvm-1bbcab9ca59e371f73074c052242f06cdd53038d.zip | |
[InstCombine] Support vector splats in foldSelectICmpAnd.
Unfortunately, it looks like there's some other missed optimizations in the generated code for some of these cases. I'll try to look at some of those next.
llvm-svn: 310184
Diffstat (limited to 'llvm/test/Transforms/InstCombine/select-with-bitwise-ops.ll')
| -rw-r--r-- | llvm/test/Transforms/InstCombine/select-with-bitwise-ops.ll | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/llvm/test/Transforms/InstCombine/select-with-bitwise-ops.ll b/llvm/test/Transforms/InstCombine/select-with-bitwise-ops.ll index c92a749f724..7580fadfd89 100644 --- a/llvm/test/Transforms/InstCombine/select-with-bitwise-ops.ll +++ b/llvm/test/Transforms/InstCombine/select-with-bitwise-ops.ll @@ -268,6 +268,21 @@ define i32 @test65(i64 %x) { ret i32 %3 } +define <2 x i32> @test65vec(<2 x i64> %x) { +; CHECK-LABEL: @test65vec( +; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i64> [[X:%.*]], <i64 16, i64 16> +; CHECK-NEXT: [[TMP2:%.*]] = lshr exact <2 x i64> [[TMP1]], <i64 3, i64 3> +; CHECK-NEXT: [[TMP3:%.*]] = trunc <2 x i64> [[TMP2]] to <2 x i32> +; CHECK-NEXT: [[TMP4:%.*]] = or <2 x i32> [[TMP3]], <i32 40, i32 40> +; CHECK-NEXT: [[TMP5:%.*]] = xor <2 x i32> [[TMP4]], <i32 2, i32 2> +; CHECK-NEXT: ret <2 x i32> [[TMP5]] +; + %1 = and <2 x i64> %x, <i64 16, i64 16> + %2 = icmp ne <2 x i64> %1, zeroinitializer + %3 = select <2 x i1> %2, <2 x i32> <i32 40, i32 40>, <2 x i32> <i32 42, i32 42> + ret <2 x i32> %3 +} + define i32 @test66(i64 %x) { ; CHECK-LABEL: @test66( ; CHECK-NEXT: [[TMP1:%.*]] = lshr i64 [[X:%.*]], 31 @@ -282,6 +297,35 @@ define i32 @test66(i64 %x) { ret i32 %3 } +define <2 x i32> @test66vec(<2 x i64> %x) { +; CHECK-LABEL: @test66vec( +; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i64> [[X:%.*]], <i64 4294967296, i64 4294967296> +; CHECK-NEXT: [[TMP2:%.*]] = lshr exact <2 x i64> [[TMP1]], <i64 31, i64 31> +; CHECK-NEXT: [[TMP3:%.*]] = trunc <2 x i64> [[TMP2]] to <2 x i32> +; CHECK-NEXT: [[TMP4:%.*]] = or <2 x i32> [[TMP3]], <i32 40, i32 40> +; CHECK-NEXT: [[TMP5:%.*]] = xor <2 x i32> [[TMP4]], <i32 2, i32 2> +; CHECK-NEXT: ret <2 x i32> [[TMP5]] +; + %1 = and <2 x i64> %x, <i64 4294967296, i64 4294967296> + %2 = icmp ne <2 x i64> %1, zeroinitializer + %3 = select <2 x i1> %2, <2 x i32> <i32 40, i32 40>, <2 x i32> <i32 42, i32 42> + ret <2 x i32> %3 +} + +; Make sure we don't try to optimize a scalar 'and' with a vector select. +define <2 x i32> @test66vec_scalar_and(i64 %x) { +; CHECK-LABEL: @test66vec_scalar_and( +; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[X:%.*]], 4294967296 +; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i64 [[TMP1]], 0 +; CHECK-NEXT: [[TMP3:%.*]] = select i1 [[TMP2]], <2 x i32> <i32 42, i32 42>, <2 x i32> <i32 40, i32 40> +; CHECK-NEXT: ret <2 x i32> [[TMP3]] +; + %1 = and i64 %x, 4294967296 + %2 = icmp ne i64 %1, 0 + %3 = select i1 %2, <2 x i32> <i32 40, i32 40>, <2 x i32> <i32 42, i32 42> + ret <2 x i32> %3 +} + define i32 @test67(i16 %x) { ; CHECK-LABEL: @test67( ; CHECK-NEXT: [[TMP1:%.*]] = lshr i16 %x, 1 @@ -296,6 +340,21 @@ define i32 @test67(i16 %x) { ret i32 %3 } +define <2 x i32> @test67vec(<2 x i16> %x) { +; CHECK-LABEL: @test67vec( +; CHECK-NEXT: [[TMP1:%.*]] = and <2 x i16> [[X:%.*]], <i16 4, i16 4> +; CHECK-NEXT: [[TMP2:%.*]] = lshr exact <2 x i16> [[TMP1]], <i16 1, i16 1> +; CHECK-NEXT: [[TMP3:%.*]] = or <2 x i16> [[TMP2]], <i16 40, i16 40> +; CHECK-NEXT: [[TMP4:%.*]] = xor <2 x i16> [[TMP3]], <i16 2, i16 2> +; CHECK-NEXT: [[TMP5:%.*]] = zext <2 x i16> [[TMP4]] to <2 x i32> +; CHECK-NEXT: ret <2 x i32> [[TMP5]] +; + %1 = and <2 x i16> %x, <i16 4, i16 4> + %2 = icmp ne <2 x i16> %1, zeroinitializer + %3 = select <2 x i1> %2, <2 x i32> <i32 40, i32 40>, <2 x i32> <i32 42, i32 42> + ret <2 x i32> %3 +} + define i32 @test68(i32 %x, i32 %y) { ; CHECK-LABEL: @test68( ; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[X:%.*]], 6 |

