mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-01 00:17:01 +00:00
Teach DAGCombiner how to fold a SIGN_EXTEND_INREG of a BUILD_VECTOR of
ConstantSDNodes (or UNDEFs) into a simple BUILD_VECTOR. For example, given the following sequence of dag nodes: i32 C = Constant<1> v4i32 V = BUILD_VECTOR C, C, C, C v4i32 Result = SIGN_EXTEND_INREG V, ValueType:v4i1 The SIGN_EXTEND_INREG node can be folded into a build_vector since the vector in input is a BUILD_VECTOR of constants. The optimized sequence is: i32 C = Constant<-1> v4i32 Result = BUILD_VECTOR C, C, C, C git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198084 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -5511,6 +5511,29 @@ SDValue DAGCombiner::visitSIGN_EXTEND_INREG(SDNode *N) {
|
||||
BSwap, N1);
|
||||
}
|
||||
|
||||
// Fold a sext_inreg of a build_vector of ConstantSDNodes or undefs
|
||||
// into a build_vector.
|
||||
if (ISD::isBuildVectorOfConstantSDNodes(N0.getNode())) {
|
||||
SmallVector<SDValue, 8> Elts;
|
||||
unsigned NumElts = N0->getNumOperands();
|
||||
unsigned ShAmt = VTBits - EVTBits;
|
||||
|
||||
for (unsigned i = 0; i != NumElts; ++i) {
|
||||
SDValue Op = N0->getOperand(i);
|
||||
if (Op->getOpcode() == ISD::UNDEF) {
|
||||
Elts.push_back(Op);
|
||||
continue;
|
||||
}
|
||||
|
||||
ConstantSDNode *CurrentND = cast<ConstantSDNode>(Op);
|
||||
const APInt &C = CurrentND->getAPIntValue();
|
||||
Elts.push_back(DAG.getConstant(C.shl(ShAmt).ashr(ShAmt),
|
||||
Op.getValueType()));
|
||||
}
|
||||
|
||||
return DAG.getNode(ISD::BUILD_VECTOR, SDLoc(N), VT, &Elts[0], NumElts);
|
||||
}
|
||||
|
||||
return SDValue();
|
||||
}
|
||||
|
||||
|
||||
@@ -179,6 +179,22 @@ bool ISD::isBuildVectorAllZeros(const SDNode *N) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/// \brief Return true if the specified node is a BUILD_VECTOR node of
|
||||
/// all ConstantSDNode or undef.
|
||||
bool ISD::isBuildVectorOfConstantSDNodes(const SDNode *N) {
|
||||
if (N->getOpcode() != ISD::BUILD_VECTOR)
|
||||
return false;
|
||||
|
||||
for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
|
||||
SDValue Op = N->getOperand(i);
|
||||
if (Op.getOpcode() == ISD::UNDEF)
|
||||
continue;
|
||||
if (!isa<ConstantSDNode>(Op))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/// isScalarToVector - Return true if the specified node is a
|
||||
/// ISD::SCALAR_TO_VECTOR node or a BUILD_VECTOR node where only the low
|
||||
/// element is not an undef.
|
||||
|
||||
Reference in New Issue
Block a user