Skip to content

Commit 07acfe3

Browse files
authored
ADT: Replace FPClassTest fabs with inverse_fabs and unknown_sign (#66390)
1 parent 0d0ab76 commit 07acfe3

File tree

3 files changed

+21
-4
lines changed

3 files changed

+21
-4
lines changed

llvm/include/llvm/ADT/FloatingPointMode.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -269,8 +269,12 @@ LLVM_DECLARE_ENUM_AS_BITMASK(FPClassTest, /* LargestValue */ fcPosInf);
269269
/// Return the test mask which returns true if the value's sign bit is flipped.
270270
FPClassTest fneg(FPClassTest Mask);
271271

272-
/// Return the test mask which returns true if the value's sign bit is cleared.
273-
FPClassTest fabs(FPClassTest Mask);
272+
/// Return the test mask which returns true after fabs is applied to the value.
273+
FPClassTest inverse_fabs(FPClassTest Mask);
274+
275+
/// Return the test mask which returns true if the value could have the same set
276+
/// of classes, but with a different sign.
277+
FPClassTest unknown_sign(FPClassTest Mask);
274278

275279
/// Write a human readable form of \p Mask to \p OS
276280
raw_ostream &operator<<(raw_ostream &OS, FPClassTest Mask);

llvm/lib/Support/FloatingPointMode.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ FPClassTest llvm::fneg(FPClassTest Mask) {
3232
return NewMask;
3333
}
3434

35-
FPClassTest llvm::fabs(FPClassTest Mask) {
35+
FPClassTest llvm::inverse_fabs(FPClassTest Mask) {
3636
FPClassTest NewMask = Mask & fcNan;
3737
if (Mask & fcPosZero)
3838
NewMask |= fcZero;
@@ -45,6 +45,19 @@ FPClassTest llvm::fabs(FPClassTest Mask) {
4545
return NewMask;
4646
}
4747

48+
FPClassTest llvm::unknown_sign(FPClassTest Mask) {
49+
FPClassTest NewMask = Mask & fcNan;
50+
if (Mask & fcZero)
51+
NewMask |= fcZero;
52+
if (Mask & fcSubnormal)
53+
NewMask |= fcSubnormal;
54+
if (Mask & fcNormal)
55+
NewMask |= fcNormal;
56+
if (Mask & fcInf)
57+
NewMask |= fcInf;
58+
return NewMask;
59+
}
60+
4861
// Every bitfield has a unique name and one or more aliasing names that cover
4962
// multiple bits. Names should be listed in order of preference, with higher
5063
// popcounts listed first.

llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -899,7 +899,7 @@ Instruction *InstCombinerImpl::foldIntrinsicIsFPClass(IntrinsicInst &II) {
899899

900900
Value *FAbsSrc;
901901
if (match(Src0, m_FAbs(m_Value(FAbsSrc)))) {
902-
II.setArgOperand(1, ConstantInt::get(Src1->getType(), fabs(Mask)));
902+
II.setArgOperand(1, ConstantInt::get(Src1->getType(), inverse_fabs(Mask)));
903903
return replaceOperand(II, 0, FAbsSrc);
904904
}
905905

0 commit comments

Comments
 (0)