[llvm] [KnownFPClass] Add output/input denormal helpers (PR #225575)
Eric Ross via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 22 19:17:30 PDT 2026
================
@@ -23,48 +23,70 @@ KnownFPClass::KnownFPClass(const APFloat &C)
setSignBit(C.isNegative());
}
-/// Return true if it's possible to assume IEEE treatment of input denormals in
-/// \p F for \p Val.
-static bool inputDenormalIsIEEE(DenormalMode Mode) {
- return Mode.Input == DenormalMode::IEEE;
+KnownFPClass KnownFPClass::applyInputDenormalMode(const KnownFPClass &KnownSrc,
+ DenormalMode Mode) {
+ KnownFPClass Known = KnownSrc;
+ switch (Mode.Input) {
+ case DenormalMode::IEEE:
+ return Known;
+ case DenormalMode::PreserveSign:
+ if (KnownSrc.getKnownFPClasses() & fcPosSubnormal)
+ Known.setKnownFPClasses(Known.getKnownFPClasses() | fcPosZero);
+ if (KnownSrc.getKnownFPClasses() & fcNegSubnormal)
+ Known.setKnownFPClasses(Known.getKnownFPClasses() | fcNegZero);
+ return Known;
+ case DenormalMode::PositiveZero:
+ if (KnownSrc.getKnownFPClasses() & fcSubnormal)
+ Known.setKnownFPClasses(Known.getKnownFPClasses() | fcPosZero);
+ return Known;
+ default:
+ if (KnownSrc.getKnownFPClasses() & fcSubnormal)
+ Known.setKnownFPClasses(Known.getKnownFPClasses() | fcPosZero);
+ if (KnownSrc.getKnownFPClasses() & fcNegSubnormal)
+ Known.setKnownFPClasses(Known.getKnownFPClasses() | fcNegZero);
+ return Known;
+ }
+
+ llvm_unreachable("covered switch over denormal mode");
}
-static bool inputDenormalIsIEEEOrPosZero(DenormalMode Mode) {
- return Mode.Input == DenormalMode::IEEE ||
- Mode.Input == DenormalMode::PositiveZero;
+KnownFPClass KnownFPClass::applyOutputDenormalMode(const KnownFPClass &KnownSrc,
+ DenormalMode Mode) {
+ KnownFPClass Known = KnownSrc;
+ switch (Mode.Output) {
+ case DenormalMode::IEEE:
+ return Known;
+ case DenormalMode::PreserveSign:
+ if (KnownSrc.getKnownFPClasses() & fcPosSubnormal)
+ Known.setKnownFPClasses(Known.getKnownFPClasses() | fcPosZero);
+ if (KnownSrc.getKnownFPClasses() & fcNegSubnormal)
+ Known.setKnownFPClasses(Known.getKnownFPClasses() | fcNegZero);
+ return Known;
+ case DenormalMode::PositiveZero:
+ if (KnownSrc.getKnownFPClasses() & fcSubnormal)
+ Known.setKnownFPClasses(Known.getKnownFPClasses() | fcPosZero);
+ return Known;
+ default:
+ if (KnownSrc.getKnownFPClasses() & fcSubnormal)
+ Known.setKnownFPClasses(Known.getKnownFPClasses() | fcPosZero);
+ if (KnownSrc.getKnownFPClasses() & fcNegSubnormal)
+ Known.setKnownFPClasses(Known.getKnownFPClasses() | fcNegZero);
+ return Known;
+ }
+
+ llvm_unreachable("covered switch over denormal mode");
}
bool KnownFPClass::isKnownNeverLogicalZero(DenormalMode Mode) const {
- return isKnownNeverZero() &&
- (isKnownNeverSubnormal() || inputDenormalIsIEEE(Mode));
+ return applyInputDenormalMode(*this, Mode).isKnownNeverZero();
----------------
ZERICO2005 wrote:
The benefit of doing it this way (other than for testing purposes) is that everything automatically follows how `applyInputDenormalMode` handles the `DenormalMode`.
https://github.com/llvm/llvm-project/pull/225575
More information about the llvm-commits
mailing list