diff options
author | Elena Demikhovsky <elena.demikhovsky@intel.com> | 2013-06-26 10:55:03 +0000 |
---|---|---|
committer | Elena Demikhovsky <elena.demikhovsky@intel.com> | 2013-06-26 10:55:03 +0000 |
commit | 87070fe1073b1e95748d987af0810d02aac43603 (patch) | |
tree | 29608b26070b26a78bd0a59f77b096fa30556407 /test/CodeGen/X86 | |
parent | d4429214a2dffcfd8f97956ac8b1a67c4795d242 (diff) | |
download | llvm-87070fe1073b1e95748d987af0810d02aac43603.tar.gz llvm-87070fe1073b1e95748d987af0810d02aac43603.tar.bz2 llvm-87070fe1073b1e95748d987af0810d02aac43603.tar.xz |
Optimized integer vector multiplication operation by replacing it with shift/xor/sub when it is possible. Fixed a bug in SDIV, where the const operand is not a splat constant vector.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@184931 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGen/X86')
-rw-r--r-- | test/CodeGen/X86/avx-shift.ll | 3 | ||||
-rw-r--r-- | test/CodeGen/X86/avx2-arith.ll | 73 | ||||
-rw-r--r-- | test/CodeGen/X86/vec_sdiv_to_shift.ll | 8 | ||||
-rw-r--r-- | test/CodeGen/X86/widen_arith-4.ll | 2 | ||||
-rw-r--r-- | test/CodeGen/X86/widen_arith-5.ll | 2 |
5 files changed, 85 insertions, 3 deletions
diff --git a/test/CodeGen/X86/avx-shift.ll b/test/CodeGen/X86/avx-shift.ll index 01eb7361e2..d79dfcc076 100644 --- a/test/CodeGen/X86/avx-shift.ll +++ b/test/CodeGen/X86/avx-shift.ll @@ -103,9 +103,10 @@ define <32 x i8> @vshift12(<32 x i8> %a) nounwind readnone { ;;; Support variable shifts ; CHECK: _vshift08 -; CHECK: vextractf128 $1 ; CHECK: vpslld $23 +; CHECK: vextractf128 $1 ; CHECK: vpslld $23 +; CHECK: ret define <8 x i32> @vshift08(<8 x i32> %a) nounwind { %bitop = shl <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>, %a ret <8 x i32> %bitop diff --git a/test/CodeGen/X86/avx2-arith.ll b/test/CodeGen/X86/avx2-arith.ll index 09f9538358..2c0b6685e5 100644 --- a/test/CodeGen/X86/avx2-arith.ll +++ b/test/CodeGen/X86/avx2-arith.ll @@ -74,3 +74,76 @@ define <4 x i64> @mul-v4i64(<4 x i64> %i, <4 x i64> %j) nounwind readnone { ret <4 x i64> %x } +; CHECK: mul_const1 +; CHECK: vpaddd +; CHECK: ret +define <8 x i32> @mul_const1(<8 x i32> %x) { + %y = mul <8 x i32> %x, <i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2> + ret <8 x i32> %y +} + +; CHECK: mul_const2 +; CHECK: vpsllq $2 +; CHECK: ret +define <4 x i64> @mul_const2(<4 x i64> %x) { + %y = mul <4 x i64> %x, <i64 4, i64 4, i64 4, i64 4> + ret <4 x i64> %y +} + +; CHECK: mul_const3 +; CHECK: vpsllw $3 +; CHECK: ret +define <16 x i16> @mul_const3(<16 x i16> %x) { + %y = mul <16 x i16> %x, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8> + ret <16 x i16> %y +} + +; CHECK: mul_const4 +; CHECK: vpxor +; CHECK: vpsubq +; CHECK: ret +define <4 x i64> @mul_const4(<4 x i64> %x) { + %y = mul <4 x i64> %x, <i64 -1, i64 -1, i64 -1, i64 -1> + ret <4 x i64> %y +} + +; CHECK: mul_const5 +; CHECK: vxorps +; CHECK-NEXT: ret +define <8 x i32> @mul_const5(<8 x i32> %x) { + %y = mul <8 x i32> %x, <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> + ret <8 x i32> %y +} + +; CHECK: mul_const6 +; CHECK: vpmulld +; CHECK: ret +define <8 x i32> @mul_const6(<8 x i32> %x) { + %y = mul <8 x i32> %x, <i32 0, i32 0, i32 0, i32 2, i32 0, i32 2, i32 0, i32 0> + ret <8 x i32> %y +} + +; CHECK: mul_const7 +; CHECK: vpaddq +; CHECK: vpaddq +; CHECK: ret +define <8 x i64> @mul_const7(<8 x i64> %x) { + %y = mul <8 x i64> %x, <i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2, i64 2> + ret <8 x i64> %y +} + +; CHECK: mul_const8 +; CHECK: vpsllw $3 +; CHECK: ret +define <8 x i16> @mul_const8(<8 x i16> %x) { + %y = mul <8 x i16> %x, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8> + ret <8 x i16> %y +} + +; CHECK: mul_const9 +; CHECK: vpmulld +; CHECK: ret +define <8 x i32> @mul_const9(<8 x i32> %x) { + %y = mul <8 x i32> %x, <i32 2, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> + ret <8 x i32> %y +}
\ No newline at end of file diff --git a/test/CodeGen/X86/vec_sdiv_to_shift.ll b/test/CodeGen/X86/vec_sdiv_to_shift.ll index 349868a87f..59ceb2eb36 100644 --- a/test/CodeGen/X86/vec_sdiv_to_shift.ll +++ b/test/CodeGen/X86/vec_sdiv_to_shift.ll @@ -70,3 +70,11 @@ entry: %a0 = sdiv <16 x i16> %var, <i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4> ret <16 x i16> %a0 } + +; CHECK: sdiv_non_splat +; CHECK: idivl +; CHECK: ret +define <4 x i32> @sdiv_non_splat(<4 x i32> %x) { + %y = sdiv <4 x i32> %x, <i32 2, i32 0, i32 0, i32 0> + ret <4 x i32> %y +}
\ No newline at end of file diff --git a/test/CodeGen/X86/widen_arith-4.ll b/test/CodeGen/X86/widen_arith-4.ll index 5931d639f1..63c8d0e52e 100644 --- a/test/CodeGen/X86/widen_arith-4.ll +++ b/test/CodeGen/X86/widen_arith-4.ll @@ -33,7 +33,7 @@ forbody: ; preds = %forcond %arrayidx6 = getelementptr <5 x i16>* %tmp5, i32 %tmp4 ; <<5 x i16>*> [#uses=1] %tmp7 = load <5 x i16>* %arrayidx6 ; <<5 x i16>> [#uses=1] %sub = sub <5 x i16> %tmp7, < i16 271, i16 271, i16 271, i16 271, i16 271 > ; <<5 x i16>> [#uses=1] - %mul = mul <5 x i16> %sub, < i16 2, i16 2, i16 2, i16 2, i16 2 > ; <<5 x i16>> [#uses=1] + %mul = mul <5 x i16> %sub, < i16 2, i16 4, i16 2, i16 2, i16 2 > ; <<5 x i16>> [#uses=1] store <5 x i16> %mul, <5 x i16>* %arrayidx br label %forinc diff --git a/test/CodeGen/X86/widen_arith-5.ll b/test/CodeGen/X86/widen_arith-5.ll index 7f2eff09f4..41df0e493b 100644 --- a/test/CodeGen/X86/widen_arith-5.ll +++ b/test/CodeGen/X86/widen_arith-5.ll @@ -1,6 +1,6 @@ ; RUN: llc < %s -march=x86-64 -mattr=+sse42 | FileCheck %s ; CHECK: movdqa -; CHECK: pmulld +; CHECK: pslld $2 ; CHECK: psubd ; widen a v3i32 to v4i32 to do a vector multiple and a subtraction |