[NFC] Make FPClassTest a bitmask enumeration

With this change bitwise operations are allowed for FPClassTest
enumeration, it must simplify using this type. Also some functions
changed to get argument of type FPClassTest instead of unsigned.

Differential Revision: https://reviews.llvm.org/D144241
This commit is contained in:
Serge Pavlov
2023-02-22 14:20:04 +07:00
parent 3a3ab2147d
commit 2e416cdd52
7 changed files with 21 additions and 13 deletions

View File

@@ -15,6 +15,7 @@
#ifndef LLVM_ADT_FLOATINGPOINTMODE_H
#define LLVM_ADT_FLOATINGPOINTMODE_H
#include "llvm/ADT/BitmaskEnum.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Support/raw_ostream.h"
@@ -192,11 +193,11 @@ void DenormalMode::print(raw_ostream &OS) const {
OS << denormalModeKindName(Output) << ',' << denormalModeKindName(Input);
}
} // namespace llvm
/// Floating-point class tests, supported by 'is_fpclass' intrinsic. Actual
/// test may be an OR combination of basic tests.
enum FPClassTest {
enum FPClassTest : unsigned {
fcNone = 0,
fcSNan = 0x0001,
fcQNan = 0x0002,
fcNegInf = 0x0004,
@@ -216,7 +217,11 @@ enum FPClassTest {
fcPosFinite = fcPosNormal | fcPosSubnormal | fcPosZero,
fcNegFinite = fcNegNormal | fcNegSubnormal | fcNegZero,
fcFinite = fcPosFinite | fcNegFinite,
fcAllFlags = fcNan | fcInf | fcFinite
fcAllFlags = fcNan | fcInf | fcFinite,
};
LLVM_DECLARE_ENUM_AS_BITMASK(FPClassTest, /* LargestValue */ fcPosInf);
} // namespace llvm
#endif // LLVM_ADT_FLOATINGPOINTMODE_H

View File

@@ -19,6 +19,8 @@
namespace llvm {
class BasicBlock;
enum FPClassTest : unsigned;
/// Encapsulates all of the information needed to generate a stack protector
/// check, and signals to isel when initialized that one needs to be generated.
///
@@ -218,7 +220,7 @@ findSplitPointForStackProtector(MachineBasicBlock *BB,
/// \param Test The test as specified in 'is_fpclass' intrinsic invocation.
/// \returns The inverted test, or zero, if inversion does not produce simpler
/// test.
unsigned getInvertedFPClassTest(unsigned Test);
FPClassTest getInvertedFPClassTest(FPClassTest Test);
/// Assuming the instruction \p MI is going to be deleted, attempt to salvage
/// debug users of \p MI by writing the effect of \p MI in a DIExpression.

View File

@@ -4956,7 +4956,7 @@ public:
/// \param Test The test to perform.
/// \param Flags The optimization flags.
/// \returns The expansion result or SDValue() if it fails.
SDValue expandIS_FPCLASS(EVT ResultVT, SDValue Op, unsigned Test,
SDValue expandIS_FPCLASS(EVT ResultVT, SDValue Op, FPClassTest Test,
SDNodeFlags Flags, const SDLoc &DL,
SelectionDAG &DAG) const;

View File

@@ -173,8 +173,8 @@ llvm::findSplitPointForStackProtector(MachineBasicBlock *BB,
return SplitPoint;
}
unsigned llvm::getInvertedFPClassTest(unsigned Test) {
unsigned InvertedTest = ~Test & fcAllFlags;
FPClassTest llvm::getInvertedFPClassTest(FPClassTest Test) {
FPClassTest InvertedTest = ~Test & fcAllFlags;
switch (InvertedTest) {
default:
break;
@@ -198,7 +198,7 @@ unsigned llvm::getInvertedFPClassTest(unsigned Test) {
case fcNegFinite:
return InvertedTest;
}
return 0;
return fcNone;
}
static MachineOperand *getSalvageOpsForCopy(const MachineRegisterInfo &MRI,

View File

@@ -6510,7 +6510,8 @@ void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
const DataLayout DLayout = DAG.getDataLayout();
EVT DestVT = TLI.getValueType(DLayout, I.getType());
EVT ArgVT = TLI.getValueType(DLayout, I.getArgOperand(0)->getType());
unsigned Test = cast<ConstantInt>(I.getArgOperand(1))->getZExtValue();
FPClassTest Test = static_cast<FPClassTest>(
cast<ConstantInt>(I.getArgOperand(1))->getZExtValue());
MachineFunction &MF = DAG.getMachineFunction();
const Function &F = MF.getFunction();
SDValue Op = getValue(I.getArgOperand(0));

View File

@@ -8004,7 +8004,7 @@ SDValue TargetLowering::expandFMINNUM_FMAXNUM(SDNode *Node,
}
SDValue TargetLowering::expandIS_FPCLASS(EVT ResultVT, SDValue Op,
unsigned Test, SDNodeFlags Flags,
FPClassTest Test, SDNodeFlags Flags,
const SDLoc &DL,
SelectionDAG &DAG) const {
EVT OperandVT = Op.getValueType();
@@ -8027,7 +8027,7 @@ SDValue TargetLowering::expandIS_FPCLASS(EVT ResultVT, SDValue Op,
// Some checks may be represented as inversion of simpler check, for example
// "inf|normal|subnormal|zero" => !"nan".
bool IsInverted = false;
if (unsigned InvertedCheck = getInvertedFPClassTest(Test)) {
if (FPClassTest InvertedCheck = getInvertedFPClassTest(Test)) {
IsInverted = true;
Test = InvertedCheck;
}

View File

@@ -5070,7 +5070,7 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
}
case Intrinsic::is_fpclass: {
const ConstantInt *TestMask = cast<ConstantInt>(Call.getOperand(1));
Check((TestMask->getZExtValue() & ~fcAllFlags) == 0,
Check((TestMask->getZExtValue() & ~static_cast<unsigned>(fcAllFlags)) == 0,
"unsupported bits for llvm.is.fpclass test mask");
break;
}