diff --git a/llvm/include/llvm/Analysis/TargetTransformInfo.h b/llvm/include/llvm/Analysis/TargetTransformInfo.h index f26fe677a8d1a6..6aa78c9d562ea0 100644 --- a/llvm/include/llvm/Analysis/TargetTransformInfo.h +++ b/llvm/include/llvm/Analysis/TargetTransformInfo.h @@ -552,22 +552,21 @@ class TargetTransformInfo { /// intrinsics. This function will be called from the InstCombine pass every /// time a target-specific intrinsic is encountered. /// - /// \returns None to not do anything target specific or a value that will be - /// returned from the InstCombiner. It is possible to return null and stop - /// further processing of the intrinsic by returning nullptr. - Optional instCombineIntrinsic(InstCombiner &IC, - IntrinsicInst &II) const; + /// \returns std::nullopt to not do anything target specific or a value that + /// will be returned from the InstCombiner. It is possible to return null and + /// stop further processing of the intrinsic by returning nullptr. + std::optional instCombineIntrinsic(InstCombiner & IC, + IntrinsicInst & II) const; /// Can be used to implement target-specific instruction combining. /// \see instCombineIntrinsic - Optional - simplifyDemandedUseBitsIntrinsic(InstCombiner &IC, IntrinsicInst &II, - APInt DemandedMask, KnownBits &Known, - bool &KnownBitsComputed) const; + std::optional simplifyDemandedUseBitsIntrinsic( + InstCombiner & IC, IntrinsicInst & II, APInt DemandedMask, + KnownBits & Known, bool &KnownBitsComputed) const; /// Can be used to implement target-specific instruction combining. /// \see instCombineIntrinsic - Optional simplifyDemandedVectorEltsIntrinsic( - InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, - APInt &UndefElts2, APInt &UndefElts3, + std::optional simplifyDemandedVectorEltsIntrinsic( + InstCombiner & IC, IntrinsicInst & II, APInt DemandedElts, + APInt & UndefElts, APInt & UndefElts2, APInt & UndefElts3, std::function SimplifyAndSetOp) const; /// @} @@ -971,7 +970,7 @@ class TargetTransformInfo { unsigned getMinVectorRegisterBitWidth() const; /// \return The maximum value of vscale if the target specifies an - /// architectural maximum vector length, and None otherwise. + /// architectural maximum vector length, and std::nullopt otherwise. std::optional getMaxVScale() const; /// \return the value of vscale to tune the cost model for. @@ -1028,10 +1027,10 @@ class TargetTransformInfo { }; /// \return The size of the cache level in bytes, if available. - Optional getCacheSize(CacheLevel Level) const; + std::optional getCacheSize(CacheLevel Level) const; /// \return The associativity of the cache level, if available. - Optional getCacheAssociativity(CacheLevel Level) const; + std::optional getCacheAssociativity(CacheLevel Level) const; /// \return How much before a load we should place the prefetch /// instruction. This is currently measured in number of @@ -1264,8 +1263,8 @@ class TargetTransformInfo { /// A helper function to determine the type of reduction algorithm used /// for a given \p Opcode and set of FastMathFlags \p FMF. - static bool requiresOrderedReduction(Optional FMF) { - return FMF != None && !(*FMF).allowReassoc(); + static bool requiresOrderedReduction(std::optional FMF) { + return FMF && !(*FMF).allowReassoc(); } /// Calculate the cost of vector reduction intrinsics. @@ -1293,7 +1292,7 @@ class TargetTransformInfo { /// allowed. /// InstructionCost getArithmeticReductionCost( - unsigned Opcode, VectorType *Ty, Optional FMF, + unsigned Opcode, VectorType *Ty, std::optional FMF, TTI::TargetCostKind CostKind = TTI::TCK_RecipThroughput) const; InstructionCost getMinMaxReductionCost( @@ -1315,7 +1314,7 @@ class TargetTransformInfo { /// ResTy vecreduce.opcode(ext(Ty A)). InstructionCost getExtendedReductionCost( unsigned Opcode, bool IsUnsigned, Type *ResTy, VectorType *Ty, - Optional FMF, + std::optional FMF, TTI::TargetCostKind CostKind = TTI::TCK_RecipThroughput) const; /// \returns The cost of Intrinsic instructions. Analyses the real arguments. @@ -1369,11 +1368,10 @@ class TargetTransformInfo { Type *ExpectedType) const; /// \returns The type to use in a loop expansion of a memcpy call. - Type * - getMemcpyLoopLoweringType(LLVMContext &Context, Value *Length, - unsigned SrcAddrSpace, unsigned DestAddrSpace, - unsigned SrcAlign, unsigned DestAlign, - Optional AtomicElementSize = None) const; + Type *getMemcpyLoopLoweringType( + LLVMContext &Context, Value *Length, unsigned SrcAddrSpace, + unsigned DestAddrSpace, unsigned SrcAlign, unsigned DestAlign, + std::optional AtomicElementSize = std::nullopt) const; /// \param[out] OpsOut The operand types to copy RemainingBytes of memory. /// \param RemainingBytes The number of bytes to copy. @@ -1385,7 +1383,7 @@ class TargetTransformInfo { SmallVectorImpl &OpsOut, LLVMContext &Context, unsigned RemainingBytes, unsigned SrcAddrSpace, unsigned DestAddrSpace, unsigned SrcAlign, unsigned DestAlign, - Optional AtomicCpySize = None) const; + std::optional AtomicCpySize = std::nullopt) const; /// \returns True if the two functions have compatible attributes for inlining /// purposes. @@ -1610,15 +1608,14 @@ class TargetTransformInfo::Concept { DominatorTree *DT, LoopVectorizationLegality *LVL, InterleavedAccessInfo *IAI) = 0; virtual PredicationStyle emitGetActiveLaneMask() = 0; - virtual Optional instCombineIntrinsic(InstCombiner &IC, - IntrinsicInst &II) = 0; - virtual Optional - simplifyDemandedUseBitsIntrinsic(InstCombiner &IC, IntrinsicInst &II, - APInt DemandedMask, KnownBits &Known, - bool &KnownBitsComputed) = 0; - virtual Optional simplifyDemandedVectorEltsIntrinsic( - InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, - APInt &UndefElts2, APInt &UndefElts3, + virtual std::optional instCombineIntrinsic( + InstCombiner &IC, IntrinsicInst &II) = 0; + virtual std::optional simplifyDemandedUseBitsIntrinsic( + InstCombiner &IC, IntrinsicInst &II, APInt DemandedMask, + KnownBits & Known, bool &KnownBitsComputed) = 0; + virtual std::optional simplifyDemandedVectorEltsIntrinsic( + InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, + APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3, std::function SimplifyAndSetOp) = 0; virtual bool isLegalAddImmediate(int64_t Imm) = 0; @@ -1727,8 +1724,9 @@ class TargetTransformInfo::Concept { virtual bool shouldConsiderAddressTypePromotion( const Instruction &I, bool &AllowPromotionWithoutCommonHeader) = 0; virtual unsigned getCacheLineSize() const = 0; - virtual Optional getCacheSize(CacheLevel Level) const = 0; - virtual Optional getCacheAssociativity(CacheLevel Level) const = 0; + virtual std::optional getCacheSize(CacheLevel Level) const = 0; + virtual std::optional getCacheAssociativity(CacheLevel Level) + const = 0; /// \return How much before a load we should place the prefetch /// instruction. This is currently measured in number of @@ -1818,14 +1816,14 @@ class TargetTransformInfo::Concept { bool UseMaskForCond = false, bool UseMaskForGaps = false) = 0; virtual InstructionCost getArithmeticReductionCost(unsigned Opcode, VectorType *Ty, - Optional FMF, + std::optional FMF, TTI::TargetCostKind CostKind) = 0; virtual InstructionCost getMinMaxReductionCost(VectorType *Ty, VectorType *CondTy, bool IsUnsigned, TTI::TargetCostKind CostKind) = 0; virtual InstructionCost getExtendedReductionCost( unsigned Opcode, bool IsUnsigned, Type *ResTy, VectorType *Ty, - Optional FMF, + std::optional FMF, TTI::TargetCostKind CostKind = TTI::TCK_RecipThroughput) = 0; virtual InstructionCost getMulAccReductionCost( bool IsUnsigned, Type *ResTy, VectorType *Ty, @@ -1846,17 +1844,16 @@ class TargetTransformInfo::Concept { virtual unsigned getAtomicMemIntrinsicMaxElementSize() const = 0; virtual Value *getOrCreateResultFromMemIntrinsic(IntrinsicInst *Inst, Type *ExpectedType) = 0; - virtual Type * - getMemcpyLoopLoweringType(LLVMContext &Context, Value *Length, - unsigned SrcAddrSpace, unsigned DestAddrSpace, - unsigned SrcAlign, unsigned DestAlign, - Optional AtomicElementSize) const = 0; + virtual Type *getMemcpyLoopLoweringType( + LLVMContext &Context, Value *Length, unsigned SrcAddrSpace, + unsigned DestAddrSpace, unsigned SrcAlign, unsigned DestAlign, + std::optional AtomicElementSize) const = 0; virtual void getMemcpyLoopResidualLoweringType( SmallVectorImpl &OpsOut, LLVMContext &Context, unsigned RemainingBytes, unsigned SrcAddrSpace, unsigned DestAddrSpace, unsigned SrcAlign, unsigned DestAlign, - Optional AtomicCpySize) const = 0; + std::optional AtomicCpySize) const = 0; virtual bool areInlineCompatible(const Function *Caller, const Function *Callee) const = 0; virtual bool areTypesABICompatible(const Function *Caller, @@ -2008,18 +2005,18 @@ class TargetTransformInfo::Model final : public TargetTransformInfo::Concept { PredicationStyle emitGetActiveLaneMask() override { return Impl.emitGetActiveLaneMask(); } - Optional instCombineIntrinsic(InstCombiner &IC, - IntrinsicInst &II) override { + std::optional + instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) override { return Impl.instCombineIntrinsic(IC, II); } - Optional + std::optional simplifyDemandedUseBitsIntrinsic(InstCombiner &IC, IntrinsicInst &II, APInt DemandedMask, KnownBits &Known, bool &KnownBitsComputed) override { return Impl.simplifyDemandedUseBitsIntrinsic(IC, II, DemandedMask, Known, KnownBitsComputed); } - Optional simplifyDemandedVectorEltsIntrinsic( + std::optional simplifyDemandedVectorEltsIntrinsic( InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3, std::function @@ -2266,10 +2263,11 @@ class TargetTransformInfo::Model final : public TargetTransformInfo::Concept { I, AllowPromotionWithoutCommonHeader); } unsigned getCacheLineSize() const override { return Impl.getCacheLineSize(); } - Optional getCacheSize(CacheLevel Level) const override { + std::optional getCacheSize(CacheLevel Level) const override { return Impl.getCacheSize(Level); } - Optional getCacheAssociativity(CacheLevel Level) const override { + std::optional + getCacheAssociativity(CacheLevel Level) const override { return Impl.getCacheAssociativity(Level); } @@ -2407,7 +2405,7 @@ class TargetTransformInfo::Model final : public TargetTransformInfo::Concept { } InstructionCost getArithmeticReductionCost(unsigned Opcode, VectorType *Ty, - Optional FMF, + std::optional FMF, TTI::TargetCostKind CostKind) override { return Impl.getArithmeticReductionCost(Opcode, Ty, FMF, CostKind); } @@ -2418,7 +2416,7 @@ class TargetTransformInfo::Model final : public TargetTransformInfo::Concept { } InstructionCost getExtendedReductionCost( unsigned Opcode, bool IsUnsigned, Type *ResTy, VectorType *Ty, - Optional FMF, + std::optional FMF, TTI::TargetCostKind CostKind = TTI::TCK_RecipThroughput) override { return Impl.getExtendedReductionCost(Opcode, IsUnsigned, ResTy, Ty, FMF, CostKind); @@ -2461,7 +2459,7 @@ class TargetTransformInfo::Model final : public TargetTransformInfo::Concept { Type *getMemcpyLoopLoweringType( LLVMContext &Context, Value *Length, unsigned SrcAddrSpace, unsigned DestAddrSpace, unsigned SrcAlign, unsigned DestAlign, - Optional AtomicElementSize) const override { + std::optional AtomicElementSize) const override { return Impl.getMemcpyLoopLoweringType(Context, Length, SrcAddrSpace, DestAddrSpace, SrcAlign, DestAlign, AtomicElementSize); @@ -2470,7 +2468,7 @@ class TargetTransformInfo::Model final : public TargetTransformInfo::Concept { SmallVectorImpl &OpsOut, LLVMContext &Context, unsigned RemainingBytes, unsigned SrcAddrSpace, unsigned DestAddrSpace, unsigned SrcAlign, unsigned DestAlign, - Optional AtomicCpySize) const override { + std::optional AtomicCpySize) const override { Impl.getMemcpyLoopResidualLoweringType(OpsOut, Context, RemainingBytes, SrcAddrSpace, DestAddrSpace, SrcAlign, DestAlign, AtomicCpySize); diff --git a/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h b/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h index b21a001810938f..e814d86c1f7b83 100644 --- a/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h +++ b/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h @@ -175,24 +175,24 @@ class TargetTransformInfoImplBase { return PredicationStyle::None; } - Optional instCombineIntrinsic(InstCombiner &IC, - IntrinsicInst &II) const { - return None; + std::optional instCombineIntrinsic(InstCombiner &IC, + IntrinsicInst &II) const { + return std::nullopt; } - Optional + std::optional simplifyDemandedUseBitsIntrinsic(InstCombiner &IC, IntrinsicInst &II, APInt DemandedMask, KnownBits &Known, bool &KnownBitsComputed) const { - return None; + return std::nullopt; } - Optional simplifyDemandedVectorEltsIntrinsic( + std::optional simplifyDemandedVectorEltsIntrinsic( InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3, std::function SimplifyAndSetOp) const { - return None; + return std::nullopt; } void getUnrollingPreferences(Loop *, ScalarEvolution &, @@ -453,25 +453,24 @@ class TargetTransformInfoImplBase { } unsigned getCacheLineSize() const { return 0; } - - llvm::Optional + std::optional getCacheSize(TargetTransformInfo::CacheLevel Level) const { switch (Level) { case TargetTransformInfo::CacheLevel::L1D: [[fallthrough]]; case TargetTransformInfo::CacheLevel::L2D: - return llvm::None; + return std::nullopt; } llvm_unreachable("Unknown TargetTransformInfo::CacheLevel"); } - llvm::Optional + std::optional getCacheAssociativity(TargetTransformInfo::CacheLevel Level) const { switch (Level) { case TargetTransformInfo::CacheLevel::L1D: [[fallthrough]]; case TargetTransformInfo::CacheLevel::L2D: - return llvm::None; + return std::nullopt; } llvm_unreachable("Unknown TargetTransformInfo::CacheLevel"); @@ -694,7 +693,7 @@ class TargetTransformInfoImplBase { } InstructionCost getArithmeticReductionCost(unsigned, VectorType *, - Optional FMF, + std::optional FMF, TTI::TargetCostKind) const { return 1; } @@ -706,7 +705,7 @@ class TargetTransformInfoImplBase { InstructionCost getExtendedReductionCost(unsigned Opcode, bool IsUnsigned, Type *ResTy, VectorType *Ty, - Optional FMF, + std::optional FMF, TTI::TargetCostKind CostKind) const { return 1; } @@ -739,10 +738,11 @@ class TargetTransformInfoImplBase { return nullptr; } - Type *getMemcpyLoopLoweringType(LLVMContext &Context, Value *Length, - unsigned SrcAddrSpace, unsigned DestAddrSpace, - unsigned SrcAlign, unsigned DestAlign, - Optional AtomicElementSize) const { + Type * + getMemcpyLoopLoweringType(LLVMContext &Context, Value *Length, + unsigned SrcAddrSpace, unsigned DestAddrSpace, + unsigned SrcAlign, unsigned DestAlign, + std::optional AtomicElementSize) const { return AtomicElementSize ? Type::getIntNTy(Context, *AtomicElementSize * 8) : Type::getInt8Ty(Context); } @@ -751,7 +751,7 @@ class TargetTransformInfoImplBase { SmallVectorImpl &OpsOut, LLVMContext &Context, unsigned RemainingBytes, unsigned SrcAddrSpace, unsigned DestAddrSpace, unsigned SrcAlign, unsigned DestAlign, - Optional AtomicCpySize) const { + std::optional AtomicCpySize) const { unsigned OpSizeInBytes = AtomicCpySize ? *AtomicCpySize : 1; Type *OpType = Type::getIntNTy(Context, OpSizeInBytes * 8); for (unsigned i = 0; i != RemainingBytes; i += OpSizeInBytes) diff --git a/llvm/include/llvm/CodeGen/BasicTTIImpl.h b/llvm/include/llvm/CodeGen/BasicTTIImpl.h index 5786310aba00b1..448b9e6831e2a0 100644 --- a/llvm/include/llvm/CodeGen/BasicTTIImpl.h +++ b/llvm/include/llvm/CodeGen/BasicTTIImpl.h @@ -621,21 +621,20 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase { return BaseT::emitGetActiveLaneMask(); } - Optional instCombineIntrinsic(InstCombiner &IC, + std::optional instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) { return BaseT::instCombineIntrinsic(IC, II); } - Optional simplifyDemandedUseBitsIntrinsic(InstCombiner &IC, - IntrinsicInst &II, - APInt DemandedMask, - KnownBits &Known, - bool &KnownBitsComputed) { + std::optional + simplifyDemandedUseBitsIntrinsic(InstCombiner &IC, IntrinsicInst &II, + APInt DemandedMask, KnownBits &Known, + bool &KnownBitsComputed) { return BaseT::simplifyDemandedUseBitsIntrinsic(IC, II, DemandedMask, Known, KnownBitsComputed); } - Optional simplifyDemandedVectorEltsIntrinsic( + std::optional simplifyDemandedVectorEltsIntrinsic( InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3, std::function @@ -645,15 +644,15 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase { SimplifyAndSetOp); } - virtual Optional + virtual std::optional getCacheSize(TargetTransformInfo::CacheLevel Level) const { - return Optional( - getST()->getCacheSize(static_cast(Level))); + return std::optional( + getST()->getCacheSize(static_cast(Level))); } - virtual Optional + virtual std::optional getCacheAssociativity(TargetTransformInfo::CacheLevel Level) const { - Optional TargetResult = + std::optional TargetResult = getST()->getCacheAssociativity(static_cast(Level)); if (TargetResult) @@ -2283,7 +2282,7 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase { } InstructionCost getArithmeticReductionCost(unsigned Opcode, VectorType *Ty, - Optional FMF, + std::optional FMF, TTI::TargetCostKind CostKind) { if (TTI::requiresOrderedReduction(FMF)) return getOrderedReductionCost(Opcode, Ty, CostKind); @@ -2357,7 +2356,7 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase { InstructionCost getExtendedReductionCost(unsigned Opcode, bool IsUnsigned, Type *ResTy, VectorType *Ty, - Optional FMF, + std::optional FMF, TTI::TargetCostKind CostKind) { // Without any native support, this is equivalent to the cost of // vecreduce.opcode(ext(Ty A)). diff --git a/llvm/include/llvm/MC/MCSubtargetInfo.h b/llvm/include/llvm/MC/MCSubtargetInfo.h index 0f33d3b6a23983..6cf4dd5b299a4e 100644 --- a/llvm/include/llvm/MC/MCSubtargetInfo.h +++ b/llvm/include/llvm/MC/MCSubtargetInfo.h @@ -23,6 +23,7 @@ #include "llvm/MC/SubtargetFeature.h" #include #include +#include #include namespace llvm { @@ -236,13 +237,13 @@ class MCSubtargetInfo { /// Level is zero-based, so a value of zero means the first level of /// cache. /// - virtual Optional getCacheSize(unsigned Level) const; + virtual std::optional getCacheSize(unsigned Level) const; /// Return the cache associatvity for the given level of cache. /// Level is zero-based, so a value of zero means the first level of /// cache. /// - virtual Optional getCacheAssociativity(unsigned Level) const; + virtual std::optional getCacheAssociativity(unsigned Level) const; /// Return the target cache line size in bytes at a given level. /// diff --git a/llvm/include/llvm/Transforms/InstCombine/InstCombiner.h b/llvm/include/llvm/Transforms/InstCombine/InstCombiner.h index 87eeb8e020a692..54d221053e668f 100644 --- a/llvm/include/llvm/Transforms/InstCombine/InstCombiner.h +++ b/llvm/include/llvm/Transforms/InstCombine/InstCombiner.h @@ -378,12 +378,12 @@ class LLVM_LIBRARY_VISIBILITY InstCombiner { LoopInfo *getLoopInfo() const { return LI; } // Call target specific combiners - Optional targetInstCombineIntrinsic(IntrinsicInst &II); - Optional + std::optional targetInstCombineIntrinsic(IntrinsicInst &II); + std::optional targetSimplifyDemandedUseBitsIntrinsic(IntrinsicInst &II, APInt DemandedMask, KnownBits &Known, bool &KnownBitsComputed); - Optional targetSimplifyDemandedVectorEltsIntrinsic( + std::optional targetSimplifyDemandedVectorEltsIntrinsic( IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3, std::function diff --git a/llvm/include/llvm/Transforms/Utils/LowerMemIntrinsics.h b/llvm/include/llvm/Transforms/Utils/LowerMemIntrinsics.h index acf59ff580a4e8..d0c27d198ae434 100644 --- a/llvm/include/llvm/Transforms/Utils/LowerMemIntrinsics.h +++ b/llvm/include/llvm/Transforms/Utils/LowerMemIntrinsics.h @@ -14,7 +14,8 @@ #ifndef LLVM_TRANSFORMS_UTILS_LOWERMEMINTRINSICS_H #define LLVM_TRANSFORMS_UTILS_LOWERMEMINTRINSICS_H -#include "llvm/ADT/Optional.h" +#include +#include namespace llvm { @@ -31,21 +32,19 @@ struct Align; /// Emit a loop implementing the semantics of llvm.memcpy where the size is not /// a compile-time constant. Loop will be insterted at \p InsertBefore. -void createMemCpyLoopUnknownSize(Instruction *InsertBefore, Value *SrcAddr, - Value *DstAddr, Value *CopyLen, Align SrcAlign, - Align DestAlign, bool SrcIsVolatile, - bool DstIsVolatile, bool CanOverlap, - const TargetTransformInfo &TTI, - Optional AtomicSize = None); +void createMemCpyLoopUnknownSize( + Instruction *InsertBefore, Value *SrcAddr, Value *DstAddr, Value *CopyLen, + Align SrcAlign, Align DestAlign, bool SrcIsVolatile, bool DstIsVolatile, + bool CanOverlap, const TargetTransformInfo &TTI, + std::optional AtomicSize = std::nullopt); /// Emit a loop implementing the semantics of an llvm.memcpy whose size is a /// compile time constant. Loop is inserted at \p InsertBefore. -void createMemCpyLoopKnownSize(Instruction *InsertBefore, Value *SrcAddr, - Value *DstAddr, ConstantInt *CopyLen, - Align SrcAlign, Align DestAlign, - bool SrcIsVolatile, bool DstIsVolatile, - bool CanOverlap, const TargetTransformInfo &TTI, - Optional AtomicCpySize = None); +void createMemCpyLoopKnownSize( + Instruction *InsertBefore, Value *SrcAddr, Value *DstAddr, + ConstantInt *CopyLen, Align SrcAlign, Align DestAlign, bool SrcIsVolatile, + bool DstIsVolatile, bool CanOverlap, const TargetTransformInfo &TTI, + std::optional AtomicCpySize = std::nullopt); /// Expand \p MemCpy as a loop. \p MemCpy is not deleted. void expandMemCpyAsLoop(MemCpyInst *MemCpy, const TargetTransformInfo &TTI, diff --git a/llvm/lib/Analysis/TargetTransformInfo.cpp b/llvm/lib/Analysis/TargetTransformInfo.cpp index e8e8305db3bdf5..c66e03abd0d1b2 100644 --- a/llvm/lib/Analysis/TargetTransformInfo.cpp +++ b/llvm/lib/Analysis/TargetTransformInfo.cpp @@ -20,6 +20,7 @@ #include "llvm/IR/PatternMatch.h" #include "llvm/InitializePasses.h" #include "llvm/Support/CommandLine.h" +#include #include using namespace llvm; @@ -308,20 +309,20 @@ PredicationStyle TargetTransformInfo::emitGetActiveLaneMask() const { return TTIImpl->emitGetActiveLaneMask(); } -Optional +std::optional TargetTransformInfo::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const { return TTIImpl->instCombineIntrinsic(IC, II); } -Optional TargetTransformInfo::simplifyDemandedUseBitsIntrinsic( +std::optional TargetTransformInfo::simplifyDemandedUseBitsIntrinsic( InstCombiner &IC, IntrinsicInst &II, APInt DemandedMask, KnownBits &Known, bool &KnownBitsComputed) const { return TTIImpl->simplifyDemandedUseBitsIntrinsic(IC, II, DemandedMask, Known, KnownBitsComputed); } -Optional TargetTransformInfo::simplifyDemandedVectorEltsIntrinsic( +std::optional TargetTransformInfo::simplifyDemandedVectorEltsIntrinsic( InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3, std::function @@ -689,12 +690,12 @@ unsigned TargetTransformInfo::getCacheLineSize() const { : TTIImpl->getCacheLineSize(); } -llvm::Optional +std::optional TargetTransformInfo::getCacheSize(CacheLevel Level) const { return TTIImpl->getCacheSize(Level); } -llvm::Optional +std::optional TargetTransformInfo::getCacheAssociativity(CacheLevel Level) const { return TTIImpl->getCacheAssociativity(Level); } @@ -1000,7 +1001,7 @@ InstructionCost TargetTransformInfo::getMemcpyCost(const Instruction *I) const { } InstructionCost TargetTransformInfo::getArithmeticReductionCost( - unsigned Opcode, VectorType *Ty, Optional FMF, + unsigned Opcode, VectorType *Ty, std::optional FMF, TTI::TargetCostKind CostKind) const { InstructionCost Cost = TTIImpl->getArithmeticReductionCost(Opcode, Ty, FMF, CostKind); @@ -1019,7 +1020,7 @@ InstructionCost TargetTransformInfo::getMinMaxReductionCost( InstructionCost TargetTransformInfo::getExtendedReductionCost( unsigned Opcode, bool IsUnsigned, Type *ResTy, VectorType *Ty, - Optional FMF, TTI::TargetCostKind CostKind) const { + std::optional FMF, TTI::TargetCostKind CostKind) const { return TTIImpl->getExtendedReductionCost(Opcode, IsUnsigned, ResTy, Ty, FMF, CostKind); } @@ -1052,7 +1053,7 @@ Value *TargetTransformInfo::getOrCreateResultFromMemIntrinsic( Type *TargetTransformInfo::getMemcpyLoopLoweringType( LLVMContext &Context, Value *Length, unsigned SrcAddrSpace, unsigned DestAddrSpace, unsigned SrcAlign, unsigned DestAlign, - Optional AtomicElementSize) const { + std::optional AtomicElementSize) const { return TTIImpl->getMemcpyLoopLoweringType(Context, Length, SrcAddrSpace, DestAddrSpace, SrcAlign, DestAlign, AtomicElementSize); @@ -1062,7 +1063,7 @@ void TargetTransformInfo::getMemcpyLoopResidualLoweringType( SmallVectorImpl &OpsOut, LLVMContext &Context, unsigned RemainingBytes, unsigned SrcAddrSpace, unsigned DestAddrSpace, unsigned SrcAlign, unsigned DestAlign, - Optional AtomicCpySize) const { + std::optional AtomicCpySize) const { TTIImpl->getMemcpyLoopResidualLoweringType( OpsOut, Context, RemainingBytes, SrcAddrSpace, DestAddrSpace, SrcAlign, DestAlign, AtomicCpySize); diff --git a/llvm/lib/MC/MCSubtargetInfo.cpp b/llvm/lib/MC/MCSubtargetInfo.cpp index d851c20d355735..686274a84836bc 100644 --- a/llvm/lib/MC/MCSubtargetInfo.cpp +++ b/llvm/lib/MC/MCSubtargetInfo.cpp @@ -17,6 +17,7 @@ #include #include #include +#include using namespace llvm; @@ -335,11 +336,11 @@ void MCSubtargetInfo::initInstrItins(InstrItineraryData &InstrItins) const { ForwardingPaths); } -Optional MCSubtargetInfo::getCacheSize(unsigned Level) const { - return None; +std::optional MCSubtargetInfo::getCacheSize(unsigned Level) const { + return std::nullopt; } -Optional +std::optional MCSubtargetInfo::getCacheAssociativity(unsigned Level) const { return None; } diff --git a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp index 14f2b5b9d7dc0b..355c661e2ebe5f 100644 --- a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.cpp @@ -24,6 +24,7 @@ #include "llvm/Transforms/InstCombine/InstCombiner.h" #include "llvm/Transforms/Vectorize/LoopVectorizationLegality.h" #include +#include using namespace llvm; using namespace llvm::PatternMatch; @@ -521,8 +522,8 @@ AArch64TTIImpl::getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA, /// The function will remove redundant reinterprets casting in the presence /// of the control flow -static Optional processPhiNode(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional processPhiNode(InstCombiner &IC, + IntrinsicInst &II) { SmallVector Worklist; auto RequiredType = II.getType(); @@ -531,7 +532,7 @@ static Optional processPhiNode(InstCombiner &IC, // Don't create a new Phi unless we can remove the old one. if (!PN->hasOneUse()) - return None; + return std::nullopt; for (Value *IncValPhi : PN->incoming_values()) { auto *Reinterpret = dyn_cast(IncValPhi); @@ -539,7 +540,7 @@ static Optional processPhiNode(InstCombiner &IC, Reinterpret->getIntrinsicID() != Intrinsic::aarch64_sve_convert_to_svbool || RequiredType != Reinterpret->getArgOperand(0)->getType()) - return None; + return std::nullopt; } // Create the new Phi @@ -568,11 +569,11 @@ static Optional processPhiNode(InstCombiner &IC, // and` into a ` and`. This is profitable because // to_svbool must zero the new lanes during widening, whereas // from_svbool is free. -static Optional tryCombineFromSVBoolBinOp(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional +tryCombineFromSVBoolBinOp(InstCombiner &IC, IntrinsicInst &II) { auto BinOp = dyn_cast(II.getOperand(0)); if (!BinOp) - return None; + return std::nullopt; auto IntrinsicID = BinOp->getIntrinsicID(); switch (IntrinsicID) { @@ -585,7 +586,7 @@ static Optional tryCombineFromSVBoolBinOp(InstCombiner &IC, case Intrinsic::aarch64_sve_orr_z: break; default: - return None; + return std::nullopt; } auto BinOpPred = BinOp->getOperand(0); @@ -595,12 +596,12 @@ static Optional tryCombineFromSVBoolBinOp(InstCombiner &IC, auto PredIntr = dyn_cast(BinOpPred); if (!PredIntr || PredIntr->getIntrinsicID() != Intrinsic::aarch64_sve_convert_to_svbool) - return None; + return std::nullopt; auto PredOp = PredIntr->getOperand(0); auto PredOpTy = cast(PredOp->getType()); if (PredOpTy != II.getType()) - return None; + return std::nullopt; IRBuilder<> Builder(II.getContext()); Builder.SetInsertPoint(&II); @@ -620,8 +621,8 @@ static Optional tryCombineFromSVBoolBinOp(InstCombiner &IC, return IC.replaceInstUsesWith(II, NarrowedBinOp); } -static Optional instCombineConvertFromSVBool(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional +instCombineConvertFromSVBool(InstCombiner &IC, IntrinsicInst &II) { // If the reinterpret instruction operand is a PHI Node if (isa(II.getArgOperand(0))) return processPhiNode(IC, II); @@ -663,32 +664,32 @@ static Optional instCombineConvertFromSVBool(InstCombiner &IC, // If no viable replacement in the conversion chain was found, there is // nothing to do. if (!EarliestReplacement) - return None; + return std::nullopt; return IC.replaceInstUsesWith(II, EarliestReplacement); } -static Optional instCombineSVESel(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional instCombineSVESel(InstCombiner &IC, + IntrinsicInst &II) { IRBuilder<> Builder(&II); auto Select = Builder.CreateSelect(II.getOperand(0), II.getOperand(1), II.getOperand(2)); return IC.replaceInstUsesWith(II, Select); } -static Optional instCombineSVEDup(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional instCombineSVEDup(InstCombiner &IC, + IntrinsicInst &II) { IntrinsicInst *Pg = dyn_cast(II.getArgOperand(1)); if (!Pg) - return None; + return std::nullopt; if (Pg->getIntrinsicID() != Intrinsic::aarch64_sve_ptrue) - return None; + return std::nullopt; const auto PTruePattern = cast(Pg->getOperand(0))->getZExtValue(); if (PTruePattern != AArch64SVEPredPattern::vl1) - return None; + return std::nullopt; // The intrinsic is inserting into lane zero so use an insert instead. auto *IdxTy = Type::getInt64Ty(II.getContext()); @@ -700,8 +701,8 @@ static Optional instCombineSVEDup(InstCombiner &IC, return IC.replaceInstUsesWith(II, Insert); } -static Optional instCombineSVEDupX(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional instCombineSVEDupX(InstCombiner &IC, + IntrinsicInst &II) { // Replace DupX with a regular IR splat. IRBuilder<> Builder(II.getContext()); Builder.SetInsertPoint(&II); @@ -712,8 +713,8 @@ static Optional instCombineSVEDupX(InstCombiner &IC, return IC.replaceInstUsesWith(II, Splat); } -static Optional instCombineSVECmpNE(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional instCombineSVECmpNE(InstCombiner &IC, + IntrinsicInst &II) { LLVMContext &Ctx = II.getContext(); IRBuilder<> Builder(Ctx); Builder.SetInsertPoint(&II); @@ -721,49 +722,49 @@ static Optional instCombineSVECmpNE(InstCombiner &IC, // Check that the predicate is all active auto *Pg = dyn_cast(II.getArgOperand(0)); if (!Pg || Pg->getIntrinsicID() != Intrinsic::aarch64_sve_ptrue) - return None; + return std::nullopt; const auto PTruePattern = cast(Pg->getOperand(0))->getZExtValue(); if (PTruePattern != AArch64SVEPredPattern::all) - return None; + return std::nullopt; // Check that we have a compare of zero.. auto *SplatValue = dyn_cast_or_null(getSplatValue(II.getArgOperand(2))); if (!SplatValue || !SplatValue->isZero()) - return None; + return std::nullopt; // ..against a dupq auto *DupQLane = dyn_cast(II.getArgOperand(1)); if (!DupQLane || DupQLane->getIntrinsicID() != Intrinsic::aarch64_sve_dupq_lane) - return None; + return std::nullopt; // Where the dupq is a lane 0 replicate of a vector insert if (!cast(DupQLane->getArgOperand(1))->isZero()) - return None; + return std::nullopt; auto *VecIns = dyn_cast(DupQLane->getArgOperand(0)); if (!VecIns || VecIns->getIntrinsicID() != Intrinsic::vector_insert) - return None; + return std::nullopt; // Where the vector insert is a fixed constant vector insert into undef at // index zero if (!isa(VecIns->getArgOperand(0))) - return None; + return std::nullopt; if (!cast(VecIns->getArgOperand(2))->isZero()) - return None; + return std::nullopt; auto *ConstVec = dyn_cast(VecIns->getArgOperand(1)); if (!ConstVec) - return None; + return std::nullopt; auto *VecTy = dyn_cast(ConstVec->getType()); auto *OutTy = dyn_cast(II.getType()); if (!VecTy || !OutTy || VecTy->getNumElements() != OutTy->getMinNumElements()) - return None; + return std::nullopt; unsigned NumElts = VecTy->getNumElements(); unsigned PredicateBits = 0; @@ -772,7 +773,7 @@ static Optional instCombineSVECmpNE(InstCombiner &IC, for (unsigned I = 0; I < NumElts; ++I) { auto *Arg = dyn_cast(ConstVec->getAggregateElement(I)); if (!Arg) - return None; + return std::nullopt; if (!Arg->isZero()) PredicateBits |= 1 << (I * (16 / NumElts)); } @@ -797,7 +798,7 @@ static Optional instCombineSVECmpNE(InstCombiner &IC, // Ensure all relevant bits are set for (unsigned I = 0; I < 16; I += PredSize) if ((PredicateBits & (1 << I)) == 0) - return None; + return std::nullopt; auto *PTruePat = ConstantInt::get(Type::getInt32Ty(Ctx), AArch64SVEPredPattern::all); @@ -813,8 +814,8 @@ static Optional instCombineSVECmpNE(InstCombiner &IC, return IC.replaceInstUsesWith(II, ConvertFromSVBool); } -static Optional instCombineSVELast(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional instCombineSVELast(InstCombiner &IC, + IntrinsicInst &II) { IRBuilder<> Builder(II.getContext()); Builder.SetInsertPoint(&II); Value *Pg = II.getArgOperand(0); @@ -855,10 +856,10 @@ static Optional instCombineSVELast(InstCombiner &IC, auto *IntrPG = dyn_cast(Pg); if (!IntrPG) - return None; + return std::nullopt; if (IntrPG->getIntrinsicID() != Intrinsic::aarch64_sve_ptrue) - return None; + return std::nullopt; const auto PTruePattern = cast(IntrPG->getOperand(0))->getZExtValue(); @@ -866,7 +867,7 @@ static Optional instCombineSVELast(InstCombiner &IC, // Can the intrinsic's predicate be converted to a known constant index? unsigned MinNumElts = getNumElementsFromSVEPredPattern(PTruePattern); if (!MinNumElts) - return None; + return std::nullopt; unsigned Idx = MinNumElts - 1; // Increment the index if extracting the element after the last active @@ -879,7 +880,7 @@ static Optional instCombineSVELast(InstCombiner &IC, // maintain what the user asked for until an alternative is proven faster. auto *PgVTy = cast(Pg->getType()); if (Idx >= PgVTy->getMinNumElements()) - return None; + return std::nullopt; // The intrinsic is extracting a fixed lane so use an extract instead. auto *IdxTy = Type::getInt64Ty(II.getContext()); @@ -889,8 +890,8 @@ static Optional instCombineSVELast(InstCombiner &IC, return IC.replaceInstUsesWith(II, Extract); } -static Optional instCombineSVECondLast(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional instCombineSVECondLast(InstCombiner &IC, + IntrinsicInst &II) { // The SIMD&FP variant of CLAST[AB] is significantly faster than the scalar // integer variant across a variety of micro-architectures. Replace scalar // integer CLAST[AB] intrinsic with optimal SIMD&FP variant. A simple @@ -906,12 +907,12 @@ static Optional instCombineSVECondLast(InstCombiner &IC, Type *Ty = II.getType(); if (!Ty->isIntegerTy()) - return None; + return std::nullopt; Type *FPTy; switch (cast(Ty)->getBitWidth()) { default: - return None; + return std::nullopt; case 16: FPTy = Builder.getHalfTy(); break; @@ -933,8 +934,8 @@ static Optional instCombineSVECondLast(InstCombiner &IC, return IC.replaceInstUsesWith(II, FPIItoInt); } -static Optional instCombineRDFFR(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional instCombineRDFFR(InstCombiner &IC, + IntrinsicInst &II) { LLVMContext &Ctx = II.getContext(); IRBuilder<> Builder(Ctx); Builder.SetInsertPoint(&II); @@ -950,7 +951,7 @@ static Optional instCombineRDFFR(InstCombiner &IC, return IC.replaceInstUsesWith(II, RDFFR); } -static Optional +static std::optional instCombineSVECntElts(InstCombiner &IC, IntrinsicInst &II, unsigned NumElts) { const auto Pattern = cast(II.getArgOperand(0))->getZExtValue(); @@ -968,13 +969,13 @@ instCombineSVECntElts(InstCombiner &IC, IntrinsicInst &II, unsigned NumElts) { unsigned MinNumElts = getNumElementsFromSVEPredPattern(Pattern); return MinNumElts && NumElts >= MinNumElts - ? Optional(IC.replaceInstUsesWith( + ? std::optional(IC.replaceInstUsesWith( II, ConstantInt::get(II.getType(), MinNumElts))) - : None; + : std::nullopt; } -static Optional instCombineSVEPTest(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional instCombineSVEPTest(InstCombiner &IC, + IntrinsicInst &II) { Value *PgVal = II.getArgOperand(0); Value *OpVal = II.getArgOperand(1); @@ -1000,7 +1001,7 @@ static Optional instCombineSVEPTest(InstCombiner &IC, IntrinsicInst *Op = dyn_cast(OpVal); if (!Pg || !Op) - return None; + return std::nullopt; Intrinsic::ID OpIID = Op->getIntrinsicID(); @@ -1041,11 +1042,11 @@ static Optional instCombineSVEPTest(InstCombiner &IC, return IC.replaceInstUsesWith(II, PTest); } - return None; + return std::nullopt; } -static Optional instCombineSVEVectorFMLA(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional +instCombineSVEVectorFMLA(InstCombiner &IC, IntrinsicInst &II) { // fold (fadd p a (fmul p b c)) -> (fma p a b c) Value *P = II.getOperand(0); Value *A = II.getOperand(1); @@ -1053,18 +1054,18 @@ static Optional instCombineSVEVectorFMLA(InstCombiner &IC, Value *B, *C; if (!match(FMul, m_Intrinsic( m_Specific(P), m_Value(B), m_Value(C)))) - return None; + return std::nullopt; if (!FMul->hasOneUse()) - return None; + return std::nullopt; llvm::FastMathFlags FAddFlags = II.getFastMathFlags(); // Stop the combine when the flags on the inputs differ in case dropping flags // would lead to us missing out on more beneficial optimizations. if (FAddFlags != cast(FMul)->getFastMathFlags()) - return None; + return std::nullopt; if (!FAddFlags.allowContract()) - return None; + return std::nullopt; IRBuilder<> Builder(II.getContext()); Builder.SetInsertPoint(&II); @@ -1090,7 +1091,7 @@ static bool isAllActivePredicate(Value *Pred) { m_ConstantInt())); } -static Optional +static std::optional instCombineSVELD1(InstCombiner &IC, IntrinsicInst &II, const DataLayout &DL) { IRBuilder<> Builder(II.getContext()); Builder.SetInsertPoint(&II); @@ -1113,7 +1114,7 @@ instCombineSVELD1(InstCombiner &IC, IntrinsicInst &II, const DataLayout &DL) { return IC.replaceInstUsesWith(II, MaskedLoad); } -static Optional +static std::optional instCombineSVEST1(InstCombiner &IC, IntrinsicInst &II, const DataLayout &DL) { IRBuilder<> Builder(II.getContext()); Builder.SetInsertPoint(&II); @@ -1149,14 +1150,14 @@ static Instruction::BinaryOps intrinsicIDToBinOpCode(unsigned Intrinsic) { } } -static Optional instCombineSVEVectorBinOp(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional +instCombineSVEVectorBinOp(InstCombiner &IC, IntrinsicInst &II) { auto *OpPredicate = II.getOperand(0); auto BinOpCode = intrinsicIDToBinOpCode(II.getIntrinsicID()); if (BinOpCode == Instruction::BinaryOpsEnd || !match(OpPredicate, m_Intrinsic( m_ConstantInt()))) - return None; + return std::nullopt; IRBuilder<> Builder(II.getContext()); Builder.SetInsertPoint(&II); Builder.setFastMathFlags(II.getFastMathFlags()); @@ -1165,15 +1166,15 @@ static Optional instCombineSVEVectorBinOp(InstCombiner &IC, return IC.replaceInstUsesWith(II, BinOp); } -static Optional instCombineSVEVectorFAdd(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional +instCombineSVEVectorFAdd(InstCombiner &IC, IntrinsicInst &II) { if (auto FMLA = instCombineSVEVectorFMLA(IC, II)) return FMLA; return instCombineSVEVectorBinOp(IC, II); } -static Optional instCombineSVEVectorMul(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional instCombineSVEVectorMul(InstCombiner &IC, + IntrinsicInst &II) { auto *OpPredicate = II.getOperand(0); auto *OpMultiplicand = II.getOperand(1); auto *OpMultiplier = II.getOperand(2); @@ -1219,8 +1220,8 @@ static Optional instCombineSVEVectorMul(InstCombiner &IC, return instCombineSVEVectorBinOp(IC, II); } -static Optional instCombineSVEUnpack(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional instCombineSVEUnpack(InstCombiner &IC, + IntrinsicInst &II) { IRBuilder<> Builder(II.getContext()); Builder.SetInsertPoint(&II); Value *UnpackArg = II.getArgOperand(0); @@ -1239,10 +1240,10 @@ static Optional instCombineSVEUnpack(InstCombiner &IC, return IC.replaceInstUsesWith(II, NewVal); } - return None; + return std::nullopt; } -static Optional instCombineSVETBL(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional instCombineSVETBL(InstCombiner &IC, + IntrinsicInst &II) { auto *OpVal = II.getOperand(0); auto *OpIndices = II.getOperand(1); VectorType *VTy = cast(II.getType()); @@ -1252,7 +1253,7 @@ static Optional instCombineSVETBL(InstCombiner &IC, auto *SplatValue = dyn_cast_or_null(getSplatValue(OpIndices)); if (!SplatValue || SplatValue->getValue().uge(VTy->getElementCount().getKnownMinValue())) - return None; + return std::nullopt; // Convert sve_tbl(OpVal sve_dup_x(SplatValue)) to // splat_vector(extractelement(OpVal, SplatValue)) for further optimization. @@ -1266,8 +1267,8 @@ static Optional instCombineSVETBL(InstCombiner &IC, return IC.replaceInstUsesWith(II, VectorSplat); } -static Optional instCombineSVEZip(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional instCombineSVEZip(InstCombiner &IC, + IntrinsicInst &II) { // zip1(uzp1(A, B), uzp2(A, B)) --> A // zip2(uzp1(A, B), uzp2(A, B)) --> B Value *A, *B; @@ -1278,11 +1279,11 @@ static Optional instCombineSVEZip(InstCombiner &IC, return IC.replaceInstUsesWith( II, (II.getIntrinsicID() == Intrinsic::aarch64_sve_zip1 ? A : B)); - return None; + return std::nullopt; } -static Optional instCombineLD1GatherIndex(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional +instCombineLD1GatherIndex(InstCombiner &IC, IntrinsicInst &II) { Value *Mask = II.getOperand(0); Value *BasePtr = II.getOperand(1); Value *Index = II.getOperand(2); @@ -1302,8 +1303,8 @@ static Optional instCombineLD1GatherIndex(InstCombiner &IC, BasePtr->getPointerAlignment(II.getModule()->getDataLayout()); Type *VecPtrTy = PointerType::getUnqual(Ty); - Value *Ptr = Builder.CreateGEP( - cast(Ty)->getElementType(), BasePtr, IndexBase); + Value *Ptr = Builder.CreateGEP(cast(Ty)->getElementType(), + BasePtr, IndexBase); Ptr = Builder.CreateBitCast(Ptr, VecPtrTy); CallInst *MaskedLoad = Builder.CreateMaskedLoad(Ty, Ptr, Alignment, Mask, PassThru); @@ -1311,11 +1312,11 @@ static Optional instCombineLD1GatherIndex(InstCombiner &IC, return IC.replaceInstUsesWith(II, MaskedLoad); } - return None; + return std::nullopt; } -static Optional instCombineST1ScatterIndex(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional +instCombineST1ScatterIndex(InstCombiner &IC, IntrinsicInst &II) { Value *Val = II.getOperand(0); Value *Mask = II.getOperand(1); Value *BasePtr = II.getOperand(2); @@ -1334,8 +1335,8 @@ static Optional instCombineST1ScatterIndex(InstCombiner &IC, Align Alignment = BasePtr->getPointerAlignment(II.getModule()->getDataLayout()); - Value *Ptr = Builder.CreateGEP( - cast(Ty)->getElementType(), BasePtr, IndexBase); + Value *Ptr = Builder.CreateGEP(cast(Ty)->getElementType(), + BasePtr, IndexBase); Type *VecPtrTy = PointerType::getUnqual(Ty); Ptr = Builder.CreateBitCast(Ptr, VecPtrTy); @@ -1344,11 +1345,11 @@ static Optional instCombineST1ScatterIndex(InstCombiner &IC, return IC.eraseInstFromFunction(II); } - return None; + return std::nullopt; } -static Optional instCombineSVESDIV(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional instCombineSVESDIV(InstCombiner &IC, + IntrinsicInst &II) { IRBuilder<> Builder(II.getContext()); Builder.SetInsertPoint(&II); Type *Int32Ty = Builder.getInt32Ty(); @@ -1359,7 +1360,7 @@ static Optional instCombineSVESDIV(InstCombiner &IC, Value *SplatValue = getSplatValue(DivVec); ConstantInt *SplatConstantInt = dyn_cast_or_null(SplatValue); if (!SplatConstantInt) - return None; + return std::nullopt; APInt Divisor = SplatConstantInt->getValue(); if (Divisor.isPowerOf2()) { @@ -1378,21 +1379,21 @@ static Optional instCombineSVESDIV(InstCombiner &IC, return IC.replaceInstUsesWith(II, NEG); } - return None; + return std::nullopt; } -static Optional instCombineMaxMinNM(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional instCombineMaxMinNM(InstCombiner &IC, + IntrinsicInst &II) { Value *A = II.getArgOperand(0); Value *B = II.getArgOperand(1); if (A == B) return IC.replaceInstUsesWith(II, A); - return None; + return std::nullopt; } -static Optional instCombineSVESrshl(InstCombiner &IC, - IntrinsicInst &II) { +static std::optional instCombineSVESrshl(InstCombiner &IC, + IntrinsicInst &II) { IRBuilder<> Builder(&II); Value *Pred = II.getOperand(0); Value *Vec = II.getOperand(1); @@ -1405,21 +1406,20 @@ static Optional instCombineSVESrshl(InstCombiner &IC, !match(Vec, m_Intrinsic( m_Value(MergedValue), m_Value(AbsPred), m_Value()))) - return None; + return std::nullopt; // Transform is valid if any of the following are true: // * The ABS merge value is an undef or non-negative // * The ABS predicate is all active // * The ABS predicate and the SRSHL predicates are the same - if (!isa(MergedValue) && - !match(MergedValue, m_NonNegative()) && + if (!isa(MergedValue) && !match(MergedValue, m_NonNegative()) && AbsPred != Pred && !isAllActivePredicate(AbsPred)) - return None; + return std::nullopt; // Only valid when the shift amount is non-negative, otherwise the rounding // behaviour of SRSHL cannot be ignored. if (!match(Shift, m_NonNegative())) - return None; + return std::nullopt; auto LSL = Builder.CreateIntrinsic(Intrinsic::aarch64_sve_lsl, {II.getType()}, {Pred, Vec, Shift}); @@ -1427,7 +1427,7 @@ static Optional instCombineSVESrshl(InstCombiner &IC, return IC.replaceInstUsesWith(II, LSL); } -Optional +std::optional AArch64TTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const { Intrinsic::ID IID = II.getIntrinsicID(); @@ -1499,10 +1499,10 @@ AArch64TTIImpl::instCombineIntrinsic(InstCombiner &IC, return instCombineSVESrshl(IC, II); } - return None; + return std::nullopt; } -Optional AArch64TTIImpl::simplifyDemandedVectorEltsIntrinsic( +std::optional AArch64TTIImpl::simplifyDemandedVectorEltsIntrinsic( InstCombiner &IC, IntrinsicInst &II, APInt OrigDemandedElts, APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3, std::function @@ -1525,7 +1525,7 @@ Optional AArch64TTIImpl::simplifyDemandedVectorEltsIntrinsic( break; } - return None; + return std::nullopt; } TypeSize @@ -2814,7 +2814,7 @@ InstructionCost AArch64TTIImpl::getArithmeticReductionCostSVE( InstructionCost AArch64TTIImpl::getArithmeticReductionCost(unsigned Opcode, VectorType *ValTy, - Optional FMF, + std::optional FMF, TTI::TargetCostKind CostKind) { if (TTI::requiresOrderedReduction(FMF)) { if (auto *FixedVTy = dyn_cast(ValTy)) { diff --git a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.h b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.h index 04e26f1c98cbd2..ed52ea493b9333 100644 --- a/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.h +++ b/llvm/lib/Target/AArch64/AArch64TargetTransformInfo.h @@ -112,10 +112,10 @@ class AArch64TTIImpl : public BasicTTIImplBase { InstructionCost getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA, TTI::TargetCostKind CostKind); - Optional instCombineIntrinsic(InstCombiner &IC, - IntrinsicInst &II) const; + std::optional instCombineIntrinsic(InstCombiner &IC, + IntrinsicInst &II) const; - Optional simplifyDemandedVectorEltsIntrinsic( + std::optional simplifyDemandedVectorEltsIntrinsic( InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3, std::function @@ -370,7 +370,7 @@ class AArch64TTIImpl : public BasicTTIImplBase { } InstructionCost getArithmeticReductionCost(unsigned Opcode, VectorType *Ty, - Optional FMF, + std::optional FMF, TTI::TargetCostKind CostKind); InstructionCost getShuffleCost(TTI::ShuffleKind Kind, VectorType *Tp, diff --git a/llvm/lib/Target/AMDGPU/AMDGPUInstCombineIntrinsic.cpp b/llvm/lib/Target/AMDGPU/AMDGPUInstCombineIntrinsic.cpp index 0895ae1a4fde07..e5da2ebc975d7c 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUInstCombineIntrinsic.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUInstCombineIntrinsic.cpp @@ -20,6 +20,7 @@ #include "llvm/ADT/FloatingPointMode.h" #include "llvm/IR/IntrinsicsAMDGPU.h" #include "llvm/Transforms/InstCombine/InstCombiner.h" +#include using namespace llvm; @@ -114,14 +115,14 @@ static Value *convertTo16Bit(Value &V, InstCombiner::BuilderTy &Builder) { /// Applies Func(OldIntr.Args, OldIntr.ArgTys), creates intrinsic call with /// modified arguments (based on OldIntr) and replaces InstToReplace with /// this newly created intrinsic call. -static Optional modifyIntrinsicCall( +static std::optional modifyIntrinsicCall( IntrinsicInst &OldIntr, Instruction &InstToReplace, unsigned NewIntr, InstCombiner &IC, std::function &, SmallVectorImpl &)> Func) { SmallVector ArgTys; if (!Intrinsic::getIntrinsicSignature(OldIntr.getCalledFunction(), ArgTys)) - return None; + return std::nullopt; SmallVector Args(OldIntr.args()); @@ -149,7 +150,7 @@ static Optional modifyIntrinsicCall( return RetValue; } -static Optional +static std::optional simplifyAMDGCNImageIntrinsic(const GCNSubtarget *ST, const AMDGPU::ImageDimIntrinsicInfo *ImageDimIntr, IntrinsicInst &II, InstCombiner &IC) { @@ -252,7 +253,7 @@ simplifyAMDGCNImageIntrinsic(const GCNSubtarget *ST, // Try to use A16 or G16 if (!ST->hasA16() && !ST->hasG16()) - return None; + return std::nullopt; // Address is interpreted as float if the instruction has a sampler or as // unsigned int if there is no sampler. @@ -295,7 +296,7 @@ simplifyAMDGCNImageIntrinsic(const GCNSubtarget *ST, if (OnlyDerivatives && (!ST->hasG16() || ImageDimIntr->GradientStart == ImageDimIntr->CoordStart)) - return None; + return std::nullopt; Type *CoordType = FloatCoord ? Type::getHalfTy(II.getContext()) : Type::getInt16Ty(II.getContext()); @@ -348,7 +349,7 @@ bool GCNTTIImpl::canSimplifyLegacyMulToMul(const Value *Op0, const Value *Op1, return false; } -Optional +std::optional GCNTTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const { Intrinsic::ID IID = II.getIntrinsicID(); switch (IID) { @@ -1059,7 +1060,7 @@ GCNTTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const { } } } - return None; + return std::nullopt; } /// Implement SimplifyDemandedVectorElts for amdgcn buffer and image intrinsics. @@ -1204,7 +1205,7 @@ static Value *simplifyAMDGCNMemoryIntrinsicDemanded(InstCombiner &IC, return Shuffle; } -Optional GCNTTIImpl::simplifyDemandedVectorEltsIntrinsic( +std::optional GCNTTIImpl::simplifyDemandedVectorEltsIntrinsic( InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3, std::function @@ -1228,5 +1229,5 @@ Optional GCNTTIImpl::simplifyDemandedVectorEltsIntrinsic( break; } } - return None; + return std::nullopt; } diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.cpp b/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.cpp index 483c7037acf344..b798c228127ecd 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.cpp @@ -23,6 +23,7 @@ #include "llvm/IR/IntrinsicsAMDGPU.h" #include "llvm/IR/PatternMatch.h" #include "llvm/Support/KnownBits.h" +#include using namespace llvm; @@ -401,7 +402,7 @@ bool GCNTTIImpl::isLegalToVectorizeStoreChain(unsigned ChainSizeInBytes, Type *GCNTTIImpl::getMemcpyLoopLoweringType( LLVMContext &Context, Value *Length, unsigned SrcAddrSpace, unsigned DestAddrSpace, unsigned SrcAlign, unsigned DestAlign, - Optional AtomicElementSize) const { + std::optional AtomicElementSize) const { if (AtomicElementSize) return Type::getIntNTy(Context, *AtomicElementSize * 8); @@ -433,7 +434,7 @@ void GCNTTIImpl::getMemcpyLoopResidualLoweringType( SmallVectorImpl &OpsOut, LLVMContext &Context, unsigned RemainingBytes, unsigned SrcAddrSpace, unsigned DestAddrSpace, unsigned SrcAlign, unsigned DestAlign, - Optional AtomicCpySize) const { + std::optional AtomicCpySize) const { assert(RemainingBytes < 16); if (AtomicCpySize) @@ -756,7 +757,7 @@ InstructionCost GCNTTIImpl::getCFInstrCost(unsigned Opcode, InstructionCost GCNTTIImpl::getArithmeticReductionCost(unsigned Opcode, VectorType *Ty, - Optional FMF, + std::optional FMF, TTI::TargetCostKind CostKind) { if (TTI::requiresOrderedReduction(FMF)) return BaseT::getArithmeticReductionCost(Opcode, Ty, FMF, CostKind); diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h b/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h index fb54cfd09da308..d9632097a247d6 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h +++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetTransformInfo.h @@ -19,6 +19,7 @@ #include "AMDGPU.h" #include "llvm/CodeGen/BasicTTIImpl.h" +#include namespace llvm { @@ -132,16 +133,16 @@ class GCNTTIImpl final : public BasicTTIImplBase { unsigned AddrSpace) const; bool isLegalToVectorizeStoreChain(unsigned ChainSizeInBytes, Align Alignment, unsigned AddrSpace) const; - Type *getMemcpyLoopLoweringType(LLVMContext &Context, Value *Length, - unsigned SrcAddrSpace, unsigned DestAddrSpace, - unsigned SrcAlign, unsigned DestAlign, - Optional AtomicElementSize) const; + Type *getMemcpyLoopLoweringType( + LLVMContext & Context, Value * Length, unsigned SrcAddrSpace, + unsigned DestAddrSpace, unsigned SrcAlign, unsigned DestAlign, + std::optional AtomicElementSize) const; void getMemcpyLoopResidualLoweringType( SmallVectorImpl &OpsOut, LLVMContext &Context, unsigned RemainingBytes, unsigned SrcAddrSpace, unsigned DestAddrSpace, unsigned SrcAlign, unsigned DestAlign, - Optional AtomicCpySize) const; + std::optional AtomicCpySize) const; unsigned getMaxInterleaveFactor(unsigned VF); bool getTgtMemIntrinsic(IntrinsicInst *Inst, MemIntrinsicInfo &Info) const; @@ -188,9 +189,9 @@ class GCNTTIImpl final : public BasicTTIImplBase { bool canSimplifyLegacyMulToMul(const Value *Op0, const Value *Op1, InstCombiner &IC) const; - Optional instCombineIntrinsic(InstCombiner &IC, - IntrinsicInst &II) const; - Optional simplifyDemandedVectorEltsIntrinsic( + std::optional instCombineIntrinsic(InstCombiner &IC, + IntrinsicInst &II) const; + std::optional simplifyDemandedVectorEltsIntrinsic( InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3, std::function @@ -213,7 +214,7 @@ class GCNTTIImpl final : public BasicTTIImplBase { int getInlinerVectorBonusPercent() { return 0; } InstructionCost getArithmeticReductionCost( - unsigned Opcode, VectorType *Ty, Optional FMF, + unsigned Opcode, VectorType *Ty, std::optional FMF, TTI::TargetCostKind CostKind); InstructionCost getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA, diff --git a/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp b/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp index 06cbe34eef1e4b..8eec432a4a668b 100644 --- a/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp +++ b/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include using namespace llvm; @@ -117,7 +118,7 @@ ARMTTIImpl::getPreferredAddressingMode(const Loop *L, return TTI::AMK_None; } -Optional +std::optional ARMTTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const { using namespace PatternMatch; Intrinsic::ID IID = II.getIntrinsicID(); @@ -243,13 +244,13 @@ ARMTTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const { return IC.eraseInstFromFunction(*User); } } - return None; + return std::nullopt; } } - return None; + return std::nullopt; } -Optional ARMTTIImpl::simplifyDemandedVectorEltsIntrinsic( +std::optional ARMTTIImpl::simplifyDemandedVectorEltsIntrinsic( InstCombiner &IC, IntrinsicInst &II, APInt OrigDemandedElts, APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3, std::function @@ -271,7 +272,7 @@ Optional ARMTTIImpl::simplifyDemandedVectorEltsIntrinsic( // The other lanes will be defined from the inserted elements. UndefElts &= APInt::getSplat(NumElts, !IsTop ? APInt::getLowBitsSet(2, 1) : APInt::getHighBitsSet(2, 1)); - return None; + return std::nullopt; }; switch (II.getIntrinsicID()) { @@ -288,7 +289,7 @@ Optional ARMTTIImpl::simplifyDemandedVectorEltsIntrinsic( break; } - return None; + return std::nullopt; } InstructionCost ARMTTIImpl::getIntImmCost(const APInt &Imm, Type *Ty, @@ -1653,7 +1654,7 @@ InstructionCost ARMTTIImpl::getGatherScatterOpCost( InstructionCost ARMTTIImpl::getArithmeticReductionCost(unsigned Opcode, VectorType *ValTy, - Optional FMF, + std::optional FMF, TTI::TargetCostKind CostKind) { if (TTI::requiresOrderedReduction(FMF)) return BaseT::getArithmeticReductionCost(Opcode, ValTy, FMF, CostKind); @@ -1678,7 +1679,7 @@ ARMTTIImpl::getArithmeticReductionCost(unsigned Opcode, VectorType *ValTy, InstructionCost ARMTTIImpl::getExtendedReductionCost( unsigned Opcode, bool IsUnsigned, Type *ResTy, VectorType *ValTy, - Optional FMF, TTI::TargetCostKind CostKind) { + std::optional FMF, TTI::TargetCostKind CostKind) { EVT ValVT = TLI->getValueType(DL, ValTy); EVT ResVT = TLI->getValueType(DL, ResTy); diff --git a/llvm/lib/Target/ARM/ARMTargetTransformInfo.h b/llvm/lib/Target/ARM/ARMTargetTransformInfo.h index c0180923c240a7..e919b9b2aee842 100644 --- a/llvm/lib/Target/ARM/ARMTargetTransformInfo.h +++ b/llvm/lib/Target/ARM/ARMTargetTransformInfo.h @@ -26,6 +26,7 @@ #include "llvm/IR/Constant.h" #include "llvm/IR/Function.h" #include "llvm/MC/SubtargetFeature.h" +#include namespace llvm { @@ -118,9 +119,9 @@ class ARMTTIImpl : public BasicTTIImplBase { return !ST->isTargetDarwin() && !ST->hasMVEFloatOps(); } - Optional instCombineIntrinsic(InstCombiner &IC, - IntrinsicInst &II) const; - Optional simplifyDemandedVectorEltsIntrinsic( + std::optional instCombineIntrinsic(InstCombiner &IC, + IntrinsicInst &II) const; + std::optional simplifyDemandedVectorEltsIntrinsic( InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3, std::function @@ -274,11 +275,11 @@ class ARMTTIImpl : public BasicTTIImplBase { const Instruction *I = nullptr); InstructionCost getArithmeticReductionCost(unsigned Opcode, VectorType *ValTy, - Optional FMF, + std::optional FMF, TTI::TargetCostKind CostKind); InstructionCost getExtendedReductionCost(unsigned Opcode, bool IsUnsigned, Type *ResTy, VectorType *ValTy, - Optional FMF, + std::optional FMF, TTI::TargetCostKind CostKind); InstructionCost getMulAccReductionCost(bool IsUnsigned, Type *ResTy, VectorType *ValTy, diff --git a/llvm/lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp b/llvm/lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp index ec4a55dd39a94a..7dac28f725a5af 100644 --- a/llvm/lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXTargetTransformInfo.cpp @@ -414,12 +414,12 @@ static Instruction *simplifyNvvmIntrinsic(IntrinsicInst *II, InstCombiner &IC) { llvm_unreachable("All SpecialCase enumerators should be handled in switch."); } -Optional +std::optional NVPTXTTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const { if (Instruction *I = simplifyNvvmIntrinsic(&II, IC)) { return I; } - return None; + return std::nullopt; } InstructionCost NVPTXTTIImpl::getArithmeticInstrCost( diff --git a/llvm/lib/Target/NVPTX/NVPTXTargetTransformInfo.h b/llvm/lib/Target/NVPTX/NVPTXTargetTransformInfo.h index 045254420fda5e..0b1195ed9c8fb2 100644 --- a/llvm/lib/Target/NVPTX/NVPTXTargetTransformInfo.h +++ b/llvm/lib/Target/NVPTX/NVPTXTargetTransformInfo.h @@ -21,6 +21,7 @@ #include "llvm/Analysis/TargetTransformInfo.h" #include "llvm/CodeGen/BasicTTIImpl.h" #include "llvm/CodeGen/TargetLowering.h" +#include namespace llvm { @@ -53,8 +54,8 @@ class NVPTXTTIImpl : public BasicTTIImplBase { AS != AddressSpace::ADDRESS_SPACE_LOCAL && AS != ADDRESS_SPACE_PARAM; } - Optional instCombineIntrinsic(InstCombiner &IC, - IntrinsicInst &II) const; + std::optional instCombineIntrinsic(InstCombiner &IC, + IntrinsicInst &II) const; // Loads and stores can be vectorized if the alignment is at least as big as // the load/store we want to vectorize. diff --git a/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp b/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp index 00a541f836f6bb..7f7851d35ac6be 100644 --- a/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp +++ b/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.cpp @@ -21,6 +21,7 @@ #include "llvm/Support/KnownBits.h" #include "llvm/Transforms/InstCombine/InstCombiner.h" #include "llvm/Transforms/Utils/Local.h" +#include using namespace llvm; @@ -60,7 +61,7 @@ PPCTTIImpl::getPopcntSupport(unsigned TyWidth) { return TTI::PSK_Software; } -Optional +std::optional PPCTTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const { Intrinsic::ID IID = II.getIntrinsicID(); switch (IID) { @@ -160,7 +161,7 @@ PPCTTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const { } break; } - return None; + return std::nullopt; } InstructionCost PPCTTIImpl::getIntImmCost(const APInt &Imm, Type *Ty, diff --git a/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.h b/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.h index 5a07a83ef9ce50..66f7d80e72ca90 100644 --- a/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.h +++ b/llvm/lib/Target/PowerPC/PPCTargetTransformInfo.h @@ -20,6 +20,7 @@ #include "llvm/Analysis/TargetTransformInfo.h" #include "llvm/CodeGen/BasicTTIImpl.h" #include "llvm/CodeGen/TargetLowering.h" +#include namespace llvm { @@ -41,8 +42,8 @@ class PPCTTIImpl : public BasicTTIImplBase { : BaseT(TM, F.getParent()->getDataLayout()), ST(TM->getSubtargetImpl(F)), TLI(ST->getTargetLowering()) {} - Optional instCombineIntrinsic(InstCombiner &IC, - IntrinsicInst &II) const; + std::optional instCombineIntrinsic(InstCombiner & IC, + IntrinsicInst & II) const; /// \name Scalar TTI Implementations /// @{ diff --git a/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp b/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp index ef39a93665cb2a..3c51738bb551ae 100644 --- a/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp +++ b/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp @@ -784,7 +784,7 @@ RISCVTTIImpl::getMinMaxReductionCost(VectorType *Ty, VectorType *CondTy, InstructionCost RISCVTTIImpl::getArithmeticReductionCost(unsigned Opcode, VectorType *Ty, - Optional FMF, + std::optional FMF, TTI::TargetCostKind CostKind) { if (isa(Ty) && !ST->useRVVForFixedLengthVectors()) return BaseT::getArithmeticReductionCost(Opcode, Ty, FMF, CostKind); @@ -815,7 +815,7 @@ RISCVTTIImpl::getArithmeticReductionCost(unsigned Opcode, VectorType *Ty, InstructionCost RISCVTTIImpl::getExtendedReductionCost( unsigned Opcode, bool IsUnsigned, Type *ResTy, VectorType *ValTy, - Optional FMF, TTI::TargetCostKind CostKind) { + std::optional FMF, TTI::TargetCostKind CostKind) { if (isa(ValTy) && !ST->useRVVForFixedLengthVectors()) return BaseT::getExtendedReductionCost(Opcode, IsUnsigned, ResTy, ValTy, FMF, CostKind); diff --git a/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.h b/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.h index d13d58a3c1cf7f..3710a886ed895c 100644 --- a/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.h +++ b/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.h @@ -137,12 +137,12 @@ class RISCVTTIImpl : public BasicTTIImplBase { TTI::TargetCostKind CostKind); InstructionCost getArithmeticReductionCost(unsigned Opcode, VectorType *Ty, - Optional FMF, + std::optional FMF, TTI::TargetCostKind CostKind); InstructionCost getExtendedReductionCost(unsigned Opcode, bool IsUnsigned, Type *ResTy, VectorType *ValTy, - Optional FMF, + std::optional FMF, TTI::TargetCostKind CostKind); InstructionCost diff --git a/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp b/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp index 9b3e469b587ada..a93a9b8d23d79f 100644 --- a/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp +++ b/llvm/lib/Target/X86/X86InstCombineIntrinsic.cpp @@ -18,6 +18,7 @@ #include "llvm/IR/IntrinsicsX86.h" #include "llvm/Support/KnownBits.h" #include "llvm/Transforms/InstCombine/InstCombiner.h" +#include using namespace llvm; @@ -924,7 +925,7 @@ static Value *simplifyX86vpermv(const IntrinsicInst &II, return Builder.CreateShuffleVector(V1, makeArrayRef(Indexes, Size)); } -Optional +std::optional X86TTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const { auto SimplifyDemandedVectorEltsLow = [&IC](Value *Op, unsigned Width, unsigned DemandedWidth) { @@ -1730,10 +1731,10 @@ X86TTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const { default: break; } - return None; + return std::nullopt; } -Optional X86TTIImpl::simplifyDemandedUseBitsIntrinsic( +std::optional X86TTIImpl::simplifyDemandedUseBitsIntrinsic( InstCombiner &IC, IntrinsicInst &II, APInt DemandedMask, KnownBits &Known, bool &KnownBitsComputed) const { switch (II.getIntrinsicID()) { @@ -1770,10 +1771,10 @@ Optional X86TTIImpl::simplifyDemandedUseBitsIntrinsic( break; } } - return None; + return std::nullopt; } -Optional X86TTIImpl::simplifyDemandedVectorEltsIntrinsic( +std::optional X86TTIImpl::simplifyDemandedVectorEltsIntrinsic( InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3, std::function @@ -2025,5 +2026,5 @@ Optional X86TTIImpl::simplifyDemandedVectorEltsIntrinsic( UndefElts.setHighBits(VWidth / 2); break; } - return None; + return std::nullopt; } diff --git a/llvm/lib/Target/X86/X86TargetTransformInfo.cpp b/llvm/lib/Target/X86/X86TargetTransformInfo.cpp index f7d8df21760c33..a5f2b9786e8a24 100644 --- a/llvm/lib/Target/X86/X86TargetTransformInfo.cpp +++ b/llvm/lib/Target/X86/X86TargetTransformInfo.cpp @@ -56,6 +56,7 @@ #include "llvm/IR/InstIterator.h" #include "llvm/IR/IntrinsicInst.h" #include "llvm/Support/Debug.h" +#include using namespace llvm; @@ -75,7 +76,7 @@ struct CostKindCosts { unsigned CodeSizeCost = ~0U; unsigned SizeAndLatencyCost = ~0U; - llvm::Optional + std::optional operator[](TargetTransformInfo::TargetCostKind Kind) const { unsigned Cost = ~0U; switch (Kind) { @@ -93,7 +94,7 @@ struct CostKindCosts { break; } if (Cost == ~0U) - return None; + return std::nullopt; return Cost; } }; @@ -108,7 +109,7 @@ X86TTIImpl::getPopcntSupport(unsigned TyWidth) { return ST->hasPOPCNT() ? TTI::PSK_FastHardware : TTI::PSK_Software; } -llvm::Optional X86TTIImpl::getCacheSize( +std::optional X86TTIImpl::getCacheSize( TargetTransformInfo::CacheLevel Level) const { switch (Level) { case TargetTransformInfo::CacheLevel::L1D: @@ -138,7 +139,7 @@ llvm::Optional X86TTIImpl::getCacheSize( llvm_unreachable("Unknown TargetTransformInfo::CacheLevel"); } -llvm::Optional X86TTIImpl::getCacheAssociativity( +std::optional X86TTIImpl::getCacheAssociativity( TargetTransformInfo::CacheLevel Level) const { // - Penryn // - Nehalem @@ -4909,7 +4910,7 @@ InstructionCost X86TTIImpl::getAddressComputationCost(Type *Ty, InstructionCost X86TTIImpl::getArithmeticReductionCost(unsigned Opcode, VectorType *ValTy, - Optional FMF, + std::optional FMF, TTI::TargetCostKind CostKind) { if (TTI::requiresOrderedReduction(FMF)) return BaseT::getArithmeticReductionCost(Opcode, ValTy, FMF, CostKind); diff --git a/llvm/lib/Target/X86/X86TargetTransformInfo.h b/llvm/lib/Target/X86/X86TargetTransformInfo.h index 808ed39a4038f6..6ea644f1ecc389 100644 --- a/llvm/lib/Target/X86/X86TargetTransformInfo.h +++ b/llvm/lib/Target/X86/X86TargetTransformInfo.h @@ -19,6 +19,7 @@ #include "X86TargetMachine.h" #include "llvm/Analysis/TargetTransformInfo.h" #include "llvm/CodeGen/BasicTTIImpl.h" +#include namespace llvm { @@ -113,9 +114,9 @@ class X86TTIImpl : public BasicTTIImplBase { /// \name Cache TTI Implementation /// @{ - llvm::Optional getCacheSize( + std::optional getCacheSize( TargetTransformInfo::CacheLevel Level) const override; - llvm::Optional getCacheAssociativity( + std::optional getCacheAssociativity( TargetTransformInfo::CacheLevel Level) const override; /// @} @@ -171,13 +172,13 @@ class X86TTIImpl : public BasicTTIImplBase { InstructionCost getAddressComputationCost(Type *PtrTy, ScalarEvolution *SE, const SCEV *Ptr); - Optional instCombineIntrinsic(InstCombiner &IC, - IntrinsicInst &II) const; - Optional + std::optional instCombineIntrinsic(InstCombiner &IC, + IntrinsicInst &II) const; + std::optional simplifyDemandedUseBitsIntrinsic(InstCombiner &IC, IntrinsicInst &II, APInt DemandedMask, KnownBits &Known, bool &KnownBitsComputed) const; - Optional simplifyDemandedVectorEltsIntrinsic( + std::optional simplifyDemandedVectorEltsIntrinsic( InstCombiner &IC, IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3, std::function @@ -189,7 +190,7 @@ class X86TTIImpl : public BasicTTIImplBase { TTI::TargetCostKind CostKind); InstructionCost getArithmeticReductionCost(unsigned Opcode, VectorType *Ty, - Optional FMF, + std::optional FMF, TTI::TargetCostKind CostKind); InstructionCost getMinMaxCost(Type *Ty, Type *CondTy, bool IsUnsigned); diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index a09c32800eb14b..fbc2e52c85da6f 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -72,6 +72,7 @@ #include #include #include +#include #include #include @@ -2827,7 +2828,7 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) { } default: { // Handle target specific intrinsics - Optional V = targetInstCombineIntrinsic(*II); + std::optional V = targetInstCombineIntrinsic(*II); if (V) return V.value(); break; diff --git a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp index 3276c9a23771e7..32baae2d0ef41d 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp @@ -971,7 +971,7 @@ Value *InstCombinerImpl::SimplifyDemandedUseBits(Value *V, APInt DemandedMask, } default: { // Handle target specific intrinsics - Optional V = targetSimplifyDemandedUseBitsIntrinsic( + std::optional V = targetSimplifyDemandedUseBitsIntrinsic( *II, DemandedMask, Known, KnownBitsComputed); if (V) return V.value(); @@ -1696,7 +1696,7 @@ Value *InstCombinerImpl::SimplifyDemandedVectorElts(Value *V, } default: { // Handle target specific intrinsics - Optional V = targetSimplifyDemandedVectorEltsIntrinsic( + std::optional V = targetSimplifyDemandedVectorEltsIntrinsic( *II, DemandedElts, UndefElts, UndefElts2, UndefElts3, simplifyAndSetOp); if (V) diff --git a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp index 4aefcad69fa9f0..f360bc4ca03aae 100644 --- a/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp +++ b/llvm/lib/Transforms/InstCombine/InstructionCombining.cpp @@ -170,16 +170,16 @@ MaxArraySize("instcombine-maxarray-size", cl::init(1024), static cl::opt ShouldLowerDbgDeclare("instcombine-lower-dbg-declare", cl::Hidden, cl::init(true)); -Optional +std::optional InstCombiner::targetInstCombineIntrinsic(IntrinsicInst &II) { // Handle target specific intrinsics if (II.getCalledFunction()->isTargetIntrinsic()) { return TTI.instCombineIntrinsic(*this, II); } - return None; + return std::nullopt; } -Optional InstCombiner::targetSimplifyDemandedUseBitsIntrinsic( +std::optional InstCombiner::targetSimplifyDemandedUseBitsIntrinsic( IntrinsicInst &II, APInt DemandedMask, KnownBits &Known, bool &KnownBitsComputed) { // Handle target specific intrinsics @@ -187,10 +187,10 @@ Optional InstCombiner::targetSimplifyDemandedUseBitsIntrinsic( return TTI.simplifyDemandedUseBitsIntrinsic(*this, II, DemandedMask, Known, KnownBitsComputed); } - return None; + return std::nullopt; } -Optional InstCombiner::targetSimplifyDemandedVectorEltsIntrinsic( +std::optional InstCombiner::targetSimplifyDemandedVectorEltsIntrinsic( IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3, std::function @@ -201,7 +201,7 @@ Optional InstCombiner::targetSimplifyDemandedVectorEltsIntrinsic( *this, II, DemandedElts, UndefElts, UndefElts2, UndefElts3, SimplifyAndSetOp); } - return None; + return std::nullopt; } Value *InstCombinerImpl::EmitGEPOffset(User *GEP) { diff --git a/llvm/lib/Transforms/Utils/LowerMemIntrinsics.cpp b/llvm/lib/Transforms/Utils/LowerMemIntrinsics.cpp index 6cb3c50bdad2ed..165740b5529875 100644 --- a/llvm/lib/Transforms/Utils/LowerMemIntrinsics.cpp +++ b/llvm/lib/Transforms/Utils/LowerMemIntrinsics.cpp @@ -13,16 +13,15 @@ #include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/MDBuilder.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" +#include using namespace llvm; -void llvm::createMemCpyLoopKnownSize(Instruction *InsertBefore, Value *SrcAddr, - Value *DstAddr, ConstantInt *CopyLen, - Align SrcAlign, Align DstAlign, - bool SrcIsVolatile, bool DstIsVolatile, - bool CanOverlap, - const TargetTransformInfo &TTI, - Optional AtomicElementSize) { +void llvm::createMemCpyLoopKnownSize( + Instruction *InsertBefore, Value *SrcAddr, Value *DstAddr, + ConstantInt *CopyLen, Align SrcAlign, Align DstAlign, bool SrcIsVolatile, + bool DstIsVolatile, bool CanOverlap, const TargetTransformInfo &TTI, + std::optional AtomicElementSize) { // No need to expand zero length copies. if (CopyLen->isZero()) return; @@ -173,13 +172,11 @@ void llvm::createMemCpyLoopKnownSize(Instruction *InsertBefore, Value *SrcAddr, "Bytes copied should match size in the call!"); } -void llvm::createMemCpyLoopUnknownSize(Instruction *InsertBefore, - Value *SrcAddr, Value *DstAddr, - Value *CopyLen, Align SrcAlign, - Align DstAlign, bool SrcIsVolatile, - bool DstIsVolatile, bool CanOverlap, - const TargetTransformInfo &TTI, - Optional AtomicElementSize) { +void llvm::createMemCpyLoopUnknownSize( + Instruction *InsertBefore, Value *SrcAddr, Value *DstAddr, Value *CopyLen, + Align SrcAlign, Align DstAlign, bool SrcIsVolatile, bool DstIsVolatile, + bool CanOverlap, const TargetTransformInfo &TTI, + std::optional AtomicElementSize) { BasicBlock *PreLoopBB = InsertBefore->getParent(); BasicBlock *PostLoopBB = PreLoopBB->splitBasicBlock(InsertBefore, "post-loop-memcpy-expansion");