mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-05 12:31:33 +00:00
Refactor the code that checks that all operands of a node are UNDEFs.
Add a micro-optimization to getNode of CONCAT_VECTORS when both operands are undefs. Can't find a testcase for this because VECTOR_SHUFFLE already handles undef operands, but Duncan suggested that we add this. Together with Michael Kuperstein <michael.m.kuperstein@intel.com> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160229 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7d532c8d07
commit
b87bdac6a3
@ -74,6 +74,10 @@ namespace ISD {
|
||||
/// ISD::SCALAR_TO_VECTOR node or a BUILD_VECTOR node where only the low
|
||||
/// element is not an undef.
|
||||
bool isScalarToVector(const SDNode *N);
|
||||
|
||||
/// allOperandsUndef - Return true if the node has at least one operand
|
||||
/// and all operands of the specified node are ISD::UNDEF.
|
||||
bool allOperandsUndef(const SDNode *N);
|
||||
} // end llvm:ISD namespace
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -7598,6 +7598,11 @@ SDValue DAGCombiner::visitBUILD_VECTOR(SDNode *N) {
|
||||
unsigned NumInScalars = N->getNumOperands();
|
||||
DebugLoc dl = N->getDebugLoc();
|
||||
EVT VT = N->getValueType(0);
|
||||
|
||||
// A vector built entirely of undefs is undef.
|
||||
if (ISD::allOperandsUndef(N))
|
||||
return DAG.getUNDEF(VT);
|
||||
|
||||
// Check to see if this is a BUILD_VECTOR of a bunch of values
|
||||
// which come from any_extend or zero_extend nodes. If so, we can create
|
||||
// a new BUILD_VECTOR using bit-casts which may enable other BUILD_VECTOR
|
||||
@ -7605,12 +7610,11 @@ SDValue DAGCombiner::visitBUILD_VECTOR(SDNode *N) {
|
||||
// using shuffles.
|
||||
EVT SourceType = MVT::Other;
|
||||
bool AllAnyExt = true;
|
||||
bool AllUndef = true;
|
||||
|
||||
for (unsigned i = 0; i != NumInScalars; ++i) {
|
||||
SDValue In = N->getOperand(i);
|
||||
// Ignore undef inputs.
|
||||
if (In.getOpcode() == ISD::UNDEF) continue;
|
||||
AllUndef = false;
|
||||
|
||||
bool AnyExt = In.getOpcode() == ISD::ANY_EXTEND;
|
||||
bool ZeroExt = In.getOpcode() == ISD::ZERO_EXTEND;
|
||||
@ -7638,9 +7642,6 @@ SDValue DAGCombiner::visitBUILD_VECTOR(SDNode *N) {
|
||||
AllAnyExt &= AnyExt;
|
||||
}
|
||||
|
||||
if (AllUndef)
|
||||
return DAG.getUNDEF(VT);
|
||||
|
||||
// In order to have valid types, all of the inputs must be extended from the
|
||||
// same source type and all of the inputs must be any or zero extend.
|
||||
// Scalar sizes must be a power of two.
|
||||
@ -7817,14 +7818,7 @@ SDValue DAGCombiner::visitCONCAT_VECTORS(SDNode *N) {
|
||||
return N->getOperand(0);
|
||||
|
||||
// Check if all of the operands are undefs.
|
||||
bool AllUndef = true;
|
||||
for (unsigned i = 0; i < N->getNumOperands(); ++i)
|
||||
if (N->getOperand(i).getOpcode() != ISD::UNDEF) {
|
||||
AllUndef = false;
|
||||
break;
|
||||
}
|
||||
|
||||
if (AllUndef)
|
||||
if (ISD::allOperandsUndef(N))
|
||||
return DAG.getUNDEF(N->getValueType(0));
|
||||
|
||||
return SDValue();
|
||||
|
@ -219,6 +219,22 @@ bool ISD::isScalarToVector(const SDNode *N) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/// allOperandsUndef - Return true if the node has at least one operand
|
||||
/// and all operands of the specified node are ISD::UNDEF.
|
||||
bool ISD::allOperandsUndef(const SDNode *N) {
|
||||
// Return false if the node has no operands.
|
||||
// This is "logically inconsistent" with the definition of "all" but
|
||||
// is probably the desired behavior.
|
||||
if (N->getNumOperands() == 0)
|
||||
return false;
|
||||
|
||||
for (unsigned i = 0, e = N->getNumOperands(); i != e ; ++i)
|
||||
if (N->getOperand(i).getOpcode() != ISD::UNDEF)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// getSetCCSwappedOperands - Return the operation corresponding to (Y op X)
|
||||
/// when given the operation for (X op Y).
|
||||
ISD::CondCode ISD::getSetCCSwappedOperands(ISD::CondCode Operation) {
|
||||
@ -2674,6 +2690,11 @@ SDValue SelectionDAG::getNode(unsigned Opcode, DebugLoc DL, EVT VT,
|
||||
if (N1 == N2) return N1;
|
||||
break;
|
||||
case ISD::CONCAT_VECTORS:
|
||||
// Concat of UNDEFs is UNDEF.
|
||||
if (N1.getOpcode() == ISD::UNDEF &&
|
||||
N2.getOpcode() == ISD::UNDEF)
|
||||
return getUNDEF(VT);
|
||||
|
||||
// A CONCAT_VECTOR with all operands BUILD_VECTOR can be simplified to
|
||||
// one big BUILD_VECTOR.
|
||||
if (N1.getOpcode() == ISD::BUILD_VECTOR &&
|
||||
|
Loading…
Reference in New Issue
Block a user