diff options
| author | Tim Northover <tnorthover@apple.com> | 2014-04-04 09:03:02 +0000 |
|---|---|---|
| committer | Tim Northover <tnorthover@apple.com> | 2014-04-04 09:03:02 +0000 |
| commit | 1e4f2c5e5f20d9f57a00c0f99753a2d8a3acb0de (patch) | |
| tree | dd921c43096558993733ce5d233830897e72e6f3 /llvm/test | |
| parent | 6d8f71f928e2935db336da01d21a24b4b1a7bec1 (diff) | |
| download | bcm5719-llvm-1e4f2c5e5f20d9f57a00c0f99753a2d8a3acb0de.tar.gz bcm5719-llvm-1e4f2c5e5f20d9f57a00c0f99753a2d8a3acb0de.zip | |
ARM64: add 128-bit MLA operations to the custom selection code.
Without this change, the llvm_unreachable kicked in. The code pattern
being spotted is rather non-canonical for 128-bit MLAs, but it can
happen and there's no point in generating sub-optimal code for it just
because it looks odd.
Should fix PR19332.
llvm-svn: 205615
Diffstat (limited to 'llvm/test')
| -rw-r--r-- | llvm/test/CodeGen/ARM64/vmul.ll | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/ARM64/vmul.ll b/llvm/test/CodeGen/ARM64/vmul.ll index 3ef0a76e204..d11bb2f72eb 100644 --- a/llvm/test/CodeGen/ARM64/vmul.ll +++ b/llvm/test/CodeGen/ARM64/vmul.ll @@ -1598,6 +1598,32 @@ entry: ret <2 x i32> %add } +define <8 x i16> @not_really_vmlaq_laneq_s16_test(<8 x i16> %a, <8 x i16> %b, <8 x i16> %c) nounwind readnone ssp { +entry: +; CHECK: not_really_vmlaq_laneq_s16_test +; CHECK-NOT: ext +; CHECK: mla.8h v0, v1, v2[5] +; CHECK-NEXT: ret + %shuffle1 = shufflevector <8 x i16> %c, <8 x i16> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7> + %shuffle2 = shufflevector <4 x i16> %shuffle1, <4 x i16> undef, <8 x i32> <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> + %mul = mul <8 x i16> %shuffle2, %b + %add = add <8 x i16> %mul, %a + ret <8 x i16> %add +} + +define <4 x i32> @not_really_vmlaq_laneq_s32_test(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) nounwind readnone ssp { +entry: +; CHECK: not_really_vmlaq_laneq_s32_test +; CHECK-NOT: ext +; CHECK: mla.4s v0, v1, v2[3] +; CHECK-NEXT: ret + %shuffle1 = shufflevector <4 x i32> %c, <4 x i32> undef, <2 x i32> <i32 2, i32 3> + %shuffle2 = shufflevector <2 x i32> %shuffle1, <2 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 1> + %mul = mul <4 x i32> %shuffle2, %b + %add = add <4 x i32> %mul, %a + ret <4 x i32> %add +} + define <4 x i32> @vmull_laneq_s16_test(<4 x i16> %a, <8 x i16> %b) nounwind readnone ssp { entry: ; CHECK: vmull_laneq_s16_test |

