[llvm] [llubi] Initial support for floating-point numbers (PR #188453)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Tue May 5 05:20:20 PDT 2026
================
@@ -126,22 +129,46 @@ class InstExecutor : public InstVisitor<InstExecutor, void>,
return Val;
}
- NaNPropagationBehavior resolveNaNPropagationBehavior() {
- NaNPropagationBehavior Choice = Ctx.getNaNPropagationBehavior();
- if (Choice == NaNPropagationBehavior::NonDeterministic) {
- uint64_t NonDetChoice = Ctx.getRandomUInt64() % 4 + 1;
- Choice = static_cast<NaNPropagationBehavior>(NonDetChoice);
- }
- return Choice;
+ void addNaNCandidate(SmallVectorImpl<APFloat> &Candidates,
+ APFloat Candidate) {
+ APInt Bits = Candidate.bitcastToAPInt();
+ if (any_of(Candidates, [&](const APFloat &Existing) {
+ return Existing.bitcastToAPInt() == Bits;
+ }))
+ return;
+ Candidates.push_back(std::move(Candidate));
+ }
+
+ APFloat pickNaNCandidate(ArrayRef<APFloat> Candidates) {
+ assert(!Candidates.empty() && "Need at least one NaN candidate.");
+ return Candidates[Ctx.getRandomUInt64() % Candidates.size()];
}
- const APFloat &pickNaNSource(ArrayRef<const APFloat *> Inputs,
- const APFloat &Fallback) {
+ APInt getRandomNaNPayload(const fltSemantics &Sem) {
+ const unsigned NumBits = Sem.precision - 1;
+ SmallVector<APInt::WordType, 2> RandomWords;
+ const unsigned NumWords = APInt::getNumWords(NumBits);
+ RandomWords.reserve(NumWords);
+ for (unsigned I = 0; I != NumWords; ++I)
+ RandomWords.push_back(Ctx.getRandomUInt64());
+ return APInt(NumBits, RandomWords);
+ }
+
+ bool isPreferredNaN(const APFloat &Val) {
+ assert(Val.isNaN() && "Expected NaN.");
+ const APFloat Preferred =
+ APFloat::getQNaN(Val.getSemantics(), Val.isNegative());
+ return Val.bitcastToAPInt() == Preferred.bitcastToAPInt();
----------------
nikic wrote:
Use bitwiseIsEqual() instead?
https://github.com/llvm/llvm-project/pull/188453
More information about the llvm-commits
mailing list