@@ -397,7 +397,7 @@ struct SDNodeFlags {
397
397
Exact = 1 << 2 ,
398
398
Disjoint = 1 << 3 ,
399
399
NonNeg = 1 << 4 ,
400
- NoNaNs = 1 << 5 ,
400
+ // 1 << 5 was used as NoNaNs
401
401
NoInfs = 1 << 6 ,
402
402
NoSignedZeros = 1 << 7 ,
403
403
AllowReciprocal = 1 << 8 ,
@@ -416,19 +416,23 @@ struct SDNodeFlags {
416
416
// Compare instructions which may carry the samesign flag.
417
417
SameSign = 1 << 14 ,
418
418
419
+ NoSNaNs = 1 << 15 ,
420
+ NoQNaNs = 1 << 16 ,
421
+
419
422
// NOTE: Please update LargestValue in LLVM_DECLARE_ENUM_AS_BITMASK below
420
423
// the class definition when adding new flags.
421
424
422
425
PoisonGeneratingFlags = NoUnsignedWrap | NoSignedWrap | Exact | Disjoint |
423
- NonNeg | NoNaNs | NoInfs | SameSign,
426
+ NonNeg | NoSNaNs | NoQNaNs | NoInfs | SameSign,
424
427
};
425
428
426
429
// / Default constructor turns off all optimization flags.
427
430
SDNodeFlags (unsigned Flags = SDNodeFlags::None) : Flags(Flags) {}
428
431
429
432
// / Propagate the fast-math-flags from an IR FPMathOperator.
430
433
void copyFMF (const FPMathOperator &FPMO) {
431
- setNoNaNs (FPMO.hasNoNaNs ());
434
+ setNoSNaNs (FPMO.hasNoNaNs ());
435
+ setNoQNaNs (FPMO.hasNoNaNs ());
432
436
setNoInfs (FPMO.hasNoInfs ());
433
437
setNoSignedZeros (FPMO.hasNoSignedZeros ());
434
438
setAllowReciprocal (FPMO.hasAllowReciprocal ());
@@ -444,7 +448,9 @@ struct SDNodeFlags {
444
448
void setDisjoint (bool b) { setFlag<Disjoint>(b); }
445
449
void setSameSign (bool b) { setFlag<SameSign>(b); }
446
450
void setNonNeg (bool b) { setFlag<NonNeg>(b); }
447
- void setNoNaNs (bool b) { setFlag<NoNaNs>(b); }
451
+ void setNoNaNs (bool b) { setFlag<NoSNaNs>(b); setFlag<NoQNaNs>(b); }
452
+ void setNoSNaNs (bool b) { setFlag<NoSNaNs>(b); }
453
+ void setNoQNaNs (bool b) { setFlag<NoQNaNs>(b); }
448
454
void setNoInfs (bool b) { setFlag<NoInfs>(b); }
449
455
void setNoSignedZeros (bool b) { setFlag<NoSignedZeros>(b); }
450
456
void setAllowReciprocal (bool b) { setFlag<AllowReciprocal>(b); }
@@ -461,7 +467,9 @@ struct SDNodeFlags {
461
467
bool hasDisjoint () const { return Flags & Disjoint; }
462
468
bool hasSameSign () const { return Flags & SameSign; }
463
469
bool hasNonNeg () const { return Flags & NonNeg; }
464
- bool hasNoNaNs () const { return Flags & NoNaNs; }
470
+ bool hasNoNaNs () const { return (Flags & NoSNaNs) && (Flags & NoQNaNs); }
471
+ bool hasNoSNaNs () const { return Flags & NoSNaNs; }
472
+ bool hasNoQNaNs () const { return Flags & NoQNaNs; }
465
473
bool hasNoInfs () const { return Flags & NoInfs; }
466
474
bool hasNoSignedZeros () const { return Flags & NoSignedZeros; }
467
475
bool hasAllowReciprocal () const { return Flags & AllowReciprocal; }
0 commit comments