diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Transforms/IPO/AttributorAttributes.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Transforms/IPO/AttributorAttributes.cpp | 84 | 
1 files changed, 43 insertions, 41 deletions
diff --git a/contrib/llvm-project/llvm/lib/Transforms/IPO/AttributorAttributes.cpp b/contrib/llvm-project/llvm/lib/Transforms/IPO/AttributorAttributes.cpp index 2d88e329e093..4e4f768ed2cb 100644 --- a/contrib/llvm-project/llvm/lib/Transforms/IPO/AttributorAttributes.cpp +++ b/contrib/llvm-project/llvm/lib/Transforms/IPO/AttributorAttributes.cpp @@ -236,7 +236,8 @@ static Value *constructPointer(Type *ResTy, Type *PtrElemTy, Value *Ptr,    }    // Ensure the result has the requested type. -  Ptr = IRB.CreateBitOrPointerCast(Ptr, ResTy, Ptr->getName() + ".cast"); +  Ptr = IRB.CreatePointerBitCastOrAddrSpaceCast(Ptr, ResTy, +                                                Ptr->getName() + ".cast");    LLVM_DEBUG(dbgs() << "Constructed pointer: " << *Ptr << "\n");    return Ptr; @@ -2691,40 +2692,38 @@ struct AAUndefinedBehaviorImpl : public AAUndefinedBehavior {        return true;      }; -    auto InspectReturnInstForUB = -        [&](Value &V, const SmallSetVector<ReturnInst *, 4> RetInsts) { -          // Check if a return instruction always cause UB or not -          // Note: It is guaranteed that the returned position of the anchor -          //       scope has noundef attribute when this is called. -          //       We also ensure the return position is not "assumed dead" -          //       because the returned value was then potentially simplified to -          //       `undef` in AAReturnedValues without removing the `noundef` -          //       attribute yet. - -          // When the returned position has noundef attriubte, UB occur in the -          // following cases. -          //   (1) Returned value is known to be undef. -          //   (2) The value is known to be a null pointer and the returned -          //       position has nonnull attribute (because the returned value is -          //       poison). -          bool FoundUB = false; -          if (isa<UndefValue>(V)) { -            FoundUB = true; -          } else { -            if (isa<ConstantPointerNull>(V)) { -              auto &NonNullAA = A.getAAFor<AANonNull>( -                  *this, IRPosition::returned(*getAnchorScope()), -                  DepClassTy::NONE); -              if (NonNullAA.isKnownNonNull()) -                FoundUB = true; -            } -          } +    auto InspectReturnInstForUB = [&](Instruction &I) { +      auto &RI = cast<ReturnInst>(I); +      // Either we stopped and the appropriate action was taken, +      // or we got back a simplified return value to continue. +      Optional<Value *> SimplifiedRetValue = +          stopOnUndefOrAssumed(A, RI.getReturnValue(), &I); +      if (!SimplifiedRetValue.hasValue() || !SimplifiedRetValue.getValue()) +        return true; -          if (FoundUB) -            for (ReturnInst *RI : RetInsts) -              KnownUBInsts.insert(RI); -          return true; -        }; +      // Check if a return instruction always cause UB or not +      // Note: It is guaranteed that the returned position of the anchor +      //       scope has noundef attribute when this is called. +      //       We also ensure the return position is not "assumed dead" +      //       because the returned value was then potentially simplified to +      //       `undef` in AAReturnedValues without removing the `noundef` +      //       attribute yet. + +      // When the returned position has noundef attriubte, UB occurs in the +      // following cases. +      //   (1) Returned value is known to be undef. +      //   (2) The value is known to be a null pointer and the returned +      //       position has nonnull attribute (because the returned value is +      //       poison). +      if (isa<ConstantPointerNull>(*SimplifiedRetValue)) { +        auto &NonNullAA = A.getAAFor<AANonNull>( +            *this, IRPosition::returned(*getAnchorScope()), DepClassTy::NONE); +        if (NonNullAA.isKnownNonNull()) +          KnownUBInsts.insert(&I); +      } + +      return true; +    };      bool UsedAssumedInformation = false;      A.checkForAllInstructions(InspectMemAccessInstForUB, *this, @@ -2747,8 +2746,9 @@ struct AAUndefinedBehaviorImpl : public AAUndefinedBehavior {          auto &RetPosNoUndefAA =              A.getAAFor<AANoUndef>(*this, ReturnIRP, DepClassTy::NONE);          if (RetPosNoUndefAA.isKnownNoUndef()) -          A.checkForAllReturnedValuesAndReturnInsts(InspectReturnInstForUB, -                                                    *this); +          A.checkForAllInstructions(InspectReturnInstForUB, *this, +                                    {Instruction::Ret}, UsedAssumedInformation, +                                    /* CheckBBLivenessOnly */ true);        }      } @@ -6749,8 +6749,8 @@ struct AAPrivatizablePtrArgument final : public AAPrivatizablePtrImpl {      Type *PrivPtrType = PrivType->getPointerTo();      if (Base->getType() != PrivPtrType) -      Base = BitCastInst::CreateBitOrPointerCast(Base, PrivPtrType, "", -                                                 ACS.getInstruction()); +      Base = BitCastInst::CreatePointerBitCastOrAddrSpaceCast( +          Base, PrivPtrType, "", ACS.getInstruction());      // Traverse the type, build GEPs and loads.      if (auto *PrivStructType = dyn_cast<StructType>(PrivType)) { @@ -6817,14 +6817,16 @@ struct AAPrivatizablePtrArgument final : public AAPrivatizablePtrImpl {              Function &ReplacementFn, Function::arg_iterator ArgIt) {            BasicBlock &EntryBB = ReplacementFn.getEntryBlock();            Instruction *IP = &*EntryBB.getFirstInsertionPt(); -          Instruction *AI = new AllocaInst(PrivatizableType.getValue(), 0, +          const DataLayout &DL = IP->getModule()->getDataLayout(); +          unsigned AS = DL.getAllocaAddrSpace(); +          Instruction *AI = new AllocaInst(PrivatizableType.getValue(), AS,                                             Arg->getName() + ".priv", IP);            createInitialization(PrivatizableType.getValue(), *AI, ReplacementFn,                                 ArgIt->getArgNo(), *IP);            if (AI->getType() != Arg->getType()) -            AI = -                BitCastInst::CreateBitOrPointerCast(AI, Arg->getType(), "", IP); +            AI = BitCastInst::CreatePointerBitCastOrAddrSpaceCast( +                AI, Arg->getType(), "", IP);            Arg->replaceAllUsesWith(AI);            for (CallInst *CI : TailCalls)  | 
