Skip to content

Commit d2cc6c2

Browse files
author
Serge Guelton
committed
Use a sorted array instead of a map to store AttrBuilder string attributes
Using and std::map<SmallString, SmallString> for target dependent attributes is inefficient: it makes its constructor slightly heavier, and involves extra allocation for each new string attribute. Storing the attribute key/value as strings implies extra allocation/copy step. Use a sorted vector instead. Given the low number of attributes generally involved, this is cheaper, as showcased by https://llvm-compile-time-tracker.com/compare.php?from=5de322295f4ade692dc4f1823ae4450ad3c48af2&to=05bc480bf641a9e3b466619af43a2d123ee3f71d&stat=instructions Differential Revision: https://reviews.llvm.org/D116599
1 parent 2c0fb96 commit d2cc6c2

32 files changed

+163
-143
lines changed

clang/lib/CodeGen/CGAtomic.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ static RValue emitAtomicLibcall(CodeGenFunction &CGF,
307307
const CGFunctionInfo &fnInfo =
308308
CGF.CGM.getTypes().arrangeBuiltinFunctionCall(resultType, args);
309309
llvm::FunctionType *fnTy = CGF.CGM.getTypes().GetFunctionType(fnInfo);
310-
llvm::AttrBuilder fnAttrB;
310+
llvm::AttrBuilder fnAttrB(CGF.getLLVMContext());
311311
fnAttrB.addAttribute(llvm::Attribute::NoUnwind);
312312
fnAttrB.addAttribute(llvm::Attribute::WillReturn);
313313
llvm::AttributeList fnAttrs = llvm::AttributeList::get(

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4925,7 +4925,7 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
49254925
llvm::Value *Block =
49264926
Builder.CreatePointerCast(Info.BlockArg, GenericVoidPtrTy);
49274927

4928-
AttrBuilder B;
4928+
AttrBuilder B(Builder.getContext());
49294929
B.addByValAttr(NDRangeL.getAddress(*this).getElementType());
49304930
llvm::AttributeList ByValAttrSet =
49314931
llvm::AttributeList::get(CGM.getModule().getContext(), 3U, B);

clang/lib/CodeGen/CGCall.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1892,7 +1892,7 @@ void CodeGenModule::getDefaultFunctionAttributes(StringRef Name,
18921892
}
18931893

18941894
void CodeGenModule::addDefaultFunctionDefinitionAttributes(llvm::Function &F) {
1895-
llvm::AttrBuilder FuncAttrs;
1895+
llvm::AttrBuilder FuncAttrs(F.getContext());
18961896
getDefaultFunctionAttributes(F.getName(), F.hasOptNone(),
18971897
/* AttrOnCallSite = */ false, FuncAttrs);
18981898
// TODO: call GetCPUAndFeaturesAttributes?
@@ -2014,8 +2014,8 @@ void CodeGenModule::ConstructAttributeList(StringRef Name,
20142014
llvm::AttributeList &AttrList,
20152015
unsigned &CallingConv,
20162016
bool AttrOnCallSite, bool IsThunk) {
2017-
llvm::AttrBuilder FuncAttrs;
2018-
llvm::AttrBuilder RetAttrs;
2017+
llvm::AttrBuilder FuncAttrs(getLLVMContext());
2018+
llvm::AttrBuilder RetAttrs(getLLVMContext());
20192019

20202020
// Collect function IR attributes from the CC lowering.
20212021
// We'll collect the paramete and result attributes later.
@@ -2302,7 +2302,7 @@ void CodeGenModule::ConstructAttributeList(StringRef Name,
23022302

23032303
// Attach attributes to sret.
23042304
if (IRFunctionArgs.hasSRetArg()) {
2305-
llvm::AttrBuilder SRETAttrs;
2305+
llvm::AttrBuilder SRETAttrs(getLLVMContext());
23062306
SRETAttrs.addStructRetAttr(getTypes().ConvertTypeForMem(RetTy));
23072307
hasUsedSRet = true;
23082308
if (RetAI.getInReg())
@@ -2314,7 +2314,7 @@ void CodeGenModule::ConstructAttributeList(StringRef Name,
23142314

23152315
// Attach attributes to inalloca argument.
23162316
if (IRFunctionArgs.hasInallocaArg()) {
2317-
llvm::AttrBuilder Attrs;
2317+
llvm::AttrBuilder Attrs(getLLVMContext());
23182318
Attrs.addInAllocaAttr(FI.getArgStruct());
23192319
ArgAttrs[IRFunctionArgs.getInallocaArgNo()] =
23202320
llvm::AttributeSet::get(getLLVMContext(), Attrs);
@@ -2329,7 +2329,7 @@ void CodeGenModule::ConstructAttributeList(StringRef Name,
23292329

23302330
assert(IRArgs.second == 1 && "Expected only a single `this` pointer.");
23312331

2332-
llvm::AttrBuilder Attrs;
2332+
llvm::AttrBuilder Attrs(getLLVMContext());
23332333

23342334
QualType ThisTy =
23352335
FI.arg_begin()->type.castAs<PointerType>()->getPointeeType();
@@ -2364,15 +2364,15 @@ void CodeGenModule::ConstructAttributeList(StringRef Name,
23642364
I != E; ++I, ++ArgNo) {
23652365
QualType ParamType = I->type;
23662366
const ABIArgInfo &AI = I->info;
2367-
llvm::AttrBuilder Attrs;
2367+
llvm::AttrBuilder Attrs(getLLVMContext());
23682368

23692369
// Add attribute for padding argument, if necessary.
23702370
if (IRFunctionArgs.hasPaddingArg(ArgNo)) {
23712371
if (AI.getPaddingInReg()) {
23722372
ArgAttrs[IRFunctionArgs.getPaddingArgNo(ArgNo)] =
23732373
llvm::AttributeSet::get(
23742374
getLLVMContext(),
2375-
llvm::AttrBuilder().addAttribute(llvm::Attribute::InReg));
2375+
llvm::AttrBuilder(getLLVMContext()).addAttribute(llvm::Attribute::InReg));
23762376
}
23772377
}
23782378

@@ -2747,11 +2747,11 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
27472747
QualType ETy = ArrTy->getElementType();
27482748
llvm::Align Alignment =
27492749
CGM.getNaturalTypeAlignment(ETy).getAsAlign();
2750-
AI->addAttrs(llvm::AttrBuilder().addAlignmentAttr(Alignment));
2750+
AI->addAttrs(llvm::AttrBuilder(getLLVMContext()).addAlignmentAttr(Alignment));
27512751
uint64_t ArrSize = ArrTy->getSize().getZExtValue();
27522752
if (!ETy->isIncompleteType() && ETy->isConstantSizeType() &&
27532753
ArrSize) {
2754-
llvm::AttrBuilder Attrs;
2754+
llvm::AttrBuilder Attrs(getLLVMContext());
27552755
Attrs.addDereferenceableAttr(
27562756
getContext().getTypeSizeInChars(ETy).getQuantity() *
27572757
ArrSize);
@@ -2771,7 +2771,7 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
27712771
QualType ETy = ArrTy->getElementType();
27722772
llvm::Align Alignment =
27732773
CGM.getNaturalTypeAlignment(ETy).getAsAlign();
2774-
AI->addAttrs(llvm::AttrBuilder().addAlignmentAttr(Alignment));
2774+
AI->addAttrs(llvm::AttrBuilder(getLLVMContext()).addAlignmentAttr(Alignment));
27752775
if (!getContext().getTargetAddressSpace(ETy) &&
27762776
!CGM.getCodeGenOpts().NullPointerIsValid)
27772777
AI->addAttr(llvm::Attribute::NonNull);
@@ -2793,7 +2793,7 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI,
27932793
AlignmentCI->getLimitedValue(llvm::Value::MaximumAlignment);
27942794
if (AI->getParamAlign().valueOrOne() < AlignmentInt) {
27952795
AI->removeAttr(llvm::Attribute::AttrKind::Alignment);
2796-
AI->addAttrs(llvm::AttrBuilder().addAlignmentAttr(
2796+
AI->addAttrs(llvm::AttrBuilder(getLLVMContext()).addAlignmentAttr(
27972797
llvm::Align(AlignmentInt)));
27982798
}
27992799
}

clang/lib/CodeGen/CGExpr.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3178,7 +3178,7 @@ static void emitCheckHandlerCall(CodeGenFunction &CGF,
31783178
bool MayReturn =
31793179
!IsFatal || RecoverKind == CheckRecoverableKind::AlwaysRecoverable;
31803180

3181-
llvm::AttrBuilder B;
3181+
llvm::AttrBuilder B(CGF.getLLVMContext());
31823182
if (!MayReturn) {
31833183
B.addAttribute(llvm::Attribute::NoReturn)
31843184
.addAttribute(llvm::Attribute::NoUnwind);

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1819,7 +1819,7 @@ CodeGenModule::getMostBaseClasses(const CXXRecordDecl *RD) {
18191819

18201820
void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D,
18211821
llvm::Function *F) {
1822-
llvm::AttrBuilder B;
1822+
llvm::AttrBuilder B(F->getContext());
18231823

18241824
if (CodeGenOpts.UnwindTables)
18251825
B.addAttribute(llvm::Attribute::UWTable);
@@ -1982,7 +1982,7 @@ void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D,
19821982
void CodeGenModule::setLLVMFunctionFEnvAttributes(const FunctionDecl *D,
19831983
llvm::Function *F) {
19841984
if (D->hasAttr<StrictFPAttr>()) {
1985-
llvm::AttrBuilder FuncAttrs;
1985+
llvm::AttrBuilder FuncAttrs(F->getContext());
19861986
FuncAttrs.addAttribute("strictfp");
19871987
F->addFnAttrs(FuncAttrs);
19881988
}
@@ -2092,7 +2092,7 @@ void CodeGenModule::setNonAliasAttributes(GlobalDecl GD,
20922092
if (!D->getAttr<SectionAttr>())
20932093
F->addFnAttr("implicit-section-name", SA->getName());
20942094

2095-
llvm::AttrBuilder Attrs;
2095+
llvm::AttrBuilder Attrs(F->getContext());
20962096
if (GetCPUAndFeaturesAttributes(GD, Attrs)) {
20972097
// We know that GetCPUAndFeaturesAttributes will always have the
20982098
// newest set, since it has the newest possible FunctionDecl, so the
@@ -3785,7 +3785,7 @@ llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
37853785
if (D)
37863786
SetFunctionAttributes(GD, F, IsIncompleteFunction, IsThunk);
37873787
if (ExtraAttrs.hasFnAttrs()) {
3788-
llvm::AttrBuilder B(ExtraAttrs, llvm::AttributeList::FunctionIndex);
3788+
llvm::AttrBuilder B(F->getContext(), ExtraAttrs, llvm::AttributeList::FunctionIndex);
37893789
F->addFnAttrs(B);
37903790
}
37913791

clang/lib/CodeGen/TargetInfo.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -855,19 +855,19 @@ class WebAssemblyTargetCodeGenInfo final : public TargetCodeGenInfo {
855855
if (const auto *FD = dyn_cast_or_null<FunctionDecl>(D)) {
856856
if (const auto *Attr = FD->getAttr<WebAssemblyImportModuleAttr>()) {
857857
llvm::Function *Fn = cast<llvm::Function>(GV);
858-
llvm::AttrBuilder B;
858+
llvm::AttrBuilder B(GV->getContext());
859859
B.addAttribute("wasm-import-module", Attr->getImportModule());
860860
Fn->addFnAttrs(B);
861861
}
862862
if (const auto *Attr = FD->getAttr<WebAssemblyImportNameAttr>()) {
863863
llvm::Function *Fn = cast<llvm::Function>(GV);
864-
llvm::AttrBuilder B;
864+
llvm::AttrBuilder B(GV->getContext());
865865
B.addAttribute("wasm-import-name", Attr->getImportName());
866866
Fn->addFnAttrs(B);
867867
}
868868
if (const auto *Attr = FD->getAttr<WebAssemblyExportNameAttr>()) {
869869
llvm::Function *Fn = cast<llvm::Function>(GV);
870-
llvm::AttrBuilder B;
870+
llvm::AttrBuilder B(GV->getContext());
871871
B.addAttribute("wasm-export-name", Attr->getExportName());
872872
Fn->addFnAttrs(B);
873873
}
@@ -6414,7 +6414,7 @@ class ARMTargetCodeGenInfo : public TargetCodeGenInfo {
64146414
// AAPCS guarantees that sp will be 8-byte aligned on any public interface,
64156415
// however this is not necessarily true on taking any interrupt. Instruct
64166416
// the backend to perform a realignment as part of the function prologue.
6417-
llvm::AttrBuilder B;
6417+
llvm::AttrBuilder B(Fn->getContext());
64186418
B.addStackAlignmentAttr(8);
64196419
Fn->addFnAttrs(B);
64206420
}

llvm/include/llvm/CodeGen/IndirectThunks.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ void ThunkInserter<Derived>::createThunkFunction(MachineModuleInfo &MMI,
5959

6060
// Add Attributes so that we don't create a frame, unwind information, or
6161
// inline.
62-
AttrBuilder B;
62+
AttrBuilder B(Ctx);
6363
B.addAttribute(llvm::Attribute::NoUnwind);
6464
B.addAttribute(llvm::Attribute::Naked);
6565
F->addFnAttrs(B);

llvm/include/llvm/IR/Attributes.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -996,25 +996,26 @@ class AttributeMask {
996996
/// value, however, is not. So this can be used as a quick way to test for
997997
/// equality, presence of attributes, etc.
998998
class AttrBuilder {
999+
LLVMContext &Ctx;
9991000
std::bitset<Attribute::EndAttrKinds> Attrs;
1000-
std::map<SmallString<32>, SmallString<32>, std::less<>> TargetDepAttrs;
1001+
SmallVector<Attribute, 8> TargetDepAttrs;
10011002
std::array<uint64_t, Attribute::NumIntAttrKinds> IntAttrs = {};
10021003
std::array<Type *, Attribute::NumTypeAttrKinds> TypeAttrs = {};
10031004

10041005
Optional<unsigned> kindToIntIndex(Attribute::AttrKind Kind) const;
10051006
Optional<unsigned> kindToTypeIndex(Attribute::AttrKind Kind) const;
10061007

10071008
public:
1008-
AttrBuilder() = default;
1009+
AttrBuilder(LLVMContext &Ctx) : Ctx(Ctx) {}
10091010
AttrBuilder(const AttrBuilder &) = delete;
10101011
AttrBuilder(AttrBuilder &&) = default;
10111012

1012-
AttrBuilder(const Attribute &A) {
1013+
AttrBuilder(LLVMContext &Ctx, const Attribute &A) : Ctx(Ctx) {
10131014
addAttribute(A);
10141015
}
10151016

1016-
AttrBuilder(AttributeList AS, unsigned Idx);
1017-
AttrBuilder(AttributeSet AS);
1017+
AttrBuilder(LLVMContext &Ctx, AttributeList AS, unsigned Idx);
1018+
AttrBuilder(LLVMContext &Ctx, AttributeSet AS);
10181019

10191020
void clear();
10201021

llvm/lib/AsmParser/LLParser.cpp

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -133,14 +133,17 @@ bool LLParser::validateEndOfModule(bool UpgradeDebugInfo) {
133133
for (const auto &RAG : ForwardRefAttrGroups) {
134134
Value *V = RAG.first;
135135
const std::vector<unsigned> &Attrs = RAG.second;
136-
AttrBuilder B;
136+
AttrBuilder B(Context);
137137

138-
for (const auto &Attr : Attrs)
139-
B.merge(NumberedAttrBuilders[Attr]);
138+
for (const auto &Attr : Attrs) {
139+
auto R = NumberedAttrBuilders.find(Attr);
140+
if (R != NumberedAttrBuilders.end())
141+
B.merge(R->second);
142+
}
140143

141144
if (Function *Fn = dyn_cast<Function>(V)) {
142145
AttributeList AS = Fn->getAttributes();
143-
AttrBuilder FnAttrs(AS.getFnAttrs());
146+
AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
144147
AS = AS.removeFnAttributes(Context);
145148

146149
FnAttrs.merge(B);
@@ -156,27 +159,27 @@ bool LLParser::validateEndOfModule(bool UpgradeDebugInfo) {
156159
Fn->setAttributes(AS);
157160
} else if (CallInst *CI = dyn_cast<CallInst>(V)) {
158161
AttributeList AS = CI->getAttributes();
159-
AttrBuilder FnAttrs(AS.getFnAttrs());
162+
AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
160163
AS = AS.removeFnAttributes(Context);
161164
FnAttrs.merge(B);
162165
AS = AS.addFnAttributes(Context, FnAttrs);
163166
CI->setAttributes(AS);
164167
} else if (InvokeInst *II = dyn_cast<InvokeInst>(V)) {
165168
AttributeList AS = II->getAttributes();
166-
AttrBuilder FnAttrs(AS.getFnAttrs());
169+
AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
167170
AS = AS.removeFnAttributes(Context);
168171
FnAttrs.merge(B);
169172
AS = AS.addFnAttributes(Context, FnAttrs);
170173
II->setAttributes(AS);
171174
} else if (CallBrInst *CBI = dyn_cast<CallBrInst>(V)) {
172175
AttributeList AS = CBI->getAttributes();
173-
AttrBuilder FnAttrs(AS.getFnAttrs());
176+
AttrBuilder FnAttrs(M->getContext(), AS.getFnAttrs());
174177
AS = AS.removeFnAttributes(Context);
175178
FnAttrs.merge(B);
176179
AS = AS.addFnAttributes(Context, FnAttrs);
177180
CBI->setAttributes(AS);
178181
} else if (auto *GV = dyn_cast<GlobalVariable>(V)) {
179-
AttrBuilder Attrs(GV->getAttributes());
182+
AttrBuilder Attrs(M->getContext(), GV->getAttributes());
180183
Attrs.merge(B);
181184
GV->setAttributes(AttributeSet::get(Context,Attrs));
182185
} else {
@@ -1206,7 +1209,7 @@ bool LLParser::parseGlobal(const std::string &Name, LocTy NameLoc,
12061209
}
12071210
}
12081211

1209-
AttrBuilder Attrs;
1212+
AttrBuilder Attrs(M->getContext());
12101213
LocTy BuiltinLoc;
12111214
std::vector<unsigned> FwdRefAttrGrps;
12121215
if (parseFnAttributeValuePairs(Attrs, FwdRefAttrGrps, false, BuiltinLoc))
@@ -1235,13 +1238,18 @@ bool LLParser::parseUnnamedAttrGrp() {
12351238
Lex.Lex();
12361239

12371240
if (parseToken(lltok::equal, "expected '=' here") ||
1238-
parseToken(lltok::lbrace, "expected '{' here") ||
1239-
parseFnAttributeValuePairs(NumberedAttrBuilders[VarID], unused, true,
1240-
BuiltinLoc) ||
1241+
parseToken(lltok::lbrace, "expected '{' here"))
1242+
return true;
1243+
1244+
auto R = NumberedAttrBuilders.find(VarID);
1245+
if (R == NumberedAttrBuilders.end())
1246+
R = NumberedAttrBuilders.emplace(VarID, AttrBuilder(M->getContext())).first;
1247+
1248+
if (parseFnAttributeValuePairs(R->second, unused, true, BuiltinLoc) ||
12411249
parseToken(lltok::rbrace, "expected end of attribute group"))
12421250
return true;
12431251

1244-
if (!NumberedAttrBuilders[VarID].hasAttributes())
1252+
if (!R->second.hasAttributes())
12451253
return error(AttrGrpLoc, "attribute group has no attributes");
12461254

12471255
return false;
@@ -2372,11 +2380,12 @@ bool LLParser::parseParameterList(SmallVectorImpl<ParamInfo> &ArgList,
23722380
// parse the argument.
23732381
LocTy ArgLoc;
23742382
Type *ArgTy = nullptr;
2375-
AttrBuilder ArgAttrs;
23762383
Value *V;
23772384
if (parseType(ArgTy, ArgLoc))
23782385
return true;
23792386

2387+
AttrBuilder ArgAttrs(M->getContext());
2388+
23802389
if (ArgTy->isMetadataTy()) {
23812390
if (parseMetadataAsValue(V, PFS))
23822391
return true;
@@ -2493,7 +2502,7 @@ bool LLParser::parseArgumentList(SmallVectorImpl<ArgInfo> &ArgList,
24932502
} else {
24942503
LocTy TypeLoc = Lex.getLoc();
24952504
Type *ArgTy = nullptr;
2496-
AttrBuilder Attrs;
2505+
AttrBuilder Attrs(M->getContext());
24972506
std::string Name;
24982507

24992508
if (parseType(ArgTy) || parseOptionalParamAttrs(Attrs))
@@ -5462,7 +5471,7 @@ bool LLParser::parseFunctionHeader(Function *&Fn, bool IsDefine) {
54625471
unsigned Visibility;
54635472
unsigned DLLStorageClass;
54645473
bool DSOLocal;
5465-
AttrBuilder RetAttrs;
5474+
AttrBuilder RetAttrs(M->getContext());
54665475
unsigned CC;
54675476
bool HasLinkage;
54685477
Type *RetType = nullptr;
@@ -5525,7 +5534,7 @@ bool LLParser::parseFunctionHeader(Function *&Fn, bool IsDefine) {
55255534

55265535
SmallVector<ArgInfo, 8> ArgList;
55275536
bool IsVarArg;
5528-
AttrBuilder FuncAttrs;
5537+
AttrBuilder FuncAttrs(M->getContext());
55295538
std::vector<unsigned> FwdRefAttrGrps;
55305539
LocTy BuiltinLoc;
55315540
std::string Section;
@@ -6248,7 +6257,7 @@ bool LLParser::parseIndirectBr(Instruction *&Inst, PerFunctionState &PFS) {
62486257
/// OptionalAttrs 'to' TypeAndValue 'unwind' TypeAndValue
62496258
bool LLParser::parseInvoke(Instruction *&Inst, PerFunctionState &PFS) {
62506259
LocTy CallLoc = Lex.getLoc();
6251-
AttrBuilder RetAttrs, FnAttrs;
6260+
AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
62526261
std::vector<unsigned> FwdRefAttrGrps;
62536262
LocTy NoBuiltinLoc;
62546263
unsigned CC;
@@ -6558,7 +6567,7 @@ bool LLParser::parseUnaryOp(Instruction *&Inst, PerFunctionState &PFS,
65586567
/// '[' LabelList ']'
65596568
bool LLParser::parseCallBr(Instruction *&Inst, PerFunctionState &PFS) {
65606569
LocTy CallLoc = Lex.getLoc();
6561-
AttrBuilder RetAttrs, FnAttrs;
6570+
AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
65626571
std::vector<unsigned> FwdRefAttrGrps;
65636572
LocTy NoBuiltinLoc;
65646573
unsigned CC;
@@ -6975,7 +6984,7 @@ bool LLParser::parseFreeze(Instruction *&Inst, PerFunctionState &PFS) {
69756984
/// OptionalAttrs Type Value ParameterList OptionalAttrs
69766985
bool LLParser::parseCall(Instruction *&Inst, PerFunctionState &PFS,
69776986
CallInst::TailCallKind TCK) {
6978-
AttrBuilder RetAttrs, FnAttrs;
6987+
AttrBuilder RetAttrs(M->getContext()), FnAttrs(M->getContext());
69796988
std::vector<unsigned> FwdRefAttrGrps;
69806989
LocTy BuiltinLoc;
69816990
unsigned CallAddrSpace;

0 commit comments

Comments
 (0)