forked from OSchip/llvm-project
Improve EXTRACT_VECTOR_ELT patch based on comments from Duncan
llvm-svn: 95012
This commit is contained in:
parent
47cbefac94
commit
d74e0023c5
|
@ -5411,10 +5411,7 @@ SDValue DAGCombiner::visitEXTRACT_VECTOR_ELT(SDNode *N) {
|
|||
EVT NVT = N->getValueType(0);
|
||||
if (InOp.getValueType() != NVT) {
|
||||
assert(InOp.getValueType().isInteger() && NVT.isInteger());
|
||||
if (NVT.getSizeInBits() > InOp.getValueType().getSizeInBits())
|
||||
return DAG.getNode(ISD::SIGN_EXTEND, InVec.getDebugLoc(), NVT, InOp);
|
||||
else
|
||||
return DAG.getNode(ISD::TRUNCATE, InVec.getDebugLoc(), NVT, InOp);
|
||||
return DAG.getSExtOrTrunc(InOp, InVec.getDebugLoc(), NVT);
|
||||
}
|
||||
return InOp;
|
||||
}
|
||||
|
|
|
@ -2764,13 +2764,16 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,
|
|||
// EXTRACT_VECTOR_ELT of INSERT_VECTOR_ELT is often formed when vector
|
||||
// operations are lowered to scalars.
|
||||
if (N1.getOpcode() == ISD::INSERT_VECTOR_ELT) {
|
||||
// If the indices are the same, return the inserted element.
|
||||
if (N1.getOperand(2) == N2 && VT == N1.getOperand(1).getValueType())
|
||||
return N1.getOperand(1);
|
||||
// If the indices are known different, extract the element from
|
||||
// If the indices are the same, return the inserted element else
|
||||
// if the indices are known different, extract the element from
|
||||
// the original vector.
|
||||
else if (isa<ConstantSDNode>(N1.getOperand(2)) &&
|
||||
isa<ConstantSDNode>(N2))
|
||||
if (N1.getOperand(2) == N2) {
|
||||
if (VT == N1.getOperand(1).getValueType())
|
||||
return N1.getOperand(1);
|
||||
else
|
||||
return getSExtOrTrunc(N1.getOperand(1), DL, VT);
|
||||
} else if (isa<ConstantSDNode>(N1.getOperand(2)) &&
|
||||
isa<ConstantSDNode>(N2))
|
||||
return getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, N1.getOperand(0), N2);
|
||||
}
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue