Skip to content

Commit 925dfd0

Browse files
committed
[ADT] Add hasSignBitInMSB helper
1 parent 616b03c commit 925dfd0

File tree

4 files changed

+35
-6
lines changed

4 files changed

+35
-6
lines changed

llvm/include/llvm/ADT/APFloat.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,7 @@ struct APFloatBase {
354354
static bool semanticsHasInf(const fltSemantics &);
355355
static bool semanticsHasNaN(const fltSemantics &);
356356
static bool isIEEELikeFP(const fltSemantics &);
357+
static bool hasSignBitInMSB(const fltSemantics &);
357358

358359
// Returns true if any number described by \p Src can be precisely represented
359360
// by a normal (not subnormal) value in \p Dst.

llvm/lib/Support/APFloat.cpp

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@ struct fltSemantics {
125125

126126
/* Whether this semantics can represent signed values */
127127
bool hasSignedRepr = true;
128+
129+
/* Whether the sign bit of this semantics is the most significant bit */
130+
bool hasSignBitInMSB = true;
128131
};
129132

130133
static constexpr fltSemantics semIEEEhalf = {15, -14, 11, 16};
@@ -144,9 +147,15 @@ static constexpr fltSemantics semFloat8E4M3B11FNUZ = {
144147
4, -10, 4, 8, fltNonfiniteBehavior::NanOnly, fltNanEncoding::NegativeZero};
145148
static constexpr fltSemantics semFloat8E3M4 = {3, -2, 5, 8};
146149
static constexpr fltSemantics semFloatTF32 = {127, -126, 11, 19};
147-
static constexpr fltSemantics semFloat8E8M0FNU = {
148-
127, -127, 1, 8, fltNonfiniteBehavior::NanOnly, fltNanEncoding::AllOnes,
149-
false, false};
150+
static constexpr fltSemantics semFloat8E8M0FNU = {127,
151+
-127,
152+
1,
153+
8,
154+
fltNonfiniteBehavior::NanOnly,
155+
fltNanEncoding::AllOnes,
156+
false,
157+
false,
158+
false};
150159

151160
static constexpr fltSemantics semFloat6E3M2FN = {
152161
4, -2, 3, 6, fltNonfiniteBehavior::FiniteOnly};
@@ -358,6 +367,10 @@ bool APFloatBase::isIEEELikeFP(const fltSemantics &semantics) {
358367
return SemanticsToEnum(semantics) <= S_IEEEquad;
359368
}
360369

370+
bool APFloatBase::hasSignBitInMSB(const fltSemantics &semantics) {
371+
return semantics.hasSignBitInMSB;
372+
}
373+
361374
bool APFloatBase::isRepresentableAsNormalIn(const fltSemantics &Src,
362375
const fltSemantics &Dst) {
363376
// Exponent range must be larger.

llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2641,7 +2641,10 @@ Instruction *InstCombinerImpl::visitAnd(BinaryOperator &I) {
26412641
// TODO: Unify with APInt matcher. This version allows undef unlike m_APInt
26422642
Value *CastOp;
26432643
if (match(Op0, m_ElementWiseBitCast(m_Value(CastOp))) &&
2644-
CastOp->getType()->isFPOrFPVectorTy() && match(Op1, m_MaxSignedValue()) &&
2644+
CastOp->getType()->isFPOrFPVectorTy() &&
2645+
APFloat::hasSignBitInMSB(
2646+
CastOp->getType()->getScalarType()->getFltSemantics()) &&
2647+
match(Op1, m_MaxSignedValue()) &&
26452648
!Builder.GetInsertBlock()->getParent()->hasFnAttribute(
26462649
Attribute::NoImplicitFloat)) {
26472650
Value *FAbs = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, CastOp);
@@ -4050,7 +4053,10 @@ Instruction *InstCombinerImpl::visitOr(BinaryOperator &I) {
40504053
// floating-point operation.
40514054
Value *CastOp;
40524055
if (match(Op0, m_ElementWiseBitCast(m_Value(CastOp))) &&
4053-
CastOp->getType()->isFPOrFPVectorTy() && match(Op1, m_SignMask()) &&
4056+
CastOp->getType()->isFPOrFPVectorTy() &&
4057+
APFloat::hasSignBitInMSB(
4058+
CastOp->getType()->getScalarType()->getFltSemantics()) &&
4059+
match(Op1, m_SignMask()) &&
40544060
!Builder.GetInsertBlock()->getParent()->hasFnAttribute(
40554061
Attribute::NoImplicitFloat)) {
40564062
Value *FAbs = Builder.CreateUnaryIntrinsic(Intrinsic::fabs, CastOp);
@@ -4849,7 +4855,10 @@ Instruction *InstCombinerImpl::visitXor(BinaryOperator &I) {
48494855
// TODO: Unify with APInt matcher. This version allows undef unlike m_APInt
48504856
Value *CastOp;
48514857
if (match(Op0, m_ElementWiseBitCast(m_Value(CastOp))) &&
4852-
CastOp->getType()->isFPOrFPVectorTy() && match(Op1, m_SignMask()) &&
4858+
CastOp->getType()->isFPOrFPVectorTy() &&
4859+
APFloat::hasSignBitInMSB(
4860+
CastOp->getType()->getScalarType()->getFltSemantics()) &&
4861+
match(Op1, m_SignMask()) &&
48534862
!Builder.GetInsertBlock()->getParent()->hasFnAttribute(
48544863
Attribute::NoImplicitFloat)) {
48554864
Value *FNeg = Builder.CreateFNeg(CastOp);

llvm/unittests/ADT/APFloatTest.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8347,4 +8347,10 @@ TEST(APFloatTest, AddOrSubtractSignificand) {
83478347
Helper::runTest(true, false, 3, 0x10001, false, 7, 0x100, false, 6, 0x1e00,
83488348
lfLessThanHalf);
83498349
}
8350+
8351+
TEST(APFloatTest, hasSignBitInMSB) {
8352+
EXPECT_TRUE(APFloat::hasSignBitInMSB(APFloat::IEEEsingle()));
8353+
EXPECT_FALSE(APFloat::hasSignBitInMSB(APFloat::Float8E8M0FNU()));
8354+
}
8355+
83508356
} // namespace

0 commit comments

Comments
 (0)