summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorAmara Emerson <aemerson@apple.com>2019-08-16 18:06:53 +0000
committerAmara Emerson <aemerson@apple.com>2019-08-16 18:06:53 +0000
commitc809230a69276ef5d407b6fbfe2b7809572463ba (patch)
tree5341ce639986e3ceba612d63b88372da4f898fe4 /llvm/lib/CodeGen
parent8ff1b7de4dae74f84ce7f419920434b66d62d07a (diff)
downloadbcm5719-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.cpp18
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) {
OpenPOWER on IntegriCloud