From 80a27c457c36b4426336bc882ee4f105f1a47d13 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Mon, 20 Jun 2016 04:00:50 +0000 Subject: [PATCH] [X86] Avoid making a copy of a shuffle mask until we're sure we really need to. And just use a SmallVector to do the copy because its easy. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273135 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86ISelLowering.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index dca940dd433..f8e05711346 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -9841,17 +9841,14 @@ static SDValue lowerV8I16VectorShuffle(SDValue Op, SDValue V1, SDValue V2, assert(V1.getSimpleValueType() == MVT::v8i16 && "Bad operand type!"); assert(V2.getSimpleValueType() == MVT::v8i16 && "Bad operand type!"); ShuffleVectorSDNode *SVOp = cast(Op); - ArrayRef OrigMask = SVOp->getMask(); - int MaskStorage[8] = {OrigMask[0], OrigMask[1], OrigMask[2], OrigMask[3], - OrigMask[4], OrigMask[5], OrigMask[6], OrigMask[7]}; - MutableArrayRef Mask(MaskStorage); + ArrayRef Mask = SVOp->getMask(); assert(Mask.size() == 8 && "Unexpected mask size for v8 shuffle!"); // Whenever we can lower this as a zext, that instruction is strictly faster // than any alternative. if (SDValue ZExt = lowerVectorShuffleAsZeroOrAnyExtend( - DL, MVT::v8i16, V1, V2, OrigMask, Subtarget, DAG)) + DL, MVT::v8i16, V1, V2, Mask, Subtarget, DAG)) return ZExt; int NumV2Inputs = count_if(Mask, [](int M) { return M >= 8; }); @@ -9877,8 +9874,11 @@ static SDValue lowerV8I16VectorShuffle(SDValue Op, SDValue V1, SDValue V2, Mask, Subtarget, DAG)) return Rotate; - return lowerV8I16GeneralSingleInputVectorShuffle(DL, MVT::v8i16, V1, Mask, - Subtarget, DAG); + // Make a copy of the mask so it can be modified. + SmallVector MutableMask(Mask.begin(), Mask.end()); + return lowerV8I16GeneralSingleInputVectorShuffle(DL, MVT::v8i16, V1, + MutableMask, Subtarget, + DAG); } assert(llvm::any_of(Mask, [](int M) { return M >= 0 && M < 8; }) && -- 2.50.1