diff --git a/llvm/include/llvm/ADT/FloatingPointMode.h b/llvm/include/llvm/ADT/FloatingPointMode.h --- a/llvm/include/llvm/ADT/FloatingPointMode.h +++ b/llvm/include/llvm/ADT/FloatingPointMode.h @@ -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 @@ 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 @@ 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 diff --git a/llvm/include/llvm/CodeGen/CodeGenCommonISel.h b/llvm/include/llvm/CodeGen/CodeGenCommonISel.h --- a/llvm/include/llvm/CodeGen/CodeGenCommonISel.h +++ b/llvm/include/llvm/CodeGen/CodeGenCommonISel.h @@ -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 @@ /// \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. diff --git a/llvm/include/llvm/CodeGen/TargetLowering.h b/llvm/include/llvm/CodeGen/TargetLowering.h --- a/llvm/include/llvm/CodeGen/TargetLowering.h +++ b/llvm/include/llvm/CodeGen/TargetLowering.h @@ -4956,7 +4956,7 @@ /// \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; diff --git a/llvm/lib/CodeGen/CodeGenCommonISel.cpp b/llvm/lib/CodeGen/CodeGenCommonISel.cpp --- a/llvm/lib/CodeGen/CodeGenCommonISel.cpp +++ b/llvm/lib/CodeGen/CodeGenCommonISel.cpp @@ -173,8 +173,8 @@ 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 @@ case fcNegFinite: return InvertedTest; } - return 0; + return fcNone; } static MachineOperand *getSalvageOpsForCopy(const MachineRegisterInfo &MRI, diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -6510,7 +6510,8 @@ const DataLayout DLayout = DAG.getDataLayout(); EVT DestVT = TLI.getValueType(DLayout, I.getType()); EVT ArgVT = TLI.getValueType(DLayout, I.getArgOperand(0)->getType()); - unsigned Test = cast(I.getArgOperand(1))->getZExtValue(); + FPClassTest Test = static_cast( + cast(I.getArgOperand(1))->getZExtValue()); MachineFunction &MF = DAG.getMachineFunction(); const Function &F = MF.getFunction(); SDValue Op = getValue(I.getArgOperand(0)); diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp --- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp @@ -8004,7 +8004,7 @@ } 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 @@ // 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; } diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -5070,7 +5070,7 @@ } case Intrinsic::is_fpclass: { const ConstantInt *TestMask = cast(Call.getOperand(1)); - Check((TestMask->getZExtValue() & ~fcAllFlags) == 0, + Check((TestMask->getZExtValue() & ~static_cast(fcAllFlags)) == 0, "unsupported bits for llvm.is.fpclass test mask"); break; }