Fast-math flags for the bitcode
authorMichael Ilseman <milseman@apple.com>
Tue, 27 Nov 2012 00:43:38 +0000 (00:43 +0000)
committerMichael Ilseman <milseman@apple.com>
Tue, 27 Nov 2012 00:43:38 +0000 (00:43 +0000)
Added in bitcode enum for the serializing of fast-math flags. Added in the reading/writing of fast-math flags from the OptimizationFlags record for BinaryOps.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@168646 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Bitcode/LLVMBitCodes.h
lib/Bitcode/Reader/BitcodeReader.cpp
lib/Bitcode/Writer/BitcodeWriter.cpp

index 511e3a377a1422b772219e7fbfe3d93c729a60cf..3c7c2b3a06f9bb884f1d68767a3210fa914fed6e 100644 (file)
@@ -240,6 +240,16 @@ namespace bitc {
     PEO_EXACT = 0
   };
 
+  /// Flags for serializing FPMathOperator's
+  /// SubclassOptionalData contents.
+  enum FastMathFlags {
+    FMF_UNSAFE_ALGEBRA   = 0,
+    FMF_NO_NANS          = 1,
+    FMF_NO_INFS          = 2,
+    FMF_NO_SIGNED_ZEROS  = 3,
+    FMF_ALLOW_RECIPROCAL = 4
+  };
+
   /// Encoded AtomicOrdering values.
   enum AtomicOrderingCodes {
     ORDERING_NOTATOMIC = 0,
index d3c8678578d4fac2120480823cbec444df6dfcd3..f31637e044f4ca80d63d464bc3c9abadbbc32db7 100644 (file)
@@ -2044,7 +2044,22 @@ bool BitcodeReader::ParseFunctionBody(Function *F) {
                    Opc == Instruction::AShr) {
           if (Record[OpNum] & (1 << bitc::PEO_EXACT))
             cast<BinaryOperator>(I)->setIsExact(true);
+        } else if (isa<FPMathOperator>(I)) {
+          FastMathFlags FMF;
+          FMF.UnsafeAlgebra =
+            0 != (Record[OpNum] & (1 << bitc::FMF_UNSAFE_ALGEBRA));
+          FMF.NoNaNs
+            = 0 != (Record[OpNum] & (1 << bitc::FMF_NO_NANS));
+          FMF.NoInfs
+            = 0 != (Record[OpNum] & (1 << bitc::FMF_NO_INFS));
+          FMF.NoSignedZeros
+            = 0 != (Record[OpNum] & (1 << bitc::FMF_NO_SIGNED_ZEROS));
+          FMF.AllowReciprocal
+            = 0 != (Record[OpNum] & (1 << bitc::FMF_ALLOW_RECIPROCAL));
+          if (FMF.any())
+            I->setFastMathFlags(FMF);
         }
+
       }
       break;
     }
index cf3c9fd74ebf60986dea995c7d13a48f0c6d4364..6206479b8d7a3a54b641cc3b9102577e9812d263 100644 (file)
@@ -553,6 +553,18 @@ static uint64_t GetOptimizationFlags(const Value *V) {
                dyn_cast<PossiblyExactOperator>(V)) {
     if (PEO->isExact())
       Flags |= 1 << bitc::PEO_EXACT;
+  } else if (const FPMathOperator *FPMO =
+             dyn_cast<const FPMathOperator>(V)) {
+    if (FPMO->hasUnsafeAlgebra())
+      Flags |= 1 << bitc::FMF_UNSAFE_ALGEBRA;
+    if (FPMO->hasNoNaNs())
+      Flags |= 1 << bitc::FMF_NO_NANS;
+    if (FPMO->hasNoInfs())
+      Flags |= 1 << bitc::FMF_NO_INFS;
+    if (FPMO->hasNoSignedZeros())
+      Flags |= 1 << bitc::FMF_NO_SIGNED_ZEROS;
+    if (FPMO->hasAllowReciprocal())
+      Flags |= 1 << bitc::FMF_ALLOW_RECIPROCAL;
   }
 
   return Flags;