diff --git a/llvm/include/llvm/IR/GlobalObject.h b/llvm/include/llvm/IR/GlobalObject.h --- a/llvm/include/llvm/IR/GlobalObject.h +++ b/llvm/include/llvm/IR/GlobalObject.h @@ -66,12 +66,6 @@ public: GlobalObject(const GlobalObject &) = delete; - /// FIXME: Remove this function once transition to Align is over. - uint64_t getAlignment() const { - MaybeAlign Align = getAlign(); - return Align ? Align->value() : 0; - } - /// Returns the alignment of the given variable or function. /// /// Note that for functions this is the alignment of the code, not the diff --git a/llvm/lib/IR/Globals.cpp b/llvm/lib/IR/Globals.cpp --- a/llvm/lib/IR/Globals.cpp +++ b/llvm/lib/IR/Globals.cpp @@ -124,8 +124,7 @@ unsigned AlignmentData = encode(Align); unsigned OldData = getGlobalValueSubClassData(); setGlobalValueSubClassData((OldData & ~AlignmentMask) | AlignmentData); - assert(MaybeAlign(getAlignment()) == Align && - "Alignment representation error!"); + assert(getAlign() == Align && "Alignment representation error!"); } void GlobalObject::copyAttributesFrom(const GlobalObject *Src) { diff --git a/llvm/lib/Linker/LinkModules.cpp b/llvm/lib/Linker/LinkModules.cpp --- a/llvm/lib/Linker/LinkModules.cpp +++ b/llvm/lib/Linker/LinkModules.cpp @@ -352,8 +352,12 @@ SGVar->setConstant(false); } if (DGVar->hasCommonLinkage() && SGVar->hasCommonLinkage()) { - MaybeAlign Align( - std::max(DGVar->getAlignment(), SGVar->getAlignment())); + MaybeAlign DAlign = DGVar->getAlign(); + MaybeAlign SAlign = SGVar->getAlign(); + MaybeAlign Align = std::nullopt; + if (DAlign || SAlign) + Align = std::max(DAlign.valueOrOne(), SAlign.valueOrOne()); + SGVar->setAlignment(Align); DGVar->setAlignment(Align); } diff --git a/llvm/lib/Object/IRSymtab.cpp b/llvm/lib/Object/IRSymtab.cpp --- a/llvm/lib/Object/IRSymtab.cpp +++ b/llvm/lib/Object/IRSymtab.cpp @@ -289,7 +289,7 @@ inconvertibleErrorCode()); Uncommon().CommonSize = GV->getParent()->getDataLayout().getTypeAllocSize(GV->getValueType()); - Uncommon().CommonAlign = GVar->getAlignment(); + Uncommon().CommonAlign = GVar->getAlign() ? GVar->getAlign()->value() : 0; } const GlobalObject *GO = GV->getAliaseeObject(); diff --git a/llvm/lib/Target/PowerPC/PPCMIPeephole.cpp b/llvm/lib/Target/PowerPC/PPCMIPeephole.cpp --- a/llvm/lib/Target/PowerPC/PPCMIPeephole.cpp +++ b/llvm/lib/Target/PowerPC/PPCMIPeephole.cpp @@ -843,7 +843,7 @@ if (SrcMI->getOperand(1).isGlobal()) { const GlobalObject *GO = dyn_cast(SrcMI->getOperand(1).getGlobal()); - if (GO && GO->getAlignment() >= 4) + if (GO && GO->getAlign() && *GO->getAlign() >= 4) IsWordAligned = true; } else if (SrcMI->getOperand(1).isImm()) { int64_t Value = SrcMI->getOperand(1).getImm(); diff --git a/llvm/lib/Transforms/IPO/MergeFunctions.cpp b/llvm/lib/Transforms/IPO/MergeFunctions.cpp --- a/llvm/lib/Transforms/IPO/MergeFunctions.cpp +++ b/llvm/lib/Transforms/IPO/MergeFunctions.cpp @@ -775,7 +775,12 @@ auto *GA = GlobalAlias::create(G->getValueType(), PtrType->getAddressSpace(), G->getLinkage(), "", BitcastF, G->getParent()); - F->setAlignment(MaybeAlign(std::max(F->getAlignment(), G->getAlignment()))); + const MaybeAlign FAlign = F->getAlign(); + const MaybeAlign GAlign = G->getAlign(); + if (FAlign || GAlign) + F->setAlignment(std::max(FAlign.valueOrOne(), GAlign.valueOrOne())); + else + F->setAlignment(std::nullopt); GA->takeName(G); GA->setVisibility(G->getVisibility()); GA->setUnnamedAddr(GlobalValue::UnnamedAddr::Global); @@ -822,12 +827,15 @@ removeUsers(F); F->replaceAllUsesWith(NewF); - MaybeAlign MaxAlignment(std::max(G->getAlignment(), NewF->getAlignment())); - writeThunkOrAlias(F, G); writeThunkOrAlias(F, NewF); - F->setAlignment(MaxAlignment); + const MaybeAlign NewFAlign = NewF->getAlign(); + const MaybeAlign GAlign = G->getAlign(); + if (NewFAlign || GAlign) + F->setAlignment(std::max(NewFAlign.valueOrOne(), GAlign.valueOrOne())); + else + F->setAlignment(std::nullopt); F->setLinkage(GlobalValue::PrivateLinkage); ++NumDoubleWeak; ++NumFunctionsMerged; diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp --- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -1759,7 +1759,7 @@ // - Need to poison all copies, not just the main thread's one. if (G->isThreadLocal()) return false; // For now, just ignore this Global if the alignment is large. - if (G->getAlignment() > getMinRedzoneSizeForGlobal()) return false; + if (G->getAlign() && *G->getAlign() > getMinRedzoneSizeForGlobal()) return false; // For non-COFF targets, only instrument globals known to be defined by this // TU. diff --git a/llvm/unittests/IR/ValueTest.cpp b/llvm/unittests/IR/ValueTest.cpp --- a/llvm/unittests/IR/ValueTest.cpp +++ b/llvm/unittests/IR/ValueTest.cpp @@ -61,9 +61,11 @@ GlobalVariable::NotThreadLocal, 1); - EXPECT_TRUE(Value::MaximumAlignment == 4294967296ULL); - Dummy0->setAlignment(Align(4294967296ULL)); - EXPECT_EQ(Dummy0->getAlignment(), 4294967296ULL); + const Align kMaxAlignment(Value::MaximumAlignment); + EXPECT_TRUE(kMaxAlignment.value() == 4294967296ULL); + Dummy0->setAlignment(kMaxAlignment); + EXPECT_TRUE(Dummy0->getAlign()); + EXPECT_EQ(*Dummy0->getAlign(), kMaxAlignment); // Make sure the address space isn't dropped when returning this. Constant *Dummy1 = M->getOrInsertGlobal("dummy", Int32Ty);