mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
Improve EXTRACT_VECTOR_ELT patch based on comments from Duncan
llvm-svn: 95012
This commit is contained in:
parent
ba52e5e86a
commit
65b01b6ce7
@ -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
Block a user