From 3ae2d8fa736a2e279b6cf55d5ab2fdcbe4d86fb6 Mon Sep 17 00:00:00 2001 From: Guillaume Chatelet Date: Tue, 15 Oct 2019 11:24:36 +0000 Subject: [PATCH] [Alignment][NFC] Remove dependency on GlobalObject::setAlignment(unsigned) Summary: This is patch is part of a series to introduce an Alignment type. See this thread for context: http://lists.llvm.org/pipermail/llvm-dev/2019-July/133851.html See this patch for the introduction of the type: https://reviews.llvm.org/D64790 Reviewers: courbet Subscribers: arsenm, mehdi_amini, jvesely, nhaehnle, hiraditya, steven_wu, dexonsmith, dang, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D68944 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374880 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/IR/GlobalObject.h | 3 +- include/llvm/LTO/LTO.h | 2 +- lib/AsmParser/LLParser.cpp | 6 ++-- lib/Bitcode/Reader/BitcodeReader.cpp | 34 ++++++++++++---------- lib/CodeGen/CodeGenPrepare.cpp | 2 +- lib/CodeGen/GlobalMerge.cpp | 8 ++--- lib/CodeGen/LowerEmuTLS.cpp | 7 ++--- lib/ExecutionEngine/Orc/Speculation.cpp | 2 +- lib/IR/Core.cpp | 2 +- lib/IR/Globals.cpp | 2 +- lib/IR/IRBuilder.cpp | 2 +- lib/LTO/LTO.cpp | 3 +- lib/Linker/IRMover.cpp | 2 +- lib/Linker/LinkModules.cpp | 3 +- lib/Target/AMDGPU/AMDGPUPromoteAlloca.cpp | 2 +- lib/Transforms/IPO/ConstantMerge.cpp | 2 +- lib/Transforms/IPO/CrossDSOCFI.cpp | 2 +- lib/Transforms/IPO/GlobalOpt.cpp | 8 ++--- lib/Transforms/IPO/LowerTypeTests.cpp | 14 ++++----- lib/Transforms/IPO/MergeFunctions.cpp | 4 +-- lib/Transforms/IPO/WholeProgramDevirt.cpp | 11 +++---- .../Instrumentation/AddressSanitizer.cpp | 8 ++--- .../Instrumentation/HWAddressSanitizer.cpp | 4 +-- lib/Transforms/Instrumentation/InstrProfiling.cpp | 8 ++--- lib/Transforms/Instrumentation/Instrumentation.cpp | 3 +- .../Instrumentation/SanitizerCoverage.cpp | 5 ++-- lib/Transforms/Scalar/LoopIdiomRecognize.cpp | 2 +- lib/Transforms/Utils/Local.cpp | 2 +- lib/Transforms/Utils/SimplifyCFG.cpp | 2 +- unittests/IR/ConstantsTest.cpp | 14 +++++---- unittests/IR/FunctionTest.cpp | 2 +- unittests/IR/ValueTest.cpp | 7 ++--- 32 files changed, 94 insertions(+), 84 deletions(-) diff --git a/include/llvm/IR/GlobalObject.h b/include/llvm/IR/GlobalObject.h index a47faac5d41..739ef75dd8b 100644 --- a/include/llvm/IR/GlobalObject.h +++ b/include/llvm/IR/GlobalObject.h @@ -64,7 +64,8 @@ public: } /// FIXME: Remove this setter once the migration to MaybeAlign is over. - void setAlignment(unsigned Align); + LLVM_ATTRIBUTE_DEPRECATED(void setAlignment(unsigned Align), + "Please use `void setAlignment(MaybeAlign Align)`"); void setAlignment(MaybeAlign Align); unsigned getGlobalObjectSubClassData() const { diff --git a/include/llvm/LTO/LTO.h b/include/llvm/LTO/LTO.h index 407af5e8de5..0a1e3e1d0e4 100644 --- a/include/llvm/LTO/LTO.h +++ b/include/llvm/LTO/LTO.h @@ -309,7 +309,7 @@ private: RegularLTOState(unsigned ParallelCodeGenParallelismLevel, Config &Conf); struct CommonResolution { uint64_t Size = 0; - unsigned Align = 0; + MaybeAlign Align; /// Record if at least one instance of the common was marked as prevailing bool Prevailing = false; }; diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index 9bb3ca145c2..7a269efec75 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -140,7 +140,7 @@ bool LLParser::ValidateEndOfModule() { // If the alignment was parsed as an attribute, move to the alignment // field. if (FnAttrs.hasAlignmentAttr()) { - Fn->setAlignment(FnAttrs.getAlignment()); + Fn->setAlignment(MaybeAlign(FnAttrs.getAlignment())); FnAttrs.removeAttribute(Attribute::Alignment); } @@ -1124,7 +1124,7 @@ bool LLParser::ParseGlobal(const std::string &Name, LocTy NameLoc, } else if (Lex.getKind() == lltok::kw_align) { unsigned Alignment; if (ParseOptionalAlignment(Alignment)) return true; - GV->setAlignment(Alignment); + GV->setAlignment(MaybeAlign(Alignment)); } else if (Lex.getKind() == lltok::MetadataVar) { if (ParseGlobalObjectMetadataAttachment(*GV)) return true; @@ -5487,7 +5487,7 @@ bool LLParser::ParseFunctionHeader(Function *&Fn, bool isDefine) { Fn->setCallingConv(CC); Fn->setAttributes(PAL); Fn->setUnnamedAddr(UnnamedAddr); - Fn->setAlignment(Alignment); + Fn->setAlignment(MaybeAlign(Alignment)); Fn->setSection(Section); Fn->setPartition(Partition); Fn->setComdat(C); diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index 9bf3947b111..9caeba54b38 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -722,7 +722,7 @@ private: /// Converts alignment exponent (i.e. power of two (or zero)) to the /// corresponding alignment to use. If alignment is too large, returns /// a corresponding error code. - Error parseAlignmentValue(uint64_t Exponent, unsigned &Alignment); + Error parseAlignmentValue(uint64_t Exponent, MaybeAlign &Alignment); Error parseAttrKind(uint64_t Code, Attribute::AttrKind *Kind); Error parseModule(uint64_t ResumeBit, bool ShouldLazyLoadMetadata = false); @@ -1544,12 +1544,12 @@ static Attribute::AttrKind getAttrFromCode(uint64_t Code) { } Error BitcodeReader::parseAlignmentValue(uint64_t Exponent, - unsigned &Alignment) { + MaybeAlign &Alignment) { // Note: Alignment in bitcode files is incremented by 1, so that zero // can be used for default alignment. if (Exponent > Value::MaxAlignmentExponent + 1) return error("Invalid alignment value"); - Alignment = (1 << static_cast(Exponent)) >> 1; + Alignment = decodeMaybeAlign(Exponent); return Error::success(); } @@ -3112,7 +3112,7 @@ Error BitcodeReader::parseGlobalVarRecord(ArrayRef Record) { uint64_t RawLinkage = Record[3]; GlobalValue::LinkageTypes Linkage = getDecodedLinkage(RawLinkage); - unsigned Alignment; + MaybeAlign Alignment; if (Error Err = parseAlignmentValue(Record[4], Alignment)) return Err; std::string Section; @@ -3243,7 +3243,7 @@ Error BitcodeReader::parseFunctionRecord(ArrayRef Record) { Context, getPointerElementFlatType(PTy))); } - unsigned Alignment; + MaybeAlign Alignment; if (Error Err = parseAlignmentValue(Record[5], Alignment)) return Err; Func->setAlignment(Alignment); @@ -4750,7 +4750,7 @@ Error BitcodeReader::parseFunctionBody(Function *F) { } Type *OpTy = getTypeByID(Record[1]); Value *Size = getFnValueByID(Record[2], OpTy); - unsigned Align; + MaybeAlign Align; if (Error Err = parseAlignmentValue(AlignRecord & ~FlagMask, Align)) { return Err; } @@ -4761,7 +4761,7 @@ Error BitcodeReader::parseFunctionBody(Function *F) { const DataLayout &DL = TheModule->getDataLayout(); unsigned AS = DL.getAllocaAddrSpace(); - AllocaInst *AI = new AllocaInst(Ty, AS, Size, Align); + AllocaInst *AI = new AllocaInst(Ty, AS, Size, Align ? Align->value() : 0); AI->setUsedWithInAlloca(InAlloca); AI->setSwiftError(SwiftError); I = AI; @@ -4789,10 +4789,11 @@ Error BitcodeReader::parseFunctionBody(Function *F) { if (Error Err = typeCheckLoadStoreInst(Ty, Op->getType())) return Err; - unsigned Align; + MaybeAlign Align; if (Error Err = parseAlignmentValue(Record[OpNum], Align)) return Err; - I = new LoadInst(Ty, Op, "", Record[OpNum + 1], Align); + I = new LoadInst(Ty, Op, "", Record[OpNum + 1], + Align ? Align->value() : 0); InstructionList.push_back(I); break; } @@ -4826,10 +4827,11 @@ Error BitcodeReader::parseFunctionBody(Function *F) { return error("Invalid record"); SyncScope::ID SSID = getDecodedSyncScopeID(Record[OpNum + 3]); - unsigned Align; + MaybeAlign Align; if (Error Err = parseAlignmentValue(Record[OpNum], Align)) return Err; - I = new LoadInst(Ty, Op, "", Record[OpNum + 1], Align, Ordering, SSID); + I = new LoadInst(Ty, Op, "", Record[OpNum + 1], + Align ? Align->value() : 0, Ordering, SSID); InstructionList.push_back(I); break; } @@ -4848,10 +4850,11 @@ Error BitcodeReader::parseFunctionBody(Function *F) { if (Error Err = typeCheckLoadStoreInst(Val->getType(), Ptr->getType())) return Err; - unsigned Align; + MaybeAlign Align; if (Error Err = parseAlignmentValue(Record[OpNum], Align)) return Err; - I = new StoreInst(Val, Ptr, Record[OpNum+1], Align); + I = new StoreInst(Val, Ptr, Record[OpNum + 1], + Align ? Align->value() : 0); InstructionList.push_back(I); break; } @@ -4881,10 +4884,11 @@ Error BitcodeReader::parseFunctionBody(Function *F) { if (Ordering != AtomicOrdering::NotAtomic && Record[OpNum] == 0) return error("Invalid record"); - unsigned Align; + MaybeAlign Align; if (Error Err = parseAlignmentValue(Record[OpNum], Align)) return Err; - I = new StoreInst(Val, Ptr, Record[OpNum+1], Align, Ordering, SSID); + I = new StoreInst(Val, Ptr, Record[OpNum + 1], Align ? Align->value() : 0, + Ordering, SSID); InstructionList.push_back(I); break; } diff --git a/lib/CodeGen/CodeGenPrepare.cpp b/lib/CodeGen/CodeGenPrepare.cpp index 061c8e51a99..fa4432ea23e 100644 --- a/lib/CodeGen/CodeGenPrepare.cpp +++ b/lib/CodeGen/CodeGenPrepare.cpp @@ -1822,7 +1822,7 @@ bool CodeGenPrepare::optimizeCallInst(CallInst *CI, bool &ModifiedDT) { GV->getPointerAlignment(*DL) < PrefAlign && DL->getTypeAllocSize(GV->getValueType()) >= MinSize + Offset2) - GV->setAlignment(PrefAlign); + GV->setAlignment(MaybeAlign(PrefAlign)); } // If this is a memcpy (or similar) then we may be able to improve the // alignment diff --git a/lib/CodeGen/GlobalMerge.cpp b/lib/CodeGen/GlobalMerge.cpp index 09201c2e7ba..d4fa45fcb40 100644 --- a/lib/CodeGen/GlobalMerge.cpp +++ b/lib/CodeGen/GlobalMerge.cpp @@ -456,14 +456,14 @@ bool GlobalMerge::doMerge(const SmallVectorImpl &Globals, bool HasExternal = false; StringRef FirstExternalName; - unsigned MaxAlign = 1; + Align MaxAlign; unsigned CurIdx = 0; for (j = i; j != -1; j = GlobalSet.find_next(j)) { Type *Ty = Globals[j]->getValueType(); // Make sure we use the same alignment AsmPrinter would use. - unsigned Align = DL.getPreferredAlignment(Globals[j]); - unsigned Padding = alignTo(MergedSize, Align) - MergedSize; + Align Alignment(DL.getPreferredAlignment(Globals[j])); + unsigned Padding = alignTo(MergedSize, Alignment) - MergedSize; MergedSize += Padding; MergedSize += DL.getTypeAllocSize(Ty); if (MergedSize > MaxOffset) { @@ -478,7 +478,7 @@ bool GlobalMerge::doMerge(const SmallVectorImpl &Globals, Inits.push_back(Globals[j]->getInitializer()); StructIdxs.push_back(CurIdx++); - MaxAlign = std::max(MaxAlign, Align); + MaxAlign = std::max(MaxAlign, Alignment); if (Globals[j]->hasExternalLinkage() && !HasExternal) { HasExternal = true; diff --git a/lib/CodeGen/LowerEmuTLS.cpp b/lib/CodeGen/LowerEmuTLS.cpp index c8cf6abda4f..ed48365b010 100644 --- a/lib/CodeGen/LowerEmuTLS.cpp +++ b/lib/CodeGen/LowerEmuTLS.cpp @@ -142,7 +142,7 @@ bool LowerEmuTLS::addEmuTlsVar(Module &M, const GlobalVariable *GV) { assert(EmuTlsTmplVar && "Failed to create emualted TLS initializer"); EmuTlsTmplVar->setConstant(true); EmuTlsTmplVar->setInitializer(const_cast(InitValue)); - EmuTlsTmplVar->setAlignment(GVAlignment); + EmuTlsTmplVar->setAlignment(Align(GVAlignment)); copyLinkageVisibility(M, GV, EmuTlsTmplVar); } @@ -155,9 +155,8 @@ bool LowerEmuTLS::addEmuTlsVar(Module &M, const GlobalVariable *GV) { ArrayRef ElementValueArray(ElementValues, 4); EmuTlsVar->setInitializer( ConstantStruct::get(EmuTlsVarType, ElementValueArray)); - unsigned MaxAlignment = std::max( - DL.getABITypeAlignment(WordType), - DL.getABITypeAlignment(VoidPtrType)); + Align MaxAlignment(std::max(DL.getABITypeAlignment(WordType), + DL.getABITypeAlignment(VoidPtrType))); EmuTlsVar->setAlignment(MaxAlignment); return true; } diff --git a/lib/ExecutionEngine/Orc/Speculation.cpp b/lib/ExecutionEngine/Orc/Speculation.cpp index 4f2ea92706c..f29201c147a 100644 --- a/lib/ExecutionEngine/Orc/Speculation.cpp +++ b/lib/ExecutionEngine/Orc/Speculation.cpp @@ -96,7 +96,7 @@ void IRSpeculationLayer::emit(MaterializationResponsibility R, M, LoadValueTy, false, GlobalValue::LinkageTypes::InternalLinkage, ConstantInt::get(LoadValueTy, 0), "__orc_speculate.guard.for." + Fn.getName()); - SpeculatorGuard->setAlignment(1); + SpeculatorGuard->setAlignment(Align::None()); SpeculatorGuard->setUnnamedAddr(GlobalValue::UnnamedAddr::Local); BasicBlock &ProgramEntry = Fn.getEntryBlock(); diff --git a/lib/IR/Core.cpp b/lib/IR/Core.cpp index c548c56211a..afa73b33cd1 100644 --- a/lib/IR/Core.cpp +++ b/lib/IR/Core.cpp @@ -2008,7 +2008,7 @@ unsigned LLVMGetAlignment(LLVMValueRef V) { void LLVMSetAlignment(LLVMValueRef V, unsigned Bytes) { Value *P = unwrap(V); if (GlobalObject *GV = dyn_cast(P)) - GV->setAlignment(Bytes); + GV->setAlignment(MaybeAlign(Bytes)); else if (AllocaInst *AI = dyn_cast(P)) AI->setAlignment(MaybeAlign(Bytes)); else if (LoadInst *LI = dyn_cast(P)) diff --git a/lib/IR/Globals.cpp b/lib/IR/Globals.cpp index 8b6b36e8091..46a9696b294 100644 --- a/lib/IR/Globals.cpp +++ b/lib/IR/Globals.cpp @@ -129,7 +129,7 @@ void GlobalObject::setAlignment(MaybeAlign Align) { void GlobalObject::copyAttributesFrom(const GlobalObject *Src) { GlobalValue::copyAttributesFrom(Src); - setAlignment(Src->getAlignment()); + setAlignment(MaybeAlign(Src->getAlignment())); setSection(Src->getSection()); } diff --git a/lib/IR/IRBuilder.cpp b/lib/IR/IRBuilder.cpp index 0c6461c9078..933b511b604 100644 --- a/lib/IR/IRBuilder.cpp +++ b/lib/IR/IRBuilder.cpp @@ -49,7 +49,7 @@ GlobalVariable *IRBuilderBase::CreateGlobalString(StringRef Str, nullptr, GlobalVariable::NotThreadLocal, AddressSpace); GV->setUnnamedAddr(GlobalValue::UnnamedAddr::Global); - GV->setAlignment(1); + GV->setAlignment(Align::None()); return GV; } diff --git a/lib/LTO/LTO.cpp b/lib/LTO/LTO.cpp index 6c5858b942a..71076084006 100644 --- a/lib/LTO/LTO.cpp +++ b/lib/LTO/LTO.cpp @@ -762,7 +762,8 @@ LTO::addRegularLTO(BitcodeModule BM, ArrayRef Syms, // For now they aren't reported correctly by ModuleSymbolTable. auto &CommonRes = RegularLTO.Commons[Sym.getIRName()]; CommonRes.Size = std::max(CommonRes.Size, Sym.getCommonSize()); - CommonRes.Align = std::max(CommonRes.Align, Sym.getCommonAlignment()); + CommonRes.Align = + std::max(CommonRes.Align, MaybeAlign(Sym.getCommonAlignment())); CommonRes.Prevailing |= Res.Prevailing; } diff --git a/lib/Linker/IRMover.cpp b/lib/Linker/IRMover.cpp index aee89af88a6..6784d81595e 100644 --- a/lib/Linker/IRMover.cpp +++ b/lib/Linker/IRMover.cpp @@ -629,7 +629,7 @@ GlobalVariable *IRLinker::copyGlobalVariableProto(const GlobalVariable *SGVar) { /*init*/ nullptr, SGVar->getName(), /*insertbefore*/ nullptr, SGVar->getThreadLocalMode(), SGVar->getType()->getAddressSpace()); - NewDGV->setAlignment(SGVar->getAlignment()); + NewDGV->setAlignment(MaybeAlign(SGVar->getAlignment())); NewDGV->copyAttributesFrom(SGVar); return NewDGV; } diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index a18f4cc25bc..35d6290e901 100644 --- a/lib/Linker/LinkModules.cpp +++ b/lib/Linker/LinkModules.cpp @@ -351,7 +351,8 @@ bool ModuleLinker::linkIfNeeded(GlobalValue &GV) { SGVar->setConstant(false); } if (DGVar->hasCommonLinkage() && SGVar->hasCommonLinkage()) { - unsigned Align = std::max(DGVar->getAlignment(), SGVar->getAlignment()); + MaybeAlign Align( + std::max(DGVar->getAlignment(), SGVar->getAlignment())); SGVar->setAlignment(Align); DGVar->setAlignment(Align); } diff --git a/lib/Target/AMDGPU/AMDGPUPromoteAlloca.cpp b/lib/Target/AMDGPU/AMDGPUPromoteAlloca.cpp index e4c9d6685d4..3e9dcca114a 100644 --- a/lib/Target/AMDGPU/AMDGPUPromoteAlloca.cpp +++ b/lib/Target/AMDGPU/AMDGPUPromoteAlloca.cpp @@ -801,7 +801,7 @@ bool AMDGPUPromoteAlloca::handleAlloca(AllocaInst &I, bool SufficientLDS) { GlobalVariable::NotThreadLocal, AMDGPUAS::LOCAL_ADDRESS); GV->setUnnamedAddr(GlobalValue::UnnamedAddr::Global); - GV->setAlignment(I.getAlignment()); + GV->setAlignment(MaybeAlign(I.getAlignment())); Value *TCntY, *TCntZ; diff --git a/lib/Transforms/IPO/ConstantMerge.cpp b/lib/Transforms/IPO/ConstantMerge.cpp index 3fe6f5c8719..3cf839e397f 100644 --- a/lib/Transforms/IPO/ConstantMerge.cpp +++ b/lib/Transforms/IPO/ConstantMerge.cpp @@ -120,7 +120,7 @@ static void replace(Module &M, GlobalVariable *Old, GlobalVariable *New) { // Bump the alignment if necessary. if (Old->getAlignment() || New->getAlignment()) - New->setAlignment(std::max(getAlignment(Old), getAlignment(New))); + New->setAlignment(Align(std::max(getAlignment(Old), getAlignment(New)))); copyDebugLocMetadata(Old, New); Old->replaceAllUsesWith(NewConstant); diff --git a/lib/Transforms/IPO/CrossDSOCFI.cpp b/lib/Transforms/IPO/CrossDSOCFI.cpp index 8b2842e18b5..5f3d0c2e373 100644 --- a/lib/Transforms/IPO/CrossDSOCFI.cpp +++ b/lib/Transforms/IPO/CrossDSOCFI.cpp @@ -108,7 +108,7 @@ void CrossDSOCFI::buildCFICheck(Module &M) { // Take over the existing function. The frontend emits a weak stub so that the // linker knows about the symbol; this pass replaces the function body. F->deleteBody(); - F->setAlignment(4096); + F->setAlignment(Align(4096)); Triple T(M.getTargetTriple()); if (T.isARM() || T.isThumb()) diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp index feac1b60884..64709bababf 100644 --- a/lib/Transforms/IPO/GlobalOpt.cpp +++ b/lib/Transforms/IPO/GlobalOpt.cpp @@ -497,8 +497,8 @@ static GlobalVariable *SRAGlobal(GlobalVariable *GV, const DataLayout &DL) { // had 256 byte alignment for example, something might depend on that: // propagate info to each field. uint64_t FieldOffset = Layout.getElementOffset(i); - unsigned NewAlign = (unsigned)MinAlign(StartAlignment, FieldOffset); - if (NewAlign > DL.getABITypeAlignment(STy->getElementType(i))) + Align NewAlign(MinAlign(StartAlignment, FieldOffset)); + if (NewAlign > Align(DL.getABITypeAlignment(STy->getElementType(i)))) NGV->setAlignment(NewAlign); // Copy over the debug info for the variable. @@ -513,7 +513,7 @@ static GlobalVariable *SRAGlobal(GlobalVariable *GV, const DataLayout &DL) { NewGlobals.reserve(NumElements); auto ElTy = STy->getElementType(); uint64_t EltSize = DL.getTypeAllocSize(ElTy); - unsigned EltAlign = DL.getABITypeAlignment(ElTy); + Align EltAlign(DL.getABITypeAlignment(ElTy)); uint64_t FragmentSizeInBits = DL.getTypeAllocSizeInBits(ElTy); for (unsigned i = 0, e = NumElements; i != e; ++i) { Constant *In = Init->getAggregateElement(i); @@ -532,7 +532,7 @@ static GlobalVariable *SRAGlobal(GlobalVariable *GV, const DataLayout &DL) { // Calculate the known alignment of the field. If the original aggregate // had 256 byte alignment for example, something might depend on that: // propagate info to each field. - unsigned NewAlign = (unsigned)MinAlign(StartAlignment, EltSize*i); + Align NewAlign(MinAlign(StartAlignment, EltSize * i)); if (NewAlign > EltAlign) NGV->setAlignment(NewAlign); transferSRADebugInfo(GV, NGV, FragmentSizeInBits * i, FragmentSizeInBits, diff --git a/lib/Transforms/IPO/LowerTypeTests.cpp b/lib/Transforms/IPO/LowerTypeTests.cpp index 36562961744..2dec366d70e 100644 --- a/lib/Transforms/IPO/LowerTypeTests.cpp +++ b/lib/Transforms/IPO/LowerTypeTests.cpp @@ -822,16 +822,16 @@ void LowerTypeTestsModule::buildBitSetsFromGlobalVariables( std::vector GlobalInits; const DataLayout &DL = M.getDataLayout(); DenseMap GlobalLayout; - uint64_t MaxAlign = 0; + Align MaxAlign; uint64_t CurOffset = 0; uint64_t DesiredPadding = 0; for (GlobalTypeMember *G : Globals) { auto *GV = cast(G->getGlobal()); - uint64_t Align = GV->getAlignment(); - if (Align == 0) - Align = DL.getABITypeAlignment(GV->getValueType()); - MaxAlign = std::max(MaxAlign, Align); - uint64_t GVOffset = alignTo(CurOffset + DesiredPadding, Align); + MaybeAlign Alignment(GV->getAlignment()); + if (!Alignment) + Alignment = Align(DL.getABITypeAlignment(GV->getValueType())); + MaxAlign = std::max(MaxAlign, *Alignment); + uint64_t GVOffset = alignTo(CurOffset + DesiredPadding, *Alignment); GlobalLayout[G] = GVOffset; if (GVOffset != 0) { uint64_t Padding = GVOffset - CurOffset; @@ -1363,7 +1363,7 @@ void LowerTypeTestsModule::createJumpTable( cast(Functions[I]->getGlobal())); // Align the whole table by entry size. - F->setAlignment(getJumpTableEntrySize()); + F->setAlignment(Align(getJumpTableEntrySize())); // Skip prologue. // Disabled on win32 due to https://llvm.org/bugs/show_bug.cgi?id=28641#c3. // Luckily, this function does not get any prologue even without the diff --git a/lib/Transforms/IPO/MergeFunctions.cpp b/lib/Transforms/IPO/MergeFunctions.cpp index 3a08069dcd4..8b9abaddc84 100644 --- a/lib/Transforms/IPO/MergeFunctions.cpp +++ b/lib/Transforms/IPO/MergeFunctions.cpp @@ -769,7 +769,7 @@ void MergeFunctions::writeAlias(Function *F, Function *G) { PtrType->getElementType(), PtrType->getAddressSpace(), G->getLinkage(), "", BitcastF, G->getParent()); - F->setAlignment(std::max(F->getAlignment(), G->getAlignment())); + F->setAlignment(MaybeAlign(std::max(F->getAlignment(), G->getAlignment()))); GA->takeName(G); GA->setVisibility(G->getVisibility()); GA->setUnnamedAddr(GlobalValue::UnnamedAddr::Global); @@ -816,7 +816,7 @@ void MergeFunctions::mergeTwoFunctions(Function *F, Function *G) { removeUsers(F); F->replaceAllUsesWith(NewF); - unsigned MaxAlignment = std::max(G->getAlignment(), NewF->getAlignment()); + MaybeAlign MaxAlignment(std::max(G->getAlignment(), NewF->getAlignment())); writeThunkOrAlias(F, G); writeThunkOrAlias(F, NewF); diff --git a/lib/Transforms/IPO/WholeProgramDevirt.cpp b/lib/Transforms/IPO/WholeProgramDevirt.cpp index 4055fe04999..e1578cc119f 100644 --- a/lib/Transforms/IPO/WholeProgramDevirt.cpp +++ b/lib/Transforms/IPO/WholeProgramDevirt.cpp @@ -1516,10 +1516,11 @@ void DevirtModule::rebuildGlobal(VTableBits &B) { // Align the before byte array to the global's minimum alignment so that we // don't break any alignment requirements on the global. - unsigned Align = B.GV->getAlignment(); - if (Align == 0) - Align = M.getDataLayout().getABITypeAlignment(B.GV->getValueType()); - B.Before.Bytes.resize(alignTo(B.Before.Bytes.size(), Align)); + MaybeAlign Alignment(B.GV->getAlignment()); + if (!Alignment) + Alignment = + Align(M.getDataLayout().getABITypeAlignment(B.GV->getValueType())); + B.Before.Bytes.resize(alignTo(B.Before.Bytes.size(), Alignment)); // Before was stored in reverse order; flip it now. for (size_t I = 0, Size = B.Before.Bytes.size(); I != Size / 2; ++I) @@ -1536,7 +1537,7 @@ void DevirtModule::rebuildGlobal(VTableBits &B) { GlobalVariable::PrivateLinkage, NewInit, "", B.GV); NewGV->setSection(B.GV->getSection()); NewGV->setComdat(B.GV->getComdat()); - NewGV->setAlignment(B.GV->getAlignment()); + NewGV->setAlignment(MaybeAlign(B.GV->getAlignment())); // Copy the original vtable's metadata to the anonymous global, adjusting // offsets as required. diff --git a/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/lib/Transforms/Instrumentation/AddressSanitizer.cpp index ff0b7081946..d92ee11c2e1 100644 --- a/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -2054,7 +2054,7 @@ void ModuleAddressSanitizer::InstrumentGlobalsCOFF( unsigned SizeOfGlobalStruct = DL.getTypeAllocSize(Initializer->getType()); assert(isPowerOf2_32(SizeOfGlobalStruct) && "global metadata will not be padded appropriately"); - Metadata->setAlignment(SizeOfGlobalStruct); + Metadata->setAlignment(assumeAligned(SizeOfGlobalStruct)); SetComdatForGlobalMetadata(G, Metadata, ""); } @@ -2191,7 +2191,7 @@ void ModuleAddressSanitizer::InstrumentGlobalsWithMetadataArray( M, ArrayOfGlobalStructTy, false, GlobalVariable::InternalLinkage, ConstantArray::get(ArrayOfGlobalStructTy, MetadataInitializers), ""); if (Mapping.Scale > 3) - AllGlobals->setAlignment(1ULL << Mapping.Scale); + AllGlobals->setAlignment(Align(1ULL << Mapping.Scale)); IRB.CreateCall(AsanRegisterGlobals, {IRB.CreatePointerCast(AllGlobals, IntptrTy), @@ -2291,7 +2291,7 @@ bool ModuleAddressSanitizer::InstrumentGlobals(IRBuilder<> &IRB, Module &M, "", G, G->getThreadLocalMode()); NewGlobal->copyAttributesFrom(G); NewGlobal->setComdat(G->getComdat()); - NewGlobal->setAlignment(MinRZ); + NewGlobal->setAlignment(MaybeAlign(MinRZ)); // Don't fold globals with redzones. ODR violation detector and redzone // poisoning implicitly creates a dependence on the global's address, so it // is no longer valid for it to be marked unnamed_addr. @@ -2359,7 +2359,7 @@ bool ModuleAddressSanitizer::InstrumentGlobals(IRBuilder<> &IRB, Module &M, // Set meaningful attributes for indicator symbol. ODRIndicatorSym->setVisibility(NewGlobal->getVisibility()); ODRIndicatorSym->setDLLStorageClass(NewGlobal->getDLLStorageClass()); - ODRIndicatorSym->setAlignment(1); + ODRIndicatorSym->setAlignment(Align::None()); ODRIndicator = ODRIndicatorSym; } diff --git a/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp b/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp index 1416dd24683..f87132ee475 100644 --- a/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp +++ b/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp @@ -1265,7 +1265,7 @@ void HWAddressSanitizer::instrumentGlobal(GlobalVariable *GV, uint8_t Tag) { NewGV->setLinkage(GlobalValue::PrivateLinkage); NewGV->copyMetadata(GV, 0); NewGV->setAlignment( - std::max(GV->getAlignment(), Mapping.getObjectAlignment())); + MaybeAlign(std::max(GV->getAlignment(), Mapping.getObjectAlignment()))); // It is invalid to ICF two globals that have different tags. In the case // where the size of the global is a multiple of the tag granularity the @@ -1370,7 +1370,7 @@ void HWAddressSanitizer::instrumentGlobals() { GlobalValue::PrivateLinkage, nullptr, kHwasanNoteName); Note->setSection(".note.hwasan.globals"); Note->setComdat(NoteComdat); - Note->setAlignment(4); + Note->setAlignment(Align(4)); Note->setDSOLocal(true); // The pointers in the note need to be relative so that the note ends up being diff --git a/lib/Transforms/Instrumentation/InstrProfiling.cpp b/lib/Transforms/Instrumentation/InstrProfiling.cpp index 0b83abe5bc2..1f092a5f310 100644 --- a/lib/Transforms/Instrumentation/InstrProfiling.cpp +++ b/lib/Transforms/Instrumentation/InstrProfiling.cpp @@ -785,7 +785,7 @@ InstrProfiling::getOrCreateRegionCounters(InstrProfIncrementInst *Inc) { CounterPtr->setVisibility(Visibility); CounterPtr->setSection( getInstrProfSectionName(IPSK_cnts, TT.getObjectFormat())); - CounterPtr->setAlignment(8); + CounterPtr->setAlignment(Align(8)); MaybeSetComdat(CounterPtr); CounterPtr->setLinkage(Linkage); @@ -807,7 +807,7 @@ InstrProfiling::getOrCreateRegionCounters(InstrProfIncrementInst *Inc) { ValuesVar->setVisibility(Visibility); ValuesVar->setSection( getInstrProfSectionName(IPSK_vals, TT.getObjectFormat())); - ValuesVar->setAlignment(8); + ValuesVar->setAlignment(Align(8)); MaybeSetComdat(ValuesVar); ValuesPtrExpr = ConstantExpr::getBitCast(ValuesVar, Type::getInt8PtrTy(Ctx)); @@ -840,7 +840,7 @@ InstrProfiling::getOrCreateRegionCounters(InstrProfIncrementInst *Inc) { getVarName(Inc, getInstrProfDataVarPrefix())); Data->setVisibility(Visibility); Data->setSection(getInstrProfSectionName(IPSK_data, TT.getObjectFormat())); - Data->setAlignment(INSTR_PROF_DATA_ALIGNMENT); + Data->setAlignment(Align(INSTR_PROF_DATA_ALIGNMENT)); MaybeSetComdat(Data); Data->setLinkage(Linkage); @@ -931,7 +931,7 @@ void InstrProfiling::emitNameData() { // On COFF, it's important to reduce the alignment down to 1 to prevent the // linker from inserting padding before the start of the names section or // between names entries. - NamesVar->setAlignment(1); + NamesVar->setAlignment(Align::None()); UsedVars.push_back(NamesVar); for (auto *NamePtr : ReferencedNames) diff --git a/lib/Transforms/Instrumentation/Instrumentation.cpp b/lib/Transforms/Instrumentation/Instrumentation.cpp index 3a63cda60b3..a6c2c9b464b 100644 --- a/lib/Transforms/Instrumentation/Instrumentation.cpp +++ b/lib/Transforms/Instrumentation/Instrumentation.cpp @@ -68,7 +68,8 @@ GlobalVariable *llvm::createPrivateGlobalForString(Module &M, StringRef Str, GlobalValue::PrivateLinkage, StrConst, NamePrefix); if (AllowMerging) GV->setUnnamedAddr(GlobalValue::UnnamedAddr::Global); - GV->setAlignment(1); // Strings may not be merged w/o setting align 1. + GV->setAlignment(Align::None()); // Strings may not be merged w/o setting + // alignment explicitly. return GV; } diff --git a/lib/Transforms/Instrumentation/SanitizerCoverage.cpp b/lib/Transforms/Instrumentation/SanitizerCoverage.cpp index f09081314eb..f8fa9cad03b 100644 --- a/lib/Transforms/Instrumentation/SanitizerCoverage.cpp +++ b/lib/Transforms/Instrumentation/SanitizerCoverage.cpp @@ -652,8 +652,9 @@ GlobalVariable *ModuleSanitizerCoverage::CreateFunctionLocalArrayInSection( GetOrCreateFunctionComdat(F, TargetTriple, CurModuleUniqueId)) Array->setComdat(Comdat); Array->setSection(getSectionName(Section)); - Array->setAlignment(Ty->isPointerTy() ? DL->getPointerSize() - : Ty->getPrimitiveSizeInBits() / 8); + Array->setAlignment(Align(Ty->isPointerTy() + ? DL->getPointerSize() + : Ty->getPrimitiveSizeInBits() / 8)); GlobalsToAppendToUsed.push_back(Array); GlobalsToAppendToCompilerUsed.push_back(Array); MDNode *MD = MDNode::get(F.getContext(), ValueAsMetadata::get(&F)); diff --git a/lib/Transforms/Scalar/LoopIdiomRecognize.cpp b/lib/Transforms/Scalar/LoopIdiomRecognize.cpp index 4f5ae5000a9..917d1119dc6 100644 --- a/lib/Transforms/Scalar/LoopIdiomRecognize.cpp +++ b/lib/Transforms/Scalar/LoopIdiomRecognize.cpp @@ -1023,7 +1023,7 @@ bool LoopIdiomRecognize::processLoopStridedStore( GlobalValue::PrivateLinkage, PatternValue, ".memset_pattern"); GV->setUnnamedAddr(GlobalValue::UnnamedAddr::Global); // Ok to merge these. - GV->setAlignment(16); + GV->setAlignment(Align(16)); Value *PatternPtr = ConstantExpr::getBitCast(GV, Int8PtrTy); NewCall = Builder.CreateCall(MSP, {BasePtr, PatternPtr, NumBytes}); } diff --git a/lib/Transforms/Utils/Local.cpp b/lib/Transforms/Utils/Local.cpp index 94339c2ba00..5bcd05757ec 100644 --- a/lib/Transforms/Utils/Local.cpp +++ b/lib/Transforms/Utils/Local.cpp @@ -1171,7 +1171,7 @@ static unsigned enforceKnownAlignment(Value *V, unsigned Alignment, if (!GO->canIncreaseAlignment()) return Alignment; - GO->setAlignment(PrefAlign); + GO->setAlignment(MaybeAlign(PrefAlign)); return PrefAlign; } diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp index 008abad181a..3a5e3293ed4 100644 --- a/lib/Transforms/Utils/SimplifyCFG.cpp +++ b/lib/Transforms/Utils/SimplifyCFG.cpp @@ -5085,7 +5085,7 @@ SwitchLookupTable::SwitchLookupTable( Array->setUnnamedAddr(GlobalValue::UnnamedAddr::Global); // Set the alignment to that of an array items. We will be only loading one // value out of it. - Array->setAlignment(DL.getPrefTypeAlignment(ValueType)); + Array->setAlignment(Align(DL.getPrefTypeAlignment(ValueType))); Kind = ArrayKind; } diff --git a/unittests/IR/ConstantsTest.cpp b/unittests/IR/ConstantsTest.cpp index 6c3497a6c84..4a8fcaa48e3 100644 --- a/unittests/IR/ConstantsTest.cpp +++ b/unittests/IR/ConstantsTest.cpp @@ -476,13 +476,15 @@ TEST(ConstantsTest, BitcastToGEP) { } bool foldFuncPtrAndConstToNull(LLVMContext &Context, Module *TheModule, - uint64_t AndValue, unsigned FunctionAlign = 0) { + uint64_t AndValue, + MaybeAlign FunctionAlign = llvm::None) { Type *VoidType(Type::getVoidTy(Context)); FunctionType *FuncType(FunctionType::get(VoidType, false)); Function *Func(Function::Create( FuncType, GlobalValue::ExternalLinkage, "", TheModule)); - if (FunctionAlign) Func->setAlignment(FunctionAlign); + if (FunctionAlign) + Func->setAlignment(*FunctionAlign); IntegerType *ConstantIntType(Type::getInt32Ty(Context)); ConstantInt *TheConstant(ConstantInt::get(ConstantIntType, AndValue)); @@ -547,21 +549,21 @@ TEST(ConstantsTest, FoldFunctionAlign4PtrAlignMultiple) { LLVMContext Context; Module TheModule("TestModule", Context); TheModule.setDataLayout("Fn8"); - ASSERT_TRUE(foldFuncPtrAndConstToNull(Context, &TheModule, 2, 4)); + ASSERT_TRUE(foldFuncPtrAndConstToNull(Context, &TheModule, 2, Align(4))); } TEST(ConstantsTest, DontFoldFunctionAlign4PtrAlignIndependent) { LLVMContext Context; Module TheModule("TestModule", Context); TheModule.setDataLayout("Fi8"); - ASSERT_FALSE(foldFuncPtrAndConstToNull(Context, &TheModule, 2, 4)); + ASSERT_FALSE(foldFuncPtrAndConstToNull(Context, &TheModule, 2, Align(4))); } TEST(ConstantsTest, DontFoldFunctionPtrIfNoModule) { LLVMContext Context; // Even though the function is explicitly 4 byte aligned, in the absence of a // DataLayout we can't assume that the function pointer is aligned. - ASSERT_FALSE(foldFuncPtrAndConstToNull(Context, nullptr, 2, 4)); + ASSERT_FALSE(foldFuncPtrAndConstToNull(Context, nullptr, 2, Align(4))); } TEST(ConstantsTest, FoldGlobalVariablePtr) { @@ -572,7 +574,7 @@ TEST(ConstantsTest, FoldGlobalVariablePtr) { std::unique_ptr Global( new GlobalVariable(IntType, true, GlobalValue::ExternalLinkage)); - Global->setAlignment(4); + Global->setAlignment(Align(4)); ConstantInt *TheConstant(ConstantInt::get(IntType, 2)); diff --git a/unittests/IR/FunctionTest.cpp b/unittests/IR/FunctionTest.cpp index b5662d2ca99..567304cac6b 100644 --- a/unittests/IR/FunctionTest.cpp +++ b/unittests/IR/FunctionTest.cpp @@ -151,7 +151,7 @@ TEST(FunctionTest, GetPointerAlignment) { EXPECT_EQ(4U, Func->getPointerAlignment(DataLayout("Fi32"))); EXPECT_EQ(4U, Func->getPointerAlignment(DataLayout("Fn32"))); - Func->setAlignment(4U); + Func->setAlignment(Align(4)); EXPECT_EQ(0U, Func->getPointerAlignment(DataLayout(""))); EXPECT_EQ(1U, Func->getPointerAlignment(DataLayout("Fi8"))); diff --git a/unittests/IR/ValueTest.cpp b/unittests/IR/ValueTest.cpp index f26046304f5..0c42e4632e8 100644 --- a/unittests/IR/ValueTest.cpp +++ b/unittests/IR/ValueTest.cpp @@ -61,7 +61,7 @@ TEST(GlobalTest, CreateAddressSpace) { 1); EXPECT_TRUE(Value::MaximumAlignment == 536870912U); - Dummy0->setAlignment(536870912U); + Dummy0->setAlignment(Align(536870912)); EXPECT_EQ(Dummy0->getAlignment(), 536870912U); // Make sure the address space isn't dropped when returning this. @@ -90,6 +90,7 @@ TEST(GlobalTest, CreateAddressSpace) { #ifdef GTEST_HAS_DEATH_TEST #ifndef NDEBUG + TEST(GlobalTest, AlignDeath) { LLVMContext Ctx; std::unique_ptr M(new Module("TestModule", Ctx)); @@ -99,9 +100,7 @@ TEST(GlobalTest, AlignDeath) { Constant::getAllOnesValue(Int32Ty), "var", nullptr, GlobalVariable::NotThreadLocal, 1); - EXPECT_DEATH(Var->setAlignment(536870913U), - "Alignment is neither 0 nor a power of 2"); - EXPECT_DEATH(Var->setAlignment(1073741824U), + EXPECT_DEATH(Var->setAlignment(Align(1073741824U)), "Alignment is greater than MaximumAlignment"); } #endif -- 2.11.4.GIT