diff --git a/llvm/include/llvm/IR/Attributes.h b/llvm/include/llvm/IR/Attributes.h --- a/llvm/include/llvm/IR/Attributes.h +++ b/llvm/include/llvm/IR/Attributes.h @@ -108,7 +108,8 @@ //===--------------------------------------------------------------------===// /// Return a uniquified Attribute object. - static Attribute get(LLVMContext &Context, AttrKind Kind, uint64_t Val = 0); + static Attribute get(LLVMContext &Context, AttrKind Kind, + Optional Val = NoneType::None); static Attribute get(LLVMContext &Context, StringRef Kind, StringRef Val = StringRef()); static Attribute get(LLVMContext &Context, AttrKind Kind, Type *Ty); diff --git a/llvm/lib/IR/Attributes.cpp b/llvm/lib/IR/Attributes.cpp --- a/llvm/lib/IR/Attributes.cpp +++ b/llvm/lib/IR/Attributes.cpp @@ -89,7 +89,7 @@ } Attribute Attribute::get(LLVMContext &Context, Attribute::AttrKind Kind, - uint64_t Val) { + Optional Val) { if (Val) assert(Attribute::isIntAttrKind(Kind) && "Not an int attribute"); else @@ -98,7 +98,7 @@ LLVMContextImpl *pImpl = Context.pImpl; FoldingSetNodeID ID; ID.AddInteger(Kind); - if (Val) ID.AddInteger(Val); + if (Val.hasValue()) ID.AddInteger(*Val); void *InsertPoint; AttributeImpl *PA = pImpl->AttrsSet.FindNodeOrInsertPos(ID, InsertPoint); @@ -106,10 +106,10 @@ if (!PA) { // If we didn't find any existing attributes of the same shape then create a // new one and insert it. - if (!Val) + if (!Val.hasValue()) PA = new (pImpl->Alloc) EnumAttributeImpl(Kind); else - PA = new (pImpl->Alloc) IntAttributeImpl(Kind, Val); + PA = new (pImpl->Alloc) IntAttributeImpl(Kind, *Val); pImpl->AttrsSet.InsertNode(PA, InsertPoint); } diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp --- a/llvm/lib/Transforms/IPO/Attributor.cpp +++ b/llvm/lib/Transforms/IPO/Attributor.cpp @@ -942,8 +942,10 @@ A.getInfoCache().getMustBeExecutedContextExplorer(); auto EIt = Explorer.begin(getCtxI()), EEnd = Explorer.end(getCtxI()); for (auto &It : A2K) - if (Explorer.findInContextOf(It.first, EIt, EEnd)) - Attrs.push_back(Attribute::get(Ctx, AK, It.second.Max)); + if (Explorer.findInContextOf(It.first, EIt, EEnd)) { + auto OptVal = It.second.Max == 0 ? None : Optional(It.second.Max); + Attrs.push_back(Attribute::get(Ctx, AK, OptVal)); + } return AttrsSize != Attrs.size(); }