diff options
author | Amara Emerson <aemerson@apple.com> | 2019-08-16 18:06:53 +0000 |
---|---|---|
committer | Amara Emerson <aemerson@apple.com> | 2019-08-16 18:06:53 +0000 |
commit | c809230a69276ef5d407b6fbfe2b7809572463ba (patch) | |
tree | 5341ce639986e3ceba612d63b88372da4f898fe4 /llvm/lib/CodeGen | |
parent | 8ff1b7de4dae74f84ce7f419920434b66d62d07a (diff) | |
download | bcm5719-llvm-c809230a69276ef5d407b6fbfe2b7809572463ba.tar.gz bcm5719-llvm-c809230a69276ef5d407b6fbfe2b7809572463ba.zip |
[AArch64][GlobalISel] Lower G_SHUFFLE_VECTOR with 1 elt src and 1 elt mask.
Again, it's weird that these are allowed. Since lowering support was added in
r368709 we started crashing on compiling the neon intrinsics test in the test
suite. This fixes the lowering to fold the 1 elt src/mask case into copies.
llvm-svn: 369135
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp index ad1a41b09dd..c5f23859783 100644 --- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -3823,7 +3823,6 @@ LegalizerHelper::lowerShuffleVector(MachineInstr &MI) { Register Src1Reg = MI.getOperand(2).getReg(); LLT Src0Ty = MRI.getType(Src0Reg); LLT DstTy = MRI.getType(DstReg); - LLT EltTy = DstTy.getElementType(); LLT IdxTy = LLT::scalar(32); const Constant *ShufMask = MI.getOperand(3).getShuffleMask(); @@ -3831,8 +3830,25 @@ LegalizerHelper::lowerShuffleVector(MachineInstr &MI) { SmallVector<int, 32> Mask; ShuffleVectorInst::getShuffleMask(ShufMask, Mask); + if (DstTy.isScalar()) { + if (Src0Ty.isVector()) + return UnableToLegalize; + + // This is just a SELECT. + assert(Mask.size() == 1 && "Expected a single mask element"); + Register Val; + if (Mask[0] < 0 || Mask[0] > 1) + Val = MIRBuilder.buildUndef(DstTy).getReg(0); + else + Val = Mask[0] == 0 ? Src0Reg : Src1Reg; + MIRBuilder.buildCopy(DstReg, Val); + MI.eraseFromParent(); + return Legalized; + } + Register Undef; SmallVector<Register, 32> BuildVec; + LLT EltTy = DstTy.getElementType(); for (int Idx : Mask) { if (Idx < 0) { |