Rename SetCCResultContents to BooleanContents. In

practice these booleans are mostly produced by SetCC,
however the concept is more general.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@59911 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan Sands 2008-11-23 15:47:28 +00:00
parent cdfc51ffe3
commit 03228089d5
13 changed files with 49 additions and 47 deletions

View File

@ -255,7 +255,7 @@ namespace ISD {
// produce two results: the normal result of the add, and a boolean that // produce two results: the normal result of the add, and a boolean that
// indicates if an overflow occured (*not* a flag, because it may be stored // indicates if an overflow occured (*not* a flag, because it may be stored
// to memory, etc.). If the type of the boolean is not i1 then the high // to memory, etc.). If the type of the boolean is not i1 then the high
// bits conform to getSetCCResultContents. // bits conform to getBooleanContents.
// These nodes are generated from the llvm.[su]add.with.overflow intrinsics. // These nodes are generated from the llvm.[su]add.with.overflow intrinsics.
SADDO, UADDO, SADDO, UADDO,
@ -336,7 +336,7 @@ namespace ISD {
CTTZ, CTLZ, CTPOP, CTTZ, CTLZ, CTPOP,
// Select(COND, TRUEVAL, FALSEVAL). If the type of the boolean COND is not // Select(COND, TRUEVAL, FALSEVAL). If the type of the boolean COND is not
// i1 then the high bits must conform to getSetCCResultContents. // i1 then the high bits must conform to getBooleanContents.
SELECT, SELECT,
// Select with condition operator - This selects between a true value and // Select with condition operator - This selects between a true value and
@ -347,7 +347,7 @@ namespace ISD {
// SetCC operator - This evaluates to a true value iff the condition is // SetCC operator - This evaluates to a true value iff the condition is
// true. If the result value type is not i1 then the high bits conform // true. If the result value type is not i1 then the high bits conform
// to getSetCCResultContents. The operands to this are the left and right // to getBooleanContents. The operands to this are the left and right
// operands to compare (ops #0, and #1) and the condition code to compare // operands to compare (ops #0, and #1) and the condition code to compare
// them with (op #2) as a CondCodeSDNode. // them with (op #2) as a CondCodeSDNode.
SETCC, SETCC,
@ -494,7 +494,7 @@ namespace ISD {
// BRCOND - Conditional branch. The first operand is the chain, the // BRCOND - Conditional branch. The first operand is the chain, the
// second is the condition, the third is the block to branch to if the // second is the condition, the third is the block to branch to if the
// condition is true. If the type of the condition is not i1, then the // condition is true. If the type of the condition is not i1, then the
// high bits must conform to getSetCCResultContents. // high bits must conform to getBooleanContents.
BRCOND, BRCOND,
// BR_CC - Conditional branch. The behavior is like that of SELECT_CC, in // BR_CC - Conditional branch. The behavior is like that of SELECT_CC, in

View File

@ -78,10 +78,10 @@ public:
Extend // Oversized shift pulls in zeros or sign bits. Extend // Oversized shift pulls in zeros or sign bits.
}; };
enum SetCCResultValue { enum BooleanContent { // How the target represents true/false values.
UndefinedSetCCResult, // SetCC returns a garbage/unknown extend. UndefinedBooleanContent, // Only bit 0 counts, the rest can hold garbage.
ZeroOrOneSetCCResult, // SetCC returns a zero extended result. ZeroOrOneBooleanContent, // All bits zero except for bit 0.
ZeroOrNegativeOneSetCCResult // SetCC returns a sign extended result. ZeroOrNegativeOneBooleanContent // All bits equal to bit 0.
}; };
enum SchedPreference { enum SchedPreference {
@ -121,10 +121,12 @@ public:
/// operations. /// operations.
virtual MVT getSetCCResultType(const SDValue &) const; virtual MVT getSetCCResultType(const SDValue &) const;
/// getSetCCResultContents - For targets without boolean registers, this flag /// getBooleanContents - For targets without i1 registers, this gives the
/// returns information about the contents of the high-bits in the setcc /// nature of the high-bits of boolean values held in types wider than i1.
/// result register. /// "Boolean values" are special true/false values produced by nodes like
SetCCResultValue getSetCCResultContents() const { return SetCCResultContents;} /// SETCC and consumed (as the condition) by nodes like SELECT and BRCOND.
/// Not to be confused with general values promoted from i1.
BooleanContent getBooleanContents() const { return BooleanContents;}
/// getSchedulingPreference - Return target scheduling preference. /// getSchedulingPreference - Return target scheduling preference.
SchedPreference getSchedulingPreference() const { SchedPreference getSchedulingPreference() const {
@ -812,9 +814,9 @@ protected:
/// amounts. This type defaults to the pointer type. /// amounts. This type defaults to the pointer type.
void setShiftAmountType(MVT VT) { ShiftAmountTy = VT; } void setShiftAmountType(MVT VT) { ShiftAmountTy = VT; }
/// setSetCCResultContents - Specify how the target extends the result of a /// setBooleanContents - Specify how the target extends the result of a
/// setcc operation in a register. /// boolean value from i1 to a wider type. See getBooleanContents.
void setSetCCResultContents(SetCCResultValue Ty) { SetCCResultContents = Ty; } void setBooleanContents(BooleanContent Ty) { BooleanContents = Ty; }
/// setSchedulingPreference - Specify the target scheduling preference. /// setSchedulingPreference - Specify the target scheduling preference.
void setSchedulingPreference(SchedPreference Pref) { void setSchedulingPreference(SchedPreference Pref) {
@ -1430,9 +1432,9 @@ private:
OutOfRangeShiftAmount ShiftAmtHandling; OutOfRangeShiftAmount ShiftAmtHandling;
/// SetCCResultContents - Information about the contents of the high-bits in /// BooleanContents - Information about the contents of the high-bits in
/// the result of a setcc comparison operation. /// boolean values held in a type wider than i1. See getBooleanContents.
SetCCResultValue SetCCResultContents; BooleanContent BooleanContents;
/// SchedPreferenceInfo - The target scheduling preference: shortest possible /// SchedPreferenceInfo - The target scheduling preference: shortest possible
/// total cycles or lowest register usage. /// total cycles or lowest register usage.

View File

@ -5444,7 +5444,7 @@ SDValue DAGCombiner::SimplifySelectCC(SDValue N0, SDValue N1,
// fold select C, 16, 0 -> shl C, 4 // fold select C, 16, 0 -> shl C, 4
if (N2C && N3C && N3C->isNullValue() && N2C->getAPIntValue().isPowerOf2() && if (N2C && N3C && N3C->isNullValue() && N2C->getAPIntValue().isPowerOf2() &&
TLI.getSetCCResultContents() == TargetLowering::ZeroOrOneSetCCResult) { TLI.getBooleanContents() == TargetLowering::ZeroOrOneBooleanContent) {
// If the caller doesn't want us to simplify this into a zext of a compare, // If the caller doesn't want us to simplify this into a zext of a compare,
// don't do it. // don't do it.

View File

@ -698,19 +698,19 @@ SDValue DAGTypeLegalizer::PromoteIntOp_BRCOND(SDNode *N, unsigned OpNo) {
SDValue Cond = GetPromotedInteger(N->getOperand(1)); // Promote condition. SDValue Cond = GetPromotedInteger(N->getOperand(1)); // Promote condition.
// Make sure the extra bits coming from type promotion conform to // Make sure the extra bits coming from type promotion conform to
// getSetCCResultContents. // getBooleanContents.
unsigned CondBits = Cond.getValueSizeInBits(); unsigned CondBits = Cond.getValueSizeInBits();
switch (TLI.getSetCCResultContents()) { switch (TLI.getBooleanContents()) {
default: default:
assert(false && "Unknown SetCCResultValue!"); assert(false && "Unknown BooleanContent!");
case TargetLowering::UndefinedSetCCResult: case TargetLowering::UndefinedBooleanContent:
// The promoted value, which may contain rubbish in the upper bits, is fine. // The promoted value, which may contain rubbish in the upper bits, is fine.
break; break;
case TargetLowering::ZeroOrOneSetCCResult: case TargetLowering::ZeroOrOneBooleanContent:
if (!DAG.MaskedValueIsZero(Cond,APInt::getHighBitsSet(CondBits,CondBits-1))) if (!DAG.MaskedValueIsZero(Cond,APInt::getHighBitsSet(CondBits,CondBits-1)))
Cond = DAG.getZeroExtendInReg(Cond, MVT::i1); Cond = DAG.getZeroExtendInReg(Cond, MVT::i1);
break; break;
case TargetLowering::ZeroOrNegativeOneSetCCResult: case TargetLowering::ZeroOrNegativeOneBooleanContent:
if (DAG.ComputeNumSignBits(Cond) != CondBits) if (DAG.ComputeNumSignBits(Cond) != CondBits)
Cond = DAG.getNode(ISD::SIGN_EXTEND_INREG, Cond.getValueType(), Cond, Cond = DAG.getNode(ISD::SIGN_EXTEND_INREG, Cond.getValueType(), Cond,
DAG.getValueType(MVT::i1)); DAG.getValueType(MVT::i1));
@ -830,27 +830,27 @@ SDValue DAGTypeLegalizer::PromoteIntOp_SELECT(SDNode *N, unsigned OpNo) {
assert(isTypeLegal(SVT) && "Illegal SetCC type!"); assert(isTypeLegal(SVT) && "Illegal SetCC type!");
assert(Cond.getValueType().bitsLE(SVT) && "Unexpected SetCC type!"); assert(Cond.getValueType().bitsLE(SVT) && "Unexpected SetCC type!");
// Make sure the extra bits conform to getSetCCResultContents. There are // Make sure the extra bits conform to getBooleanContents. There are
// two sets of extra bits: those in Cond, which come from type promotion, // two sets of extra bits: those in Cond, which come from type promotion,
// and those we need to add to have the final type be SVT (for most targets // and those we need to add to have the final type be SVT (for most targets
// this last set of bits is empty). // this last set of bits is empty).
unsigned CondBits = Cond.getValueSizeInBits(); unsigned CondBits = Cond.getValueSizeInBits();
ISD::NodeType ExtendCode; ISD::NodeType ExtendCode;
switch (TLI.getSetCCResultContents()) { switch (TLI.getBooleanContents()) {
default: default:
assert(false && "Unknown SetCCResultValue!"); assert(false && "Unknown BooleanContent!");
case TargetLowering::UndefinedSetCCResult: case TargetLowering::UndefinedBooleanContent:
// Extend to SVT by adding rubbish. // Extend to SVT by adding rubbish.
ExtendCode = ISD::ANY_EXTEND; ExtendCode = ISD::ANY_EXTEND;
break; break;
case TargetLowering::ZeroOrOneSetCCResult: case TargetLowering::ZeroOrOneBooleanContent:
ExtendCode = ISD::ZERO_EXTEND; ExtendCode = ISD::ZERO_EXTEND;
if (!DAG.MaskedValueIsZero(Cond,APInt::getHighBitsSet(CondBits,CondBits-1))) if (!DAG.MaskedValueIsZero(Cond,APInt::getHighBitsSet(CondBits,CondBits-1)))
// All extra bits need to be cleared. Do this by zero extending the // All extra bits need to be cleared. Do this by zero extending the
// original condition value all the way to SVT. // original condition value all the way to SVT.
Cond = N->getOperand(0); Cond = N->getOperand(0);
break; break;
case TargetLowering::ZeroOrNegativeOneSetCCResult: { case TargetLowering::ZeroOrNegativeOneBooleanContent: {
ExtendCode = ISD::SIGN_EXTEND; ExtendCode = ISD::SIGN_EXTEND;
unsigned SignBits = DAG.ComputeNumSignBits(Cond); unsigned SignBits = DAG.ComputeNumSignBits(Cond);
if (SignBits != CondBits) if (SignBits != CondBits)

View File

@ -210,8 +210,8 @@ SDValue DAGTypeLegalizer::ScalarizeVecRes_VSETCC(SDNode *N) {
if (NVT.bitsLE(SVT)) { if (NVT.bitsLE(SVT)) {
// The SETCC result type is bigger than the vector element type. // The SETCC result type is bigger than the vector element type.
// Ensure the SETCC result is sign-extended. // Ensure the SETCC result is sign-extended.
if (TLI.getSetCCResultContents() != if (TLI.getBooleanContents() !=
TargetLowering::ZeroOrNegativeOneSetCCResult) TargetLowering::ZeroOrNegativeOneBooleanContent)
Res = DAG.getNode(ISD::SIGN_EXTEND_INREG, SVT, Res, Res = DAG.getNode(ISD::SIGN_EXTEND_INREG, SVT, Res,
DAG.getValueType(MVT::i1)); DAG.getValueType(MVT::i1));
// Truncate to the final type. // Truncate to the final type.
@ -219,8 +219,8 @@ SDValue DAGTypeLegalizer::ScalarizeVecRes_VSETCC(SDNode *N) {
} else { } else {
// The SETCC result type is smaller than the vector element type. // The SETCC result type is smaller than the vector element type.
// If the SetCC result is not sign-extended, chop it down to MVT::i1. // If the SetCC result is not sign-extended, chop it down to MVT::i1.
if (TLI.getSetCCResultContents() != if (TLI.getBooleanContents() !=
TargetLowering::ZeroOrNegativeOneSetCCResult) TargetLowering::ZeroOrNegativeOneBooleanContent)
Res = DAG.getNode(ISD::TRUNCATE, MVT::i1, Res); Res = DAG.getNode(ISD::TRUNCATE, MVT::i1, Res);
// Sign extend to the final type. // Sign extend to the final type.
return DAG.getNode(ISD::SIGN_EXTEND, NVT, Res); return DAG.getNode(ISD::SIGN_EXTEND, NVT, Res);

View File

@ -1495,10 +1495,10 @@ void SelectionDAG::ComputeMaskedBits(SDValue Op, const APInt &Mask,
case ISD::UADDO: case ISD::UADDO:
if (Op.getResNo() != 1) if (Op.getResNo() != 1)
return; return;
// The boolean result conforms to getSetCCResultContents. Fall through. // The boolean result conforms to getBooleanContents. Fall through.
case ISD::SETCC: case ISD::SETCC:
// If we know the result of a setcc has the top bits zero, use this info. // If we know the result of a setcc has the top bits zero, use this info.
if (TLI.getSetCCResultContents() == TargetLowering::ZeroOrOneSetCCResult && if (TLI.getBooleanContents() == TargetLowering::ZeroOrOneBooleanContent &&
BitWidth > 1) BitWidth > 1)
KnownZero |= APInt::getHighBitsSet(BitWidth, BitWidth - 1); KnownZero |= APInt::getHighBitsSet(BitWidth, BitWidth - 1);
return; return;
@ -1903,11 +1903,11 @@ unsigned SelectionDAG::ComputeNumSignBits(SDValue Op, unsigned Depth) const{
case ISD::UADDO: case ISD::UADDO:
if (Op.getResNo() != 1) if (Op.getResNo() != 1)
break; break;
// The boolean result conforms to getSetCCResultContents. Fall through. // The boolean result conforms to getBooleanContents. Fall through.
case ISD::SETCC: case ISD::SETCC:
// If setcc returns 0/-1, all bits are sign bits. // If setcc returns 0/-1, all bits are sign bits.
if (TLI.getSetCCResultContents() == if (TLI.getBooleanContents() ==
TargetLowering::ZeroOrNegativeOneSetCCResult) TargetLowering::ZeroOrNegativeOneBooleanContent)
return VTBits; return VTBits;
break; break;
case ISD::ROTL: case ISD::ROTL:

View File

@ -462,7 +462,7 @@ TargetLowering::TargetLowering(TargetMachine &tm)
StackPointerRegisterToSaveRestore = 0; StackPointerRegisterToSaveRestore = 0;
ExceptionPointerRegister = 0; ExceptionPointerRegister = 0;
ExceptionSelectorRegister = 0; ExceptionSelectorRegister = 0;
SetCCResultContents = UndefinedSetCCResult; BooleanContents = UndefinedBooleanContent;
SchedPreferenceInfo = SchedulingForLatency; SchedPreferenceInfo = SchedulingForLatency;
JumpBufSize = 0; JumpBufSize = 0;
JumpBufAlignment = 0; JumpBufAlignment = 0;

View File

@ -41,7 +41,7 @@ AlphaTargetLowering::AlphaTargetLowering(TargetMachine &TM) : TargetLowering(TM)
// Set up the TargetLowering object. // Set up the TargetLowering object.
//I am having problems with shr n ubyte 1 //I am having problems with shr n ubyte 1
setShiftAmountType(MVT::i64); setShiftAmountType(MVT::i64);
setSetCCResultContents(ZeroOrOneSetCCResult); setBooleanContents(ZeroOrOneBooleanContent);
setUsesGlobalOffsetTable(true); setUsesGlobalOffsetTable(true);

View File

@ -393,7 +393,7 @@ SPUTargetLowering::SPUTargetLowering(SPUTargetMachine &TM)
setOperationAction(ISD::SCALAR_TO_VECTOR, MVT::v4f32, Custom); setOperationAction(ISD::SCALAR_TO_VECTOR, MVT::v4f32, Custom);
setShiftAmountType(MVT::i32); setShiftAmountType(MVT::i32);
setSetCCResultContents(ZeroOrOneSetCCResult); setBooleanContents(ZeroOrOneBooleanContent);
setStackPointerRegisterToSaveRestore(SPU::R1); setStackPointerRegisterToSaveRestore(SPU::R1);

View File

@ -59,7 +59,7 @@ MipsTargetLowering(MipsTargetMachine &TM): TargetLowering(TM)
// Mips does not have i1 type, so use i32 for // Mips does not have i1 type, so use i32 for
// setcc operations results (slt, sgt, ...). // setcc operations results (slt, sgt, ...).
setSetCCResultContents(ZeroOrOneSetCCResult); setBooleanContents(ZeroOrOneBooleanContent);
// JumpTable targets must use GOT when using PIC_ // JumpTable targets must use GOT when using PIC_
setUsesGlobalOffsetTable(true); setUsesGlobalOffsetTable(true);

View File

@ -341,7 +341,7 @@ PPCTargetLowering::PPCTargetLowering(PPCTargetMachine &TM)
} }
setShiftAmountType(MVT::i32); setShiftAmountType(MVT::i32);
setSetCCResultContents(ZeroOrOneSetCCResult); setBooleanContents(ZeroOrOneBooleanContent);
if (TM.getSubtarget<PPCSubtarget>().isPPC64()) { if (TM.getSubtarget<PPCSubtarget>().isPPC64()) {
setStackPointerRegisterToSaveRestore(PPC::X1); setStackPointerRegisterToSaveRestore(PPC::X1);

View File

@ -63,7 +63,7 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
// X86 is weird, it always uses i8 for shift amounts and setcc results. // X86 is weird, it always uses i8 for shift amounts and setcc results.
setShiftAmountType(MVT::i8); setShiftAmountType(MVT::i8);
setSetCCResultContents(ZeroOrOneSetCCResult); setBooleanContents(ZeroOrOneBooleanContent);
setSchedulingPreference(SchedulingForRegPressure); setSchedulingPreference(SchedulingForRegPressure);
setShiftAmountFlavor(Mask); // shl X, 32 == shl X, 0 setShiftAmountFlavor(Mask); // shl X, 32 == shl X, 0
setStackPointerRegisterToSaveRestore(X86StackPtr); setStackPointerRegisterToSaveRestore(X86StackPtr);

View File

@ -74,7 +74,7 @@ XCoreTargetLowering::XCoreTargetLowering(XCoreTargetMachine &XTM)
setSchedulingPreference(SchedulingForRegPressure); setSchedulingPreference(SchedulingForRegPressure);
// Use i32 for setcc operations results (slt, sgt, ...). // Use i32 for setcc operations results (slt, sgt, ...).
setSetCCResultContents(ZeroOrOneSetCCResult); setBooleanContents(ZeroOrOneBooleanContent);
// XCore does not have the NodeTypes below. // XCore does not have the NodeTypes below.
setOperationAction(ISD::BR_CC, MVT::Other, Expand); setOperationAction(ISD::BR_CC, MVT::Other, Expand);