Skip to content

Commit

Permalink
Use llvm::bit_cast (NFC)
Browse files Browse the repository at this point in the history
  • Loading branch information
kazutakahirata committed Feb 14, 2023
1 parent 544831a commit 64dad4b
Show file tree
Hide file tree
Showing 18 changed files with 131 additions and 122 deletions.
2 changes: 1 addition & 1 deletion clang-tools-extra/clangd/Quality.cpp
Expand Up @@ -538,7 +538,7 @@ static uint32_t encodeFloat(float F) {
constexpr uint32_t TopBit = ~(~uint32_t{0} >> 1);

// Get the bits of the float. Endianness is the same as for integers.
uint32_t U = llvm::FloatToBits(F);
uint32_t U = llvm::bit_cast<uint32_t>(F);
// IEEE 754 floats compare like sign-magnitude integers.
if (U & TopBit) // Negative float.
return 0 - U; // Map onto the low half of integers, order reversed.
Expand Down
8 changes: 4 additions & 4 deletions llvm/include/llvm/ADT/APInt.h
Expand Up @@ -1665,31 +1665,31 @@ class [[nodiscard]] APInt {
/// The conversion does not do a translation from integer to double, it just
/// re-interprets the bits as a double. Note that it is valid to do this on
/// any bit width. Exactly 64 bits will be translated.
double bitsToDouble() const { return BitsToDouble(getWord(0)); }
double bitsToDouble() const { return llvm::bit_cast<double>(getWord(0)); }

/// Converts APInt bits to a float
///
/// The conversion does not do a translation from integer to float, it just
/// re-interprets the bits as a float. Note that it is valid to do this on
/// any bit width. Exactly 32 bits will be translated.
float bitsToFloat() const {
return BitsToFloat(static_cast<uint32_t>(getWord(0)));
return llvm::bit_cast<float>(static_cast<uint32_t>(getWord(0)));
}

/// Converts a double to APInt bits.
///
/// The conversion does not do a translation from double to integer, it just
/// re-interprets the bits of the double.
static APInt doubleToBits(double V) {
return APInt(sizeof(double) * CHAR_BIT, DoubleToBits(V));
return APInt(sizeof(double) * CHAR_BIT, llvm::bit_cast<uint64_t>(V));
}

/// Converts a float to APInt bits.
///
/// The conversion does not do a translation from float to integer, it just
/// re-interprets the bits of the float.
static APInt floatToBits(float V) {
return APInt(sizeof(float) * CHAR_BIT, FloatToBits(V));
return APInt(sizeof(float) * CHAR_BIT, llvm::bit_cast<uint32_t>(V));
}

/// @}
Expand Down
4 changes: 2 additions & 2 deletions llvm/include/llvm/Support/EndianStream.h
Expand Up @@ -32,13 +32,13 @@ inline void write(raw_ostream &os, value_type value, endianness endian) {

template <>
inline void write<float>(raw_ostream &os, float value, endianness endian) {
write(os, FloatToBits(value), endian);
write(os, llvm::bit_cast<uint32_t>(value), endian);
}

template <>
inline void write<double>(raw_ostream &os, double value,
endianness endian) {
write(os, DoubleToBits(value), endian);
write(os, llvm::bit_cast<uint64_t>(value), endian);
}

template <typename value_type>
Expand Down
6 changes: 4 additions & 2 deletions llvm/lib/BinaryFormat/MsgPackReader.cpp
Expand Up @@ -74,7 +74,8 @@ Expected<bool> Reader::read(Object &Obj) {
return make_error<StringError>(
"Invalid Float32 with insufficient payload",
std::make_error_code(std::errc::invalid_argument));
Obj.Float = BitsToFloat(endian::read<uint32_t, Endianness>(Current));
Obj.Float =
llvm::bit_cast<float>(endian::read<uint32_t, Endianness>(Current));
Current += sizeof(float);
return true;
case FirstByte::Float64:
Expand All @@ -83,7 +84,8 @@ Expected<bool> Reader::read(Object &Obj) {
return make_error<StringError>(
"Invalid Float64 with insufficient payload",
std::make_error_code(std::errc::invalid_argument));
Obj.Float = BitsToDouble(endian::read<uint64_t, Endianness>(Current));
Obj.Float =
llvm::bit_cast<double>(endian::read<uint64_t, Endianness>(Current));
Current += sizeof(double);
return true;
case FirstByte::Str8:
Expand Down
8 changes: 4 additions & 4 deletions llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
Expand Up @@ -2365,10 +2365,10 @@ SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(SDNode *Node,
SDValue Load =
DAG.getLoad(MVT::f64, dl, MemChain, StackSlot, MachinePointerInfo());
// FP constant to bias correct the final result
SDValue Bias = DAG.getConstantFP(isSigned ?
BitsToDouble(0x4330000080000000ULL) :
BitsToDouble(0x4330000000000000ULL),
dl, MVT::f64);
SDValue Bias = DAG.getConstantFP(
isSigned ? llvm::bit_cast<double>(0x4330000080000000ULL)
: llvm::bit_cast<double>(0x4330000000000000ULL),
dl, MVT::f64);
// Subtract the bias and get the final result.
SDValue Sub;
SDValue Result;
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
Expand Up @@ -7912,7 +7912,7 @@ bool TargetLowering::expandUINT_TO_FP(SDNode *Node, SDValue &Result,
// -0.0. This will be added to +0.0 and produce -0.0 which is incorrect.
SDValue TwoP52 = DAG.getConstant(UINT64_C(0x4330000000000000), dl, SrcVT);
SDValue TwoP84PlusTwoP52 = DAG.getConstantFP(
BitsToDouble(UINT64_C(0x4530000000100000)), dl, DstVT);
llvm::bit_cast<double>(UINT64_C(0x4530000000100000)), dl, DstVT);
SDValue TwoP84 = DAG.getConstant(UINT64_C(0x4530000000000000), dl, SrcVT);
SDValue LoMask = DAG.getConstant(UINT64_C(0x00000000FFFFFFFF), dl, SrcVT);
SDValue HiShift = DAG.getConstant(32, dl, ShiftVT);
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/Target/AMDGPU/AMDGPUCodeGenPrepare.cpp
Expand Up @@ -1147,7 +1147,7 @@ Value *AMDGPUCodeGenPrepare::expandDivRem32(IRBuilder<> &Builder,
Value *FloatY = Builder.CreateUIToFP(Y, F32Ty);
Function *Rcp = Intrinsic::getDeclaration(Mod, Intrinsic::amdgcn_rcp, F32Ty);
Value *RcpY = Builder.CreateCall(Rcp, {FloatY});
Constant *Scale = ConstantFP::get(F32Ty, BitsToFloat(0x4F7FFFFE));
Constant *Scale = ConstantFP::get(F32Ty, llvm::bit_cast<float>(0x4F7FFFFE));
Value *ScaledY = Builder.CreateFMul(RcpY, Scale);
Value *Z = Builder.CreateFPToUI(ScaledY, I32Ty);

Expand Down
18 changes: 10 additions & 8 deletions llvm/lib/Target/AMDGPU/AMDGPUISelLowering.cpp
Expand Up @@ -2721,15 +2721,17 @@ SDValue AMDGPUTargetLowering::LowerFP_TO_INT64(SDValue Op, SelectionDAG &DAG,

SDValue K0, K1;
if (SrcVT == MVT::f64) {
K0 = DAG.getConstantFP(BitsToDouble(UINT64_C(/*2^-32*/ 0x3df0000000000000)),
SL, SrcVT);
K1 = DAG.getConstantFP(BitsToDouble(UINT64_C(/*-2^32*/ 0xc1f0000000000000)),
SL, SrcVT);
K0 = DAG.getConstantFP(
llvm::bit_cast<double>(UINT64_C(/*2^-32*/ 0x3df0000000000000)), SL,
SrcVT);
K1 = DAG.getConstantFP(
llvm::bit_cast<double>(UINT64_C(/*-2^32*/ 0xc1f0000000000000)), SL,
SrcVT);
} else {
K0 = DAG.getConstantFP(BitsToFloat(UINT32_C(/*2^-32*/ 0x2f800000)), SL,
SrcVT);
K1 = DAG.getConstantFP(BitsToFloat(UINT32_C(/*-2^32*/ 0xcf800000)), SL,
SrcVT);
K0 = DAG.getConstantFP(
llvm::bit_cast<float>(UINT32_C(/*2^-32*/ 0x2f800000)), SL, SrcVT);
K1 = DAG.getConstantFP(
llvm::bit_cast<float>(UINT32_C(/*-2^32*/ 0xcf800000)), SL, SrcVT);
}
// TODO: Should this propagate fast-math-flags?
SDValue Mul = DAG.getNode(ISD::FMUL, SL, SrcVT, Trunc, K0);
Expand Down
39 changes: 22 additions & 17 deletions llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp
Expand Up @@ -2279,13 +2279,15 @@ bool AMDGPULegalizerInfo::legalizeFPTOI(MachineInstr &MI,
}
MachineInstrBuilder K0, K1;
if (SrcLT == S64) {
K0 = B.buildFConstant(S64,
BitsToDouble(UINT64_C(/*2^-32*/ 0x3df0000000000000)));
K1 = B.buildFConstant(S64,
BitsToDouble(UINT64_C(/*-2^32*/ 0xc1f0000000000000)));
K0 = B.buildFConstant(
S64, llvm::bit_cast<double>(UINT64_C(/*2^-32*/ 0x3df0000000000000)));
K1 = B.buildFConstant(
S64, llvm::bit_cast<double>(UINT64_C(/*-2^32*/ 0xc1f0000000000000)));
} else {
K0 = B.buildFConstant(S32, BitsToFloat(UINT32_C(/*2^-32*/ 0x2f800000)));
K1 = B.buildFConstant(S32, BitsToFloat(UINT32_C(/*-2^32*/ 0xcf800000)));
K0 = B.buildFConstant(
S32, llvm::bit_cast<float>(UINT32_C(/*2^-32*/ 0x2f800000)));
K1 = B.buildFConstant(
S32, llvm::bit_cast<float>(UINT32_C(/*-2^32*/ 0xcf800000)));
}

auto Mul = B.buildFMul(SrcLT, Trunc, K0, Flags);
Expand Down Expand Up @@ -2837,7 +2839,8 @@ bool AMDGPULegalizerInfo::legalizeFFloor(MachineInstr &MI,
// shouldn't matter?
Register ModSrc = stripAnySourceMods(OrigSrc, MRI);

auto Const = B.buildFConstant(S64, BitsToDouble(0x3fefffffffffffff));
auto Const =
B.buildFConstant(S64, llvm::bit_cast<double>(0x3fefffffffffffff));

Register Min = MRI.createGenericVirtualRegister(S64);

Expand Down Expand Up @@ -3438,7 +3441,7 @@ void AMDGPULegalizerInfo::legalizeUnsignedDIV_REM32Impl(MachineIRBuilder &B,
// Initial estimate of inv(y).
auto FloatY = B.buildUITOFP(S32, Y);
auto RcpIFlag = B.buildInstr(AMDGPU::G_AMDGPU_RCP_IFLAG, {S32}, {FloatY});
auto Scale = B.buildFConstant(S32, BitsToFloat(0x4f7ffffe));
auto Scale = B.buildFConstant(S32, llvm::bit_cast<float>(0x4f7ffffe));
auto ScaledY = B.buildFMul(S32, RcpIFlag, Scale);
auto Z = B.buildFPTOUI(S32, ScaledY);

Expand Down Expand Up @@ -3488,21 +3491,23 @@ static std::pair<Register, Register> emitReciprocalU64(MachineIRBuilder &B,
auto CvtLo = B.buildUITOFP(S32, Unmerge.getReg(0));
auto CvtHi = B.buildUITOFP(S32, Unmerge.getReg(1));

auto Mad = B.buildFMAD(S32, CvtHi, // 2**32
B.buildFConstant(S32, BitsToFloat(0x4f800000)), CvtLo);
auto Mad = B.buildFMAD(
S32, CvtHi, // 2**32
B.buildFConstant(S32, llvm::bit_cast<float>(0x4f800000)), CvtLo);

auto Rcp = B.buildInstr(AMDGPU::G_AMDGPU_RCP_IFLAG, {S32}, {Mad});
auto Mul1 =
B.buildFMul(S32, Rcp, B.buildFConstant(S32, BitsToFloat(0x5f7ffffc)));
auto Mul1 = B.buildFMul(
S32, Rcp, B.buildFConstant(S32, llvm::bit_cast<float>(0x5f7ffffc)));

// 2**(-32)
auto Mul2 =
B.buildFMul(S32, Mul1, B.buildFConstant(S32, BitsToFloat(0x2f800000)));
auto Mul2 = B.buildFMul(
S32, Mul1, B.buildFConstant(S32, llvm::bit_cast<float>(0x2f800000)));
auto Trunc = B.buildIntrinsicTrunc(S32, Mul2);

// -(2**32)
auto Mad2 = B.buildFMAD(S32, Trunc,
B.buildFConstant(S32, BitsToFloat(0xcf800000)), Mul1);
auto Mad2 = B.buildFMAD(
S32, Trunc, B.buildFConstant(S32, llvm::bit_cast<float>(0xcf800000)),
Mul1);

auto ResultLo = B.buildFPTOUI(S32, Mad2);
auto ResultHi = B.buildFPTOUI(S32, Trunc);
Expand Down Expand Up @@ -4047,7 +4052,7 @@ bool AMDGPULegalizerInfo::legalizeFDIVFastIntrin(MachineInstr &MI,

auto C0 = B.buildConstant(S32, 0x6f800000);
auto C1 = B.buildConstant(S32, 0x2f800000);
auto C2 = B.buildConstant(S32, FloatToBits(1.0f));
auto C2 = B.buildConstant(S32, llvm::bit_cast<uint32_t>(1.0f));

auto CmpRes = B.buildFCmp(CmpInst::FCMP_OGT, S1, Abs, C0, Flags);
auto Sel = B.buildSelect(S32, CmpRes, C1, C2, Flags);
Expand Down
32 changes: 16 additions & 16 deletions llvm/lib/Target/AMDGPU/Disassembler/AMDGPUDisassembler.cpp
Expand Up @@ -1179,21 +1179,21 @@ MCOperand AMDGPUDisassembler::decodeIntImmed(unsigned Imm) {
static int64_t getInlineImmVal32(unsigned Imm) {
switch (Imm) {
case 240:
return FloatToBits(0.5f);
return llvm::bit_cast<uint32_t>(0.5f);
case 241:
return FloatToBits(-0.5f);
return llvm::bit_cast<uint32_t>(-0.5f);
case 242:
return FloatToBits(1.0f);
return llvm::bit_cast<uint32_t>(1.0f);
case 243:
return FloatToBits(-1.0f);
return llvm::bit_cast<uint32_t>(-1.0f);
case 244:
return FloatToBits(2.0f);
return llvm::bit_cast<uint32_t>(2.0f);
case 245:
return FloatToBits(-2.0f);
return llvm::bit_cast<uint32_t>(-2.0f);
case 246:
return FloatToBits(4.0f);
return llvm::bit_cast<uint32_t>(4.0f);
case 247:
return FloatToBits(-4.0f);
return llvm::bit_cast<uint32_t>(-4.0f);
case 248: // 1 / (2 * PI)
return 0x3e22f983;
default:
Expand All @@ -1204,21 +1204,21 @@ static int64_t getInlineImmVal32(unsigned Imm) {
static int64_t getInlineImmVal64(unsigned Imm) {
switch (Imm) {
case 240:
return DoubleToBits(0.5);
return llvm::bit_cast<uint64_t>(0.5);
case 241:
return DoubleToBits(-0.5);
return llvm::bit_cast<uint64_t>(-0.5);
case 242:
return DoubleToBits(1.0);
return llvm::bit_cast<uint64_t>(1.0);
case 243:
return DoubleToBits(-1.0);
return llvm::bit_cast<uint64_t>(-1.0);
case 244:
return DoubleToBits(2.0);
return llvm::bit_cast<uint64_t>(2.0);
case 245:
return DoubleToBits(-2.0);
return llvm::bit_cast<uint64_t>(-2.0);
case 246:
return DoubleToBits(4.0);
return llvm::bit_cast<uint64_t>(4.0);
case 247:
return DoubleToBits(-4.0);
return llvm::bit_cast<uint64_t>(-4.0);
case 248: // 1 / (2 * PI)
return 0x3fc45f306dc9c882;
default:
Expand Down
40 changes: 20 additions & 20 deletions llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUInstPrinter.cpp
Expand Up @@ -476,23 +476,23 @@ void AMDGPUInstPrinter::printImmediate32(uint32_t Imm,
return;
}

if (Imm == FloatToBits(0.0f))
if (Imm == llvm::bit_cast<uint32_t>(0.0f))
O << "0.0";
else if (Imm == FloatToBits(1.0f))
else if (Imm == llvm::bit_cast<uint32_t>(1.0f))
O << "1.0";
else if (Imm == FloatToBits(-1.0f))
else if (Imm == llvm::bit_cast<uint32_t>(-1.0f))
O << "-1.0";
else if (Imm == FloatToBits(0.5f))
else if (Imm == llvm::bit_cast<uint32_t>(0.5f))
O << "0.5";
else if (Imm == FloatToBits(-0.5f))
else if (Imm == llvm::bit_cast<uint32_t>(-0.5f))
O << "-0.5";
else if (Imm == FloatToBits(2.0f))
else if (Imm == llvm::bit_cast<uint32_t>(2.0f))
O << "2.0";
else if (Imm == FloatToBits(-2.0f))
else if (Imm == llvm::bit_cast<uint32_t>(-2.0f))
O << "-2.0";
else if (Imm == FloatToBits(4.0f))
else if (Imm == llvm::bit_cast<uint32_t>(4.0f))
O << "4.0";
else if (Imm == FloatToBits(-4.0f))
else if (Imm == llvm::bit_cast<uint32_t>(-4.0f))
O << "-4.0";
else if (Imm == 0x3e22f983 &&
STI.getFeatureBits()[AMDGPU::FeatureInv2PiInlineImm])
Expand All @@ -510,23 +510,23 @@ void AMDGPUInstPrinter::printImmediate64(uint64_t Imm,
return;
}

if (Imm == DoubleToBits(0.0))
if (Imm == llvm::bit_cast<uint64_t>(0.0))
O << "0.0";
else if (Imm == DoubleToBits(1.0))
else if (Imm == llvm::bit_cast<uint64_t>(1.0))
O << "1.0";
else if (Imm == DoubleToBits(-1.0))
else if (Imm == llvm::bit_cast<uint64_t>(-1.0))
O << "-1.0";
else if (Imm == DoubleToBits(0.5))
else if (Imm == llvm::bit_cast<uint64_t>(0.5))
O << "0.5";
else if (Imm == DoubleToBits(-0.5))
else if (Imm == llvm::bit_cast<uint64_t>(-0.5))
O << "-0.5";
else if (Imm == DoubleToBits(2.0))
else if (Imm == llvm::bit_cast<uint64_t>(2.0))
O << "2.0";
else if (Imm == DoubleToBits(-2.0))
else if (Imm == llvm::bit_cast<uint64_t>(-2.0))
O << "-2.0";
else if (Imm == DoubleToBits(4.0))
else if (Imm == llvm::bit_cast<uint64_t>(4.0))
O << "4.0";
else if (Imm == DoubleToBits(-4.0))
else if (Imm == llvm::bit_cast<uint64_t>(-4.0))
O << "-4.0";
else if (Imm == 0x3fc45f306dc9c882 &&
STI.getFeatureBits()[AMDGPU::FeatureInv2PiInlineImm])
Expand Down Expand Up @@ -752,9 +752,9 @@ void AMDGPUInstPrinter::printRegularOperand(const MCInst *MI, unsigned OpNo,
int RCID = Desc.operands()[OpNo].RegClass;
unsigned RCBits = AMDGPU::getRegBitWidth(MRI.getRegClass(RCID));
if (RCBits == 32)
printImmediate32(FloatToBits(Value), STI, O);
printImmediate32(llvm::bit_cast<uint32_t>((float)Value), STI, O);
else if (RCBits == 64)
printImmediate64(DoubleToBits(Value), STI, O);
printImmediate64(llvm::bit_cast<uint64_t>(Value), STI, O);
else
llvm_unreachable("Invalid register class size");
}
Expand Down

0 comments on commit 64dad4b

Please sign in to comment.