forked from OSchip/llvm-project
[NFC][CodeGen] Use ArrayRef in TargetLowering functions
This patch is similar to D122557, adding an `ArrayRef` version for `setOperationAction`, `setLoadExtAction`, `setCondCodeAction`, `setLibcallName`. Reviewed By: craig.topper Differential Revision: https://reviews.llvm.org/D123467
This commit is contained in:
parent
528aa09010
commit
e90110e696
|
@ -2249,21 +2249,33 @@ protected:
|
|||
/// Indicate that the specified operation does not work with the specified
|
||||
/// type and indicate what to do about it. Note that VT may refer to either
|
||||
/// the type of a result or that of an operand of Op.
|
||||
void setOperationAction(unsigned Op, MVT VT, LegalizeAction Action) {
|
||||
assert(Op < array_lengthof(OpActions[0]) && "Table isn't big enough!");
|
||||
OpActions[(unsigned)VT.SimpleTy][Op] = Action;
|
||||
void setOperationAction(ArrayRef<unsigned> Ops, MVT VT,
|
||||
LegalizeAction Action) {
|
||||
for (auto Op : Ops) {
|
||||
assert(Op < array_lengthof(OpActions[0]) && "Table isn't big enough!");
|
||||
OpActions[(unsigned)VT.SimpleTy][Op] = Action;
|
||||
}
|
||||
}
|
||||
void setOperationAction(ArrayRef<unsigned> Ops, ArrayRef<MVT> VTs,
|
||||
LegalizeAction Action) {
|
||||
for (auto VT : VTs)
|
||||
setOperationAction(Ops, VT, Action);
|
||||
}
|
||||
|
||||
/// Indicate that the specified load with extension does not work with the
|
||||
/// specified type and indicate what to do about it.
|
||||
void setLoadExtAction(unsigned ExtType, MVT ValVT, MVT MemVT,
|
||||
void setLoadExtAction(ArrayRef<unsigned> ExtTypes, MVT ValVT, MVT MemVT,
|
||||
LegalizeAction Action) {
|
||||
assert(ExtType < ISD::LAST_LOADEXT_TYPE && ValVT.isValid() &&
|
||||
MemVT.isValid() && "Table isn't big enough!");
|
||||
assert((unsigned)Action < 0x10 && "too many bits for bitfield array");
|
||||
unsigned Shift = 4 * ExtType;
|
||||
LoadExtActions[ValVT.SimpleTy][MemVT.SimpleTy] &= ~((uint16_t)0xF << Shift);
|
||||
LoadExtActions[ValVT.SimpleTy][MemVT.SimpleTy] |= (uint16_t)Action << Shift;
|
||||
for (auto ExtType : ExtTypes) {
|
||||
assert(ExtType < ISD::LAST_LOADEXT_TYPE && ValVT.isValid() &&
|
||||
MemVT.isValid() && "Table isn't big enough!");
|
||||
assert((unsigned)Action < 0x10 && "too many bits for bitfield array");
|
||||
unsigned Shift = 4 * ExtType;
|
||||
LoadExtActions[ValVT.SimpleTy][MemVT.SimpleTy] &=
|
||||
~((uint16_t)0xF << Shift);
|
||||
LoadExtActions[ValVT.SimpleTy][MemVT.SimpleTy] |= (uint16_t)Action
|
||||
<< Shift;
|
||||
}
|
||||
}
|
||||
|
||||
/// Indicate that the specified truncating store does not work with the
|
||||
|
@ -2313,17 +2325,24 @@ protected:
|
|||
|
||||
/// Indicate that the specified condition code is or isn't supported on the
|
||||
/// target and indicate what to do about it.
|
||||
void setCondCodeAction(ISD::CondCode CC, MVT VT,
|
||||
void setCondCodeAction(ArrayRef<ISD::CondCode> CCs, MVT VT,
|
||||
LegalizeAction Action) {
|
||||
assert(VT.isValid() && (unsigned)CC < array_lengthof(CondCodeActions) &&
|
||||
"Table isn't big enough!");
|
||||
assert((unsigned)Action < 0x10 && "too many bits for bitfield array");
|
||||
/// The lower 3 bits of the SimpleTy index into Nth 4bit set from the 32-bit
|
||||
/// value and the upper 29 bits index into the second dimension of the array
|
||||
/// to select what 32-bit value to use.
|
||||
uint32_t Shift = 4 * (VT.SimpleTy & 0x7);
|
||||
CondCodeActions[CC][VT.SimpleTy >> 3] &= ~((uint32_t)0xF << Shift);
|
||||
CondCodeActions[CC][VT.SimpleTy >> 3] |= (uint32_t)Action << Shift;
|
||||
for (auto CC : CCs) {
|
||||
assert(VT.isValid() && (unsigned)CC < array_lengthof(CondCodeActions) &&
|
||||
"Table isn't big enough!");
|
||||
assert((unsigned)Action < 0x10 && "too many bits for bitfield array");
|
||||
/// The lower 3 bits of the SimpleTy index into Nth 4bit set from the
|
||||
/// 32-bit value and the upper 29 bits index into the second dimension of
|
||||
/// the array to select what 32-bit value to use.
|
||||
uint32_t Shift = 4 * (VT.SimpleTy & 0x7);
|
||||
CondCodeActions[CC][VT.SimpleTy >> 3] &= ~((uint32_t)0xF << Shift);
|
||||
CondCodeActions[CC][VT.SimpleTy >> 3] |= (uint32_t)Action << Shift;
|
||||
}
|
||||
}
|
||||
void setCondCodeAction(ArrayRef<ISD::CondCode> CCs, ArrayRef<MVT> VTs,
|
||||
LegalizeAction Action) {
|
||||
for (auto VT : VTs)
|
||||
setCondCodeAction(CCs, VT, Action);
|
||||
}
|
||||
|
||||
/// If Opc/OrigVT is specified as being promoted, the promotion code defaults
|
||||
|
@ -2344,14 +2363,11 @@ protected:
|
|||
/// Targets should invoke this method for each target independent node that
|
||||
/// they want to provide a custom DAG combiner for by implementing the
|
||||
/// PerformDAGCombine virtual method.
|
||||
void setTargetDAGCombine(ISD::NodeType NT) {
|
||||
assert(unsigned(NT >> 3) < array_lengthof(TargetDAGCombineArray));
|
||||
TargetDAGCombineArray[NT >> 3] |= 1 << (NT&7);
|
||||
}
|
||||
|
||||
void setTargetDAGCombine(ArrayRef<ISD::NodeType> NTs) {
|
||||
for (auto NT : NTs)
|
||||
setTargetDAGCombine(NT);
|
||||
for (auto NT : NTs) {
|
||||
assert(unsigned(NT >> 3) < array_lengthof(TargetDAGCombineArray));
|
||||
TargetDAGCombineArray[NT >> 3] |= 1 << (NT & 7);
|
||||
}
|
||||
}
|
||||
|
||||
/// Set the target's minimum function alignment.
|
||||
|
@ -2979,8 +2995,9 @@ public:
|
|||
//
|
||||
|
||||
/// Rename the default libcall routine name for the specified libcall.
|
||||
void setLibcallName(RTLIB::Libcall Call, const char *Name) {
|
||||
LibcallRoutineNames[Call] = Name;
|
||||
void setLibcallName(ArrayRef<RTLIB::Libcall> Calls, const char *Name) {
|
||||
for (auto Call : Calls)
|
||||
LibcallRoutineNames[Call] = Name;
|
||||
}
|
||||
|
||||
/// Get the libcall routine name for the specified libcall.
|
||||
|
|
|
@ -762,91 +762,62 @@ void TargetLoweringBase::initActions() {
|
|||
setOperationAction(ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS, VT, Expand);
|
||||
|
||||
// These operations default to expand.
|
||||
setOperationAction(ISD::FGETSIGN, VT, Expand);
|
||||
setOperationAction(ISD::CONCAT_VECTORS, VT, Expand);
|
||||
setOperationAction(ISD::FMINNUM, VT, Expand);
|
||||
setOperationAction(ISD::FMAXNUM, VT, Expand);
|
||||
setOperationAction(ISD::FMINNUM_IEEE, VT, Expand);
|
||||
setOperationAction(ISD::FMAXNUM_IEEE, VT, Expand);
|
||||
setOperationAction(ISD::FMINIMUM, VT, Expand);
|
||||
setOperationAction(ISD::FMAXIMUM, VT, Expand);
|
||||
setOperationAction(ISD::FMAD, VT, Expand);
|
||||
setOperationAction(ISD::SMIN, VT, Expand);
|
||||
setOperationAction(ISD::SMAX, VT, Expand);
|
||||
setOperationAction(ISD::UMIN, VT, Expand);
|
||||
setOperationAction(ISD::UMAX, VT, Expand);
|
||||
setOperationAction(ISD::ABS, VT, Expand);
|
||||
setOperationAction(ISD::FSHL, VT, Expand);
|
||||
setOperationAction(ISD::FSHR, VT, Expand);
|
||||
setOperationAction(ISD::SADDSAT, VT, Expand);
|
||||
setOperationAction(ISD::UADDSAT, VT, Expand);
|
||||
setOperationAction(ISD::SSUBSAT, VT, Expand);
|
||||
setOperationAction(ISD::USUBSAT, VT, Expand);
|
||||
setOperationAction(ISD::SSHLSAT, VT, Expand);
|
||||
setOperationAction(ISD::USHLSAT, VT, Expand);
|
||||
setOperationAction(ISD::SMULFIX, VT, Expand);
|
||||
setOperationAction(ISD::SMULFIXSAT, VT, Expand);
|
||||
setOperationAction(ISD::UMULFIX, VT, Expand);
|
||||
setOperationAction(ISD::UMULFIXSAT, VT, Expand);
|
||||
setOperationAction(ISD::SDIVFIX, VT, Expand);
|
||||
setOperationAction(ISD::SDIVFIXSAT, VT, Expand);
|
||||
setOperationAction(ISD::UDIVFIX, VT, Expand);
|
||||
setOperationAction(ISD::UDIVFIXSAT, VT, Expand);
|
||||
setOperationAction(ISD::FP_TO_SINT_SAT, VT, Expand);
|
||||
setOperationAction(ISD::FP_TO_UINT_SAT, VT, Expand);
|
||||
setOperationAction({ISD::FGETSIGN, ISD::CONCAT_VECTORS,
|
||||
ISD::FMINNUM, ISD::FMAXNUM,
|
||||
ISD::FMINNUM_IEEE, ISD::FMAXNUM_IEEE,
|
||||
ISD::FMINIMUM, ISD::FMAXIMUM,
|
||||
ISD::FMAD, ISD::SMIN,
|
||||
ISD::SMAX, ISD::UMIN,
|
||||
ISD::UMAX, ISD::ABS,
|
||||
ISD::FSHL, ISD::FSHR,
|
||||
ISD::SADDSAT, ISD::UADDSAT,
|
||||
ISD::SSUBSAT, ISD::USUBSAT,
|
||||
ISD::SSHLSAT, ISD::USHLSAT,
|
||||
ISD::SMULFIX, ISD::SMULFIXSAT,
|
||||
ISD::UMULFIX, ISD::UMULFIXSAT,
|
||||
ISD::SDIVFIX, ISD::SDIVFIXSAT,
|
||||
ISD::UDIVFIX, ISD::UDIVFIXSAT,
|
||||
ISD::FP_TO_SINT_SAT, ISD::FP_TO_UINT_SAT},
|
||||
VT, Expand);
|
||||
|
||||
// Overflow operations default to expand
|
||||
setOperationAction(ISD::SADDO, VT, Expand);
|
||||
setOperationAction(ISD::SSUBO, VT, Expand);
|
||||
setOperationAction(ISD::UADDO, VT, Expand);
|
||||
setOperationAction(ISD::USUBO, VT, Expand);
|
||||
setOperationAction(ISD::SMULO, VT, Expand);
|
||||
setOperationAction(ISD::UMULO, VT, Expand);
|
||||
setOperationAction({ISD::SADDO, ISD::SSUBO, ISD::UADDO, ISD::USUBO,
|
||||
ISD::SMULO, ISD::UMULO},
|
||||
VT, Expand);
|
||||
|
||||
// ADDCARRY operations default to expand
|
||||
setOperationAction(ISD::ADDCARRY, VT, Expand);
|
||||
setOperationAction(ISD::SUBCARRY, VT, Expand);
|
||||
setOperationAction(ISD::SETCCCARRY, VT, Expand);
|
||||
setOperationAction(ISD::SADDO_CARRY, VT, Expand);
|
||||
setOperationAction(ISD::SSUBO_CARRY, VT, Expand);
|
||||
setOperationAction({ISD::ADDCARRY, ISD::SUBCARRY, ISD::SETCCCARRY,
|
||||
ISD::SADDO_CARRY, ISD::SSUBO_CARRY},
|
||||
VT, Expand);
|
||||
|
||||
// ADDC/ADDE/SUBC/SUBE default to expand.
|
||||
setOperationAction(ISD::ADDC, VT, Expand);
|
||||
setOperationAction(ISD::ADDE, VT, Expand);
|
||||
setOperationAction(ISD::SUBC, VT, Expand);
|
||||
setOperationAction(ISD::SUBE, VT, Expand);
|
||||
setOperationAction({ISD::ADDC, ISD::ADDE, ISD::SUBC, ISD::SUBE}, VT,
|
||||
Expand);
|
||||
|
||||
// Halving adds
|
||||
setOperationAction(ISD::AVGFLOORS, VT, Expand);
|
||||
setOperationAction(ISD::AVGFLOORU, VT, Expand);
|
||||
setOperationAction(ISD::AVGCEILS, VT, Expand);
|
||||
setOperationAction(ISD::AVGCEILU, VT, Expand);
|
||||
setOperationAction(
|
||||
{ISD::AVGFLOORS, ISD::AVGFLOORU, ISD::AVGCEILS, ISD::AVGCEILU}, VT,
|
||||
Expand);
|
||||
|
||||
// Absolute difference
|
||||
setOperationAction(ISD::ABDS, VT, Expand);
|
||||
setOperationAction(ISD::ABDU, VT, Expand);
|
||||
setOperationAction({ISD::ABDS, ISD::ABDU}, VT, Expand);
|
||||
|
||||
// These default to Expand so they will be expanded to CTLZ/CTTZ by default.
|
||||
setOperationAction(ISD::CTLZ_ZERO_UNDEF, VT, Expand);
|
||||
setOperationAction(ISD::CTTZ_ZERO_UNDEF, VT, Expand);
|
||||
setOperationAction({ISD::CTLZ_ZERO_UNDEF, ISD::CTTZ_ZERO_UNDEF}, VT,
|
||||
Expand);
|
||||
|
||||
setOperationAction(ISD::BITREVERSE, VT, Expand);
|
||||
setOperationAction(ISD::PARITY, VT, Expand);
|
||||
setOperationAction({ISD::BITREVERSE, ISD::PARITY}, VT, Expand);
|
||||
|
||||
// These library functions default to expand.
|
||||
setOperationAction(ISD::FROUND, VT, Expand);
|
||||
setOperationAction(ISD::FROUNDEVEN, VT, Expand);
|
||||
setOperationAction(ISD::FPOWI, VT, Expand);
|
||||
setOperationAction({ISD::FROUND, ISD::FROUNDEVEN, ISD::FPOWI}, VT, Expand);
|
||||
|
||||
// These operations default to expand for vector types.
|
||||
if (VT.isVector()) {
|
||||
setOperationAction(ISD::FCOPYSIGN, VT, Expand);
|
||||
setOperationAction(ISD::SIGN_EXTEND_INREG, VT, Expand);
|
||||
setOperationAction(ISD::ANY_EXTEND_VECTOR_INREG, VT, Expand);
|
||||
setOperationAction(ISD::SIGN_EXTEND_VECTOR_INREG, VT, Expand);
|
||||
setOperationAction(ISD::ZERO_EXTEND_VECTOR_INREG, VT, Expand);
|
||||
setOperationAction(ISD::SPLAT_VECTOR, VT, Expand);
|
||||
}
|
||||
if (VT.isVector())
|
||||
setOperationAction({ISD::FCOPYSIGN, ISD::SIGN_EXTEND_INREG,
|
||||
ISD::ANY_EXTEND_VECTOR_INREG,
|
||||
ISD::SIGN_EXTEND_VECTOR_INREG,
|
||||
ISD::ZERO_EXTEND_VECTOR_INREG, ISD::SPLAT_VECTOR},
|
||||
VT, Expand);
|
||||
|
||||
// Constrained floating-point operations default to expand.
|
||||
#define DAG_INSTRUCTION(NAME, NARG, ROUND_MODE, INTRINSIC, DAGN) \
|
||||
|
@ -857,21 +828,13 @@ void TargetLoweringBase::initActions() {
|
|||
setOperationAction(ISD::GET_DYNAMIC_AREA_OFFSET, VT, Expand);
|
||||
|
||||
// Vector reduction default to expand.
|
||||
setOperationAction(ISD::VECREDUCE_FADD, VT, Expand);
|
||||
setOperationAction(ISD::VECREDUCE_FMUL, VT, Expand);
|
||||
setOperationAction(ISD::VECREDUCE_ADD, VT, Expand);
|
||||
setOperationAction(ISD::VECREDUCE_MUL, VT, Expand);
|
||||
setOperationAction(ISD::VECREDUCE_AND, VT, Expand);
|
||||
setOperationAction(ISD::VECREDUCE_OR, VT, Expand);
|
||||
setOperationAction(ISD::VECREDUCE_XOR, VT, Expand);
|
||||
setOperationAction(ISD::VECREDUCE_SMAX, VT, Expand);
|
||||
setOperationAction(ISD::VECREDUCE_SMIN, VT, Expand);
|
||||
setOperationAction(ISD::VECREDUCE_UMAX, VT, Expand);
|
||||
setOperationAction(ISD::VECREDUCE_UMIN, VT, Expand);
|
||||
setOperationAction(ISD::VECREDUCE_FMAX, VT, Expand);
|
||||
setOperationAction(ISD::VECREDUCE_FMIN, VT, Expand);
|
||||
setOperationAction(ISD::VECREDUCE_SEQ_FADD, VT, Expand);
|
||||
setOperationAction(ISD::VECREDUCE_SEQ_FMUL, VT, Expand);
|
||||
setOperationAction(
|
||||
{ISD::VECREDUCE_FADD, ISD::VECREDUCE_FMUL, ISD::VECREDUCE_ADD,
|
||||
ISD::VECREDUCE_MUL, ISD::VECREDUCE_AND, ISD::VECREDUCE_OR,
|
||||
ISD::VECREDUCE_XOR, ISD::VECREDUCE_SMAX, ISD::VECREDUCE_SMIN,
|
||||
ISD::VECREDUCE_UMAX, ISD::VECREDUCE_UMIN, ISD::VECREDUCE_FMAX,
|
||||
ISD::VECREDUCE_FMIN, ISD::VECREDUCE_SEQ_FADD, ISD::VECREDUCE_SEQ_FMUL},
|
||||
VT, Expand);
|
||||
|
||||
// Named vector shuffles default to expand.
|
||||
setOperationAction(ISD::VECTOR_SPLICE, VT, Expand);
|
||||
|
@ -886,30 +849,16 @@ void TargetLoweringBase::initActions() {
|
|||
// ConstantFP nodes default to expand. Targets can either change this to
|
||||
// Legal, in which case all fp constants are legal, or use isFPImmLegal()
|
||||
// to optimize expansions for certain constants.
|
||||
setOperationAction(ISD::ConstantFP, MVT::f16, Expand);
|
||||
setOperationAction(ISD::ConstantFP, MVT::f32, Expand);
|
||||
setOperationAction(ISD::ConstantFP, MVT::f64, Expand);
|
||||
setOperationAction(ISD::ConstantFP, MVT::f80, Expand);
|
||||
setOperationAction(ISD::ConstantFP, MVT::f128, Expand);
|
||||
setOperationAction(ISD::ConstantFP,
|
||||
{MVT::f16, MVT::f32, MVT::f64, MVT::f80, MVT::f128},
|
||||
Expand);
|
||||
|
||||
// These library functions default to expand.
|
||||
for (MVT VT : {MVT::f32, MVT::f64, MVT::f128}) {
|
||||
setOperationAction(ISD::FCBRT, VT, Expand);
|
||||
setOperationAction(ISD::FLOG , VT, Expand);
|
||||
setOperationAction(ISD::FLOG2, VT, Expand);
|
||||
setOperationAction(ISD::FLOG10, VT, Expand);
|
||||
setOperationAction(ISD::FEXP , VT, Expand);
|
||||
setOperationAction(ISD::FEXP2, VT, Expand);
|
||||
setOperationAction(ISD::FFLOOR, VT, Expand);
|
||||
setOperationAction(ISD::FNEARBYINT, VT, Expand);
|
||||
setOperationAction(ISD::FCEIL, VT, Expand);
|
||||
setOperationAction(ISD::FRINT, VT, Expand);
|
||||
setOperationAction(ISD::FTRUNC, VT, Expand);
|
||||
setOperationAction(ISD::LROUND, VT, Expand);
|
||||
setOperationAction(ISD::LLROUND, VT, Expand);
|
||||
setOperationAction(ISD::LRINT, VT, Expand);
|
||||
setOperationAction(ISD::LLRINT, VT, Expand);
|
||||
}
|
||||
setOperationAction({ISD::FCBRT, ISD::FLOG, ISD::FLOG2, ISD::FLOG10, ISD::FEXP,
|
||||
ISD::FEXP2, ISD::FFLOOR, ISD::FNEARBYINT, ISD::FCEIL,
|
||||
ISD::FRINT, ISD::FTRUNC, ISD::LROUND, ISD::LLROUND,
|
||||
ISD::LRINT, ISD::LLRINT},
|
||||
{MVT::f32, MVT::f64, MVT::f128}, Expand);
|
||||
|
||||
// Default ISD::TRAP to expand (which turns it into abort).
|
||||
setOperationAction(ISD::TRAP, MVT::Other, Expand);
|
||||
|
|
Loading…
Reference in New Issue