summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/X86ISelLowering.cpp
diff options
context:
space:
mode:
authorSimon Pilgrim <llvm-dev@redking.me.uk>2017-06-07 10:30:35 +0000
committerSimon Pilgrim <llvm-dev@redking.me.uk>2017-06-07 10:30:35 +0000
commit58f5be2771c540a06abf3aa35b829384a97d8e9c (patch)
tree9267d70e9ae3e55a00e0f89418e60c75cd9f3b91 /llvm/lib/Target/X86/X86ISelLowering.cpp
parentaeb2c881ce424330192e966eb7287555ab4fe243 (diff)
downloadbcm5719-llvm-58f5be2771c540a06abf3aa35b829384a97d8e9c.tar.gz
bcm5719-llvm-58f5be2771c540a06abf3aa35b829384a97d8e9c.zip
[X86][SSE] Fix an issue with PEXTRW/PEXTRB indices during shuffle combining
We were checking that the index was in range of the destination vector type, not the (larger) source vector type llvm-svn: 304894
Diffstat (limited to 'llvm/lib/Target/X86/X86ISelLowering.cpp')
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp9
1 files changed, 6 insertions, 3 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 048fc29660e..246f2e91eb7 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -5868,8 +5868,7 @@ static bool getFauxShuffleMask(SDValue N, SmallVectorImpl<int> &Mask,
assert(SrcExtract.getOperand(0).getValueType() == MVT::v16i8);
}
- if (!SrcExtract || !isa<ConstantSDNode>(SrcExtract.getOperand(1)) ||
- NumElts <= SrcExtract.getConstantOperandVal(1))
+ if (!SrcExtract || !isa<ConstantSDNode>(SrcExtract.getOperand(1)))
return false;
SDValue SrcVec = SrcExtract.getOperand(0);
@@ -5877,8 +5876,12 @@ static bool getFauxShuffleMask(SDValue N, SmallVectorImpl<int> &Mask,
unsigned NumSrcElts = SrcVT.getVectorNumElements();
unsigned NumZeros = (NumBitsPerElt / SrcVT.getScalarSizeInBits()) - 1;
+ unsigned SrcIdx = SrcExtract.getConstantOperandVal(1);
+ if (NumSrcElts <= SrcIdx)
+ return false;
+
Ops.push_back(SrcVec);
- Mask.push_back(SrcExtract.getConstantOperandVal(1));
+ Mask.push_back(SrcIdx);
Mask.append(NumZeros, SM_SentinelZero);
Mask.append(NumSrcElts - Mask.size(), SM_SentinelUndef);
return true;
OpenPOWER on IntegriCloud