diff options
Diffstat (limited to 'lib/Bitcode/Reader/BitcodeReader.cpp')
| -rw-r--r-- | lib/Bitcode/Reader/BitcodeReader.cpp | 75 | 
1 files changed, 44 insertions, 31 deletions
| diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index 09f0b689bdc36..c04e8b9f1f37d 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -697,6 +697,21 @@ static Comdat::SelectionKind getDecodedComdatSelectionKind(unsigned Val) {    }  } +static FastMathFlags getDecodedFastMathFlags(unsigned Val) { +  FastMathFlags FMF; +  if (0 != (Val & FastMathFlags::UnsafeAlgebra)) +    FMF.setUnsafeAlgebra(); +  if (0 != (Val & FastMathFlags::NoNaNs)) +    FMF.setNoNaNs(); +  if (0 != (Val & FastMathFlags::NoInfs)) +    FMF.setNoInfs(); +  if (0 != (Val & FastMathFlags::NoSignedZeros)) +    FMF.setNoSignedZeros(); +  if (0 != (Val & FastMathFlags::AllowReciprocal)) +    FMF.setAllowReciprocal(); +  return FMF; +} +  static void upgradeDLLImportExportLinkage(llvm::GlobalValue *GV, unsigned Val) {    switch (Val) {    case 5: GV->setDLLStorageClass(GlobalValue::DLLImportStorageClass); break; @@ -1075,6 +1090,8 @@ static Attribute::AttrKind getAttrFromCode(uint64_t Code) {      return Attribute::Alignment;    case bitc::ATTR_KIND_ALWAYS_INLINE:      return Attribute::AlwaysInline; +  case bitc::ATTR_KIND_ARGMEMONLY: +    return Attribute::ArgMemOnly;    case bitc::ATTR_KIND_BUILTIN:      return Attribute::Builtin;    case bitc::ATTR_KIND_BY_VAL: @@ -3472,17 +3489,7 @@ std::error_code BitcodeReader::parseFunctionBody(Function *F) {            if (Record[OpNum] & (1 << bitc::PEO_EXACT))              cast<BinaryOperator>(I)->setIsExact(true);          } else if (isa<FPMathOperator>(I)) { -          FastMathFlags FMF; -          if (0 != (Record[OpNum] & FastMathFlags::UnsafeAlgebra)) -            FMF.setUnsafeAlgebra(); -          if (0 != (Record[OpNum] & FastMathFlags::NoNaNs)) -            FMF.setNoNaNs(); -          if (0 != (Record[OpNum] & FastMathFlags::NoInfs)) -            FMF.setNoInfs(); -          if (0 != (Record[OpNum] & FastMathFlags::NoSignedZeros)) -            FMF.setNoSignedZeros(); -          if (0 != (Record[OpNum] & FastMathFlags::AllowReciprocal)) -            FMF.setAllowReciprocal(); +          FastMathFlags FMF = getDecodedFastMathFlags(Record[OpNum]);            if (FMF.any())              I->setFastMathFlags(FMF);          } @@ -3739,14 +3746,25 @@ std::error_code BitcodeReader::parseFunctionBody(Function *F) {        unsigned OpNum = 0;        Value *LHS, *RHS;        if (getValueTypePair(Record, OpNum, NextValueNo, LHS) || -          popValue(Record, OpNum, NextValueNo, LHS->getType(), RHS) || -          OpNum+1 != Record.size()) +          popValue(Record, OpNum, NextValueNo, LHS->getType(), RHS)) +        return error("Invalid record"); + +      unsigned PredVal = Record[OpNum]; +      bool IsFP = LHS->getType()->isFPOrFPVectorTy(); +      FastMathFlags FMF; +      if (IsFP && Record.size() > OpNum+1) +        FMF = getDecodedFastMathFlags(Record[++OpNum]); + +      if (OpNum+1 != Record.size())          return error("Invalid record");        if (LHS->getType()->isFPOrFPVectorTy()) -        I = new FCmpInst((FCmpInst::Predicate)Record[OpNum], LHS, RHS); +        I = new FCmpInst((FCmpInst::Predicate)PredVal, LHS, RHS);        else -        I = new ICmpInst((ICmpInst::Predicate)Record[OpNum], LHS, RHS); +        I = new ICmpInst((ICmpInst::Predicate)PredVal, LHS, RHS); + +      if (FMF.any()) +        I->setFastMathFlags(FMF);        InstructionList.push_back(I);        break;      } @@ -4458,14 +4476,11 @@ std::error_code BitcodeReader::materialize(GlobalValue *GV) {    // Upgrade any old intrinsic calls in the function.    for (auto &I : UpgradedIntrinsics) { -    if (I.first != I.second) { -      for (auto UI = I.first->user_begin(), UE = I.first->user_end(); -           UI != UE;) { -        User *U = *UI; -        ++UI; -        if (CallInst *CI = dyn_cast<CallInst>(U)) -          UpgradeIntrinsicCall(CI, I.second); -      } +    for (auto UI = I.first->user_begin(), UE = I.first->user_end(); UI != UE;) { +      User *U = *UI; +      ++UI; +      if (CallInst *CI = dyn_cast<CallInst>(U)) +        UpgradeIntrinsicCall(CI, I.second);      }    } @@ -4533,15 +4548,13 @@ std::error_code BitcodeReader::materializeModule(Module *M) {    // module is materialized because there could always be another function body    // with calls to the old function.    for (auto &I : UpgradedIntrinsics) { -    if (I.first != I.second) { -      for (auto *U : I.first->users()) { -        if (CallInst *CI = dyn_cast<CallInst>(U)) -          UpgradeIntrinsicCall(CI, I.second); -      } -      if (!I.first->use_empty()) -        I.first->replaceAllUsesWith(I.second); -      I.first->eraseFromParent(); +    for (auto *U : I.first->users()) { +      if (CallInst *CI = dyn_cast<CallInst>(U)) +        UpgradeIntrinsicCall(CI, I.second);      } +    if (!I.first->use_empty()) +      I.first->replaceAllUsesWith(I.second); +    I.first->eraseFromParent();    }    UpgradedIntrinsics.clear(); | 
