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 | |
parent | d4429214a2dffcfd8f97956ac8b1a67c4795d242 (diff) | |
download | external_llvm-87070fe1073b1e95748d987af0810d02aac43603.zip external_llvm-87070fe1073b1e95748d987af0810d02aac43603.tar.gz external_llvm-87070fe1073b1e95748d987af0810d02aac43603.tar.bz2 |
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')
-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 01eb736..d79dfcc 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 09f9538..2c0b668 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 349868a..59ceb2e 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 5931d63..63c8d0e 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 7f2eff0..41df0e4 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 |