Pull in r342397 from upstream llvm trunk (by Amara Emerson):

Revert "Revert r342183 "[DAGCombine] Fix crash when store merging
  created an extract_subvector with invalid index.""

  Fixed the assertion failure.

  Differential Revision: https://reviews.llvm.org/D51831

This fixes 'Assertion failed: ((VT.getVectorNumElements() +
N2C->getZExtValue() <= N1.getValueType().getVectorNumElements()) &&
"Extract subvector overflow!"), function getNode' when building the
multimedia/aom port (with AVX2 enabled).

Reported by:	jbeich
PR:		234480
MFC after:	6 weeks
X-MFC-With:	r341825
This commit is contained in:
dim 2018-12-29 15:13:49 +00:00
parent 7f6b1eda35
commit 4d6e1dc006

View File

@ -13727,17 +13727,26 @@ bool DAGCombiner::MergeStoresOfConstantsOrVecElts(
Val.getOpcode() == ISD::EXTRACT_SUBVECTOR)) {
SDValue Vec = Val.getOperand(0);
EVT MemVTScalarTy = MemVT.getScalarType();
SDValue Idx = Val.getOperand(1);
// We may need to add a bitcast here to get types to line up.
if (MemVTScalarTy != Vec.getValueType()) {
unsigned Elts = Vec.getValueType().getSizeInBits() /
MemVTScalarTy.getSizeInBits();
if (Val.getValueType().isVector() && MemVT.isVector()) {
unsigned IdxC = cast<ConstantSDNode>(Idx)->getZExtValue();
unsigned NewIdx =
((uint64_t)IdxC * MemVT.getVectorNumElements()) / Elts;
Idx = DAG.getConstant(NewIdx, SDLoc(Val), Idx.getValueType());
}
if (!MemVT.isVector() && Val.getValueType().isVector())
dbgs() << "hit!\n";
EVT NewVecTy =
EVT::getVectorVT(*DAG.getContext(), MemVTScalarTy, Elts);
Vec = DAG.getBitcast(NewVecTy, Vec);
}
auto OpC = (MemVT.isVector()) ? ISD::EXTRACT_SUBVECTOR
: ISD::EXTRACT_VECTOR_ELT;
Val = DAG.getNode(OpC, SDLoc(Val), MemVT, Vec, Val.getOperand(1));
Val = DAG.getNode(OpC, SDLoc(Val), MemVT, Vec, Idx);
}
Ops.push_back(Val);
}