diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 3979d3d11f7a36..614c8bb2f1e64d 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -1444,17 +1444,9 @@ static void computeKnownBitsFromOperator(const Operator *I, Known.Zero.setHighBits(Leaders); break; } - - case Instruction::Alloca: { - const AllocaInst *AI = cast(I); - unsigned Align = AI->getAlignment(); - if (Align == 0) - Align = Q.DL.getABITypeAlignment(AI->getAllocatedType()); - - if (Align > 0) - Known.Zero.setLowBits(countTrailingZeros(Align)); + case Instruction::Alloca: + Known.Zero.setLowBits(Log2(cast(I)->getAlign())); break; - } case Instruction::GetElementPtr: { // Analyze all of the subscripts of this getelementptr instruction // to determine if we can prove known low zero bits. diff --git a/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp b/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp index 5bcc242d3528eb..c2294fad998a66 100644 --- a/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp +++ b/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp @@ -119,7 +119,7 @@ void CallLowering::setArgFlags(CallLowering::ArgInfo &Arg, unsigned OpIdx, } if (Attrs.hasAttribute(OpIdx, Attribute::Nest)) Flags.setNest(); - Flags.setOrigAlign(Align(DL.getABITypeAlignment(Arg.Ty))); + Flags.setOrigAlign(DL.getABITypeAlign(Arg.Ty)); } template void diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp index ff61438168b5bd..f671739020ffc7 100644 --- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp +++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp @@ -1938,7 +1938,7 @@ bool IRTranslator::translateVAArg(const User &U, MachineIRBuilder &MIRBuilder) { // anyway but that's not guaranteed. MIRBuilder.buildInstr(TargetOpcode::G_VAARG, {getOrCreateVReg(U)}, {getOrCreateVReg(*U.getOperand(0)), - uint64_t(DL->getABITypeAlignment(U.getType()))}); + DL->getABITypeAlign(U.getType()).value()}); return true; } diff --git a/llvm/lib/CodeGen/LowerEmuTLS.cpp b/llvm/lib/CodeGen/LowerEmuTLS.cpp index 1b41f773583a6d..36b863178b4743 100644 --- a/llvm/lib/CodeGen/LowerEmuTLS.cpp +++ b/llvm/lib/CodeGen/LowerEmuTLS.cpp @@ -128,12 +128,7 @@ bool LowerEmuTLS::addEmuTlsVar(Module &M, const GlobalVariable *GV) { return true; Type *GVType = GV->getValueType(); - unsigned GVAlignment = GV->getAlignment(); - if (!GVAlignment) { - // When LLVM IL declares a variable without alignment, use - // the ABI default alignment for the type. - GVAlignment = DL.getABITypeAlignment(GVType); - } + Align GVAlignment = DL.getValueOrABITypeAlignment(GV->getAlign(), GVType); // Define "__emutls_t.*" if there is InitValue GlobalVariable *EmuTlsTmplVar = nullptr; @@ -144,21 +139,20 @@ 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(Align(GVAlignment)); + EmuTlsTmplVar->setAlignment(GVAlignment); copyLinkageVisibility(M, GV, EmuTlsTmplVar); } // Define "__emutls_v.*" with initializer and alignment. Constant *ElementValues[4] = { ConstantInt::get(WordType, DL.getTypeStoreSize(GVType)), - ConstantInt::get(WordType, GVAlignment), - NullPtr, EmuTlsTmplVar ? EmuTlsTmplVar : NullPtr - }; + ConstantInt::get(WordType, GVAlignment.value()), NullPtr, + EmuTlsTmplVar ? EmuTlsTmplVar : NullPtr}; ArrayRef ElementValueArray(ElementValues, 4); EmuTlsVar->setInitializer( ConstantStruct::get(EmuTlsVarType, ElementValueArray)); - Align MaxAlignment(std::max(DL.getABITypeAlignment(WordType), - DL.getABITypeAlignment(VoidPtrType))); + Align MaxAlignment = + std::max(DL.getABITypeAlign(WordType), DL.getABITypeAlign(VoidPtrType)); EmuTlsVar->setAlignment(MaxAlignment); return true; } diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp index 2a820e619735b0..6afa7b19603020 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp @@ -1912,11 +1912,11 @@ void DAGTypeLegalizer::SplitVecRes_VAARG(SDNode *N, SDValue &Lo, SDValue &Hi) { SDValue SV = N->getOperand(2); SDLoc dl(N); - const unsigned Alignment = DAG.getDataLayout().getABITypeAlignment( - NVT.getTypeForEVT(*DAG.getContext())); + const Align Alignment = + DAG.getDataLayout().getABITypeAlign(NVT.getTypeForEVT(*DAG.getContext())); - Lo = DAG.getVAArg(NVT, dl, Chain, Ptr, SV, Alignment); - Hi = DAG.getVAArg(NVT, dl, Lo.getValue(1), Ptr, SV, Alignment); + Lo = DAG.getVAArg(NVT, dl, Chain, Ptr, SV, Alignment.value()); + Hi = DAG.getVAArg(NVT, dl, Lo.getValue(1), Ptr, SV, Alignment.value()); Chain = Hi.getValue(1); // Modified the chain - switch anything that used the old chain to use diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 55b8e24f56a509..476d7a7430eace 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -8617,7 +8617,7 @@ void SelectionDAGBuilder::visitVAArg(const VAArgInst &I) { SDValue V = DAG.getVAArg( TLI.getMemValueType(DAG.getDataLayout(), I.getType()), getCurSDLoc(), getRoot(), getValue(I.getOperand(0)), DAG.getSrcValue(I.getOperand(0)), - DL.getABITypeAlignment(I.getType())); + DL.getABITypeAlign(I.getType()).value()); DAG.setRoot(V.getValue(1)); if (I.getType()->isPointerTy()) diff --git a/llvm/lib/IR/DataLayout.cpp b/llvm/lib/IR/DataLayout.cpp index b0613c808c0b30..25fed92a504fdc 100644 --- a/llvm/lib/IR/DataLayout.cpp +++ b/llvm/lib/IR/DataLayout.cpp @@ -52,7 +52,7 @@ StructLayout::StructLayout(StructType *ST, const DataLayout &DL) { // Loop over each of the elements, placing them in memory. for (unsigned i = 0, e = NumElements; i != e; ++i) { Type *Ty = ST->getElementType(i); - const Align TyAlign(ST->isPacked() ? 1 : DL.getABITypeAlignment(Ty)); + const Align TyAlign = ST->isPacked() ? Align(1) : DL.getABITypeAlign(Ty); // Add padding if necessary to align the data element properly. if (!isAligned(TyAlign, StructSize)) { diff --git a/llvm/lib/Target/AMDGPU/AMDGPUCallLowering.cpp b/llvm/lib/Target/AMDGPU/AMDGPUCallLowering.cpp index 9cc34c1ee52681..7a3a502113dfd0 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUCallLowering.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUCallLowering.cpp @@ -518,7 +518,7 @@ bool AMDGPUCallLowering::lowerFormalArgumentsKernel( if (AllocSize == 0) continue; - unsigned ABIAlign = DL.getABITypeAlignment(ArgTy); + Align ABIAlign = DL.getABITypeAlign(ArgTy); uint64_t ArgOffset = alignTo(ExplicitArgOffset, ABIAlign) + BaseOffset; ExplicitArgOffset = alignTo(ExplicitArgOffset, ABIAlign) + AllocSize; diff --git a/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp b/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp index a077364896b641..5dc387127964f5 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.cpp @@ -346,12 +346,11 @@ void MetadataStreamerV2::emitKernelArg(const Argument &Arg) { Type *Ty = Arg.getType(); const DataLayout &DL = Func->getParent()->getDataLayout(); - unsigned PointeeAlign = 0; + MaybeAlign PointeeAlign; if (auto PtrTy = dyn_cast(Ty)) { if (PtrTy->getAddressSpace() == AMDGPUAS::LOCAL_ADDRESS) { - PointeeAlign = Arg.getParamAlignment(); - if (PointeeAlign == 0) - PointeeAlign = DL.getABITypeAlignment(PtrTy->getElementType()); + PointeeAlign = DL.getValueOrABITypeAlignment(Arg.getParamAlign(), + PtrTy->getElementType()); } } @@ -361,7 +360,7 @@ void MetadataStreamerV2::emitKernelArg(const Argument &Arg) { void MetadataStreamerV2::emitKernelArg(const DataLayout &DL, Type *Ty, ValueKind ValueKind, - unsigned PointeeAlign, StringRef Name, + MaybeAlign PointeeAlign, StringRef Name, StringRef TypeName, StringRef BaseTypeName, StringRef AccQual, StringRef TypeQual) { @@ -371,10 +370,10 @@ void MetadataStreamerV2::emitKernelArg(const DataLayout &DL, Type *Ty, Arg.mName = std::string(Name); Arg.mTypeName = std::string(TypeName); Arg.mSize = DL.getTypeAllocSize(Ty); - Arg.mAlign = DL.getABITypeAlignment(Ty); + Arg.mAlign = DL.getABITypeAlign(Ty).value(); Arg.mValueKind = ValueKind; Arg.mValueType = getValueType(Ty, BaseTypeName); - Arg.mPointeeAlign = PointeeAlign; + Arg.mPointeeAlign = PointeeAlign ? PointeeAlign->value() : 0; if (auto PtrTy = dyn_cast(Ty)) Arg.mAddrSpaceQual = getAddressSpaceQualifier(PtrTy->getAddressSpace()); @@ -768,12 +767,11 @@ void MetadataStreamerV3::emitKernelArg(const Argument &Arg, unsigned &Offset, Type *Ty = Arg.getType(); const DataLayout &DL = Func->getParent()->getDataLayout(); - unsigned PointeeAlign = 0; + MaybeAlign PointeeAlign; if (auto PtrTy = dyn_cast(Ty)) { if (PtrTy->getAddressSpace() == AMDGPUAS::LOCAL_ADDRESS) { - PointeeAlign = Arg.getParamAlignment(); - if (PointeeAlign == 0) - PointeeAlign = DL.getABITypeAlignment(PtrTy->getElementType()); + PointeeAlign = DL.getValueOrABITypeAlignment(Arg.getParamAlign(), + PtrTy->getElementType()); } } @@ -786,7 +784,7 @@ void MetadataStreamerV3::emitKernelArg(const Argument &Arg, unsigned &Offset, void MetadataStreamerV3::emitKernelArg(const DataLayout &DL, Type *Ty, StringRef ValueKind, unsigned &Offset, msgpack::ArrayDocNode Args, - unsigned PointeeAlign, StringRef Name, + MaybeAlign PointeeAlign, StringRef Name, StringRef TypeName, StringRef BaseTypeName, StringRef AccQual, StringRef TypeQual) { @@ -797,16 +795,16 @@ void MetadataStreamerV3::emitKernelArg(const DataLayout &DL, Type *Ty, if (!TypeName.empty()) Arg[".type_name"] = Arg.getDocument()->getNode(TypeName, /*Copy=*/true); auto Size = DL.getTypeAllocSize(Ty); - auto Align = DL.getABITypeAlignment(Ty); + Align Alignment = DL.getABITypeAlign(Ty); Arg[".size"] = Arg.getDocument()->getNode(Size); - Offset = alignTo(Offset, Align); + Offset = alignTo(Offset, Alignment); Arg[".offset"] = Arg.getDocument()->getNode(Offset); Offset += Size; Arg[".value_kind"] = Arg.getDocument()->getNode(ValueKind, /*Copy=*/true); Arg[".value_type"] = Arg.getDocument()->getNode(getValueType(Ty, BaseTypeName), /*Copy=*/true); if (PointeeAlign) - Arg[".pointee_align"] = Arg.getDocument()->getNode(PointeeAlign); + Arg[".pointee_align"] = Arg.getDocument()->getNode(PointeeAlign->value()); if (auto PtrTy = dyn_cast(Ty)) if (auto Qualifier = getAddressSpaceQualifier(PtrTy->getAddressSpace())) diff --git a/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.h b/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.h index 2618380a17599e..3cbc8bb5e2b97f 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.h +++ b/llvm/lib/Target/AMDGPU/AMDGPUHSAMetadataStreamer.h @@ -20,6 +20,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/BinaryFormat/MsgPackDocument.h" #include "llvm/Support/AMDGPUMetadata.h" +#include "llvm/Support/Alignment.h" namespace llvm { @@ -90,7 +91,7 @@ class MetadataStreamerV3 final : public MetadataStreamer { void emitKernelArg(const DataLayout &DL, Type *Ty, StringRef ValueKind, unsigned &Offset, msgpack::ArrayDocNode Args, - unsigned PointeeAlign = 0, StringRef Name = "", + MaybeAlign PointeeAlign = None, StringRef Name = "", StringRef TypeName = "", StringRef BaseTypeName = "", StringRef AccQual = "", StringRef TypeQual = ""); @@ -160,10 +161,9 @@ class MetadataStreamerV2 final : public MetadataStreamer { void emitKernelArg(const Argument &Arg); void emitKernelArg(const DataLayout &DL, Type *Ty, ValueKind ValueKind, - unsigned PointeeAlign = 0, - StringRef Name = "", StringRef TypeName = "", - StringRef BaseTypeName = "", StringRef AccQual = "", - StringRef TypeQual = ""); + MaybeAlign PointeeAlign = None, StringRef Name = "", + StringRef TypeName = "", StringRef BaseTypeName = "", + StringRef AccQual = "", StringRef TypeQual = ""); void emitHiddenKernelArgs(const Function &Func); diff --git a/llvm/lib/Target/AMDGPU/AMDGPULowerKernelArguments.cpp b/llvm/lib/Target/AMDGPU/AMDGPULowerKernelArguments.cpp index 58bd6e5f3b2b78..62ab5bb55a16af 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPULowerKernelArguments.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPULowerKernelArguments.cpp @@ -109,7 +109,7 @@ bool AMDGPULowerKernelArguments::runOnFunction(Function &F) { for (Argument &Arg : F.args()) { Type *ArgTy = Arg.getType(); - unsigned ABITypeAlign = DL.getABITypeAlignment(ArgTy); + Align ABITypeAlign = DL.getABITypeAlign(ArgTy); unsigned Size = DL.getTypeSizeInBits(ArgTy); unsigned AllocSize = DL.getTypeAllocSize(ArgTy); diff --git a/llvm/lib/Target/AMDGPU/AMDGPUSubtarget.cpp b/llvm/lib/Target/AMDGPU/AMDGPUSubtarget.cpp index a30e98172845e6..3b02c2b0ef7a91 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUSubtarget.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUSubtarget.cpp @@ -515,7 +515,7 @@ uint64_t AMDGPUSubtarget::getExplicitKernArgSize(const Function &F, for (const Argument &Arg : F.args()) { Type *ArgTy = Arg.getType(); - const Align Alignment(DL.getABITypeAlignment(ArgTy)); + const Align Alignment = DL.getABITypeAlign(ArgTy); uint64_t AllocSize = DL.getTypeAllocSize(ArgTy); ExplicitArgBytes = alignTo(ExplicitArgBytes, Alignment) + AllocSize; MaxAlign = std::max(MaxAlign, Alignment); diff --git a/llvm/lib/Target/ARM/ARMCallLowering.cpp b/llvm/lib/Target/ARM/ARMCallLowering.cpp index 4fbb3b6993e4e3..d860473011e776 100644 --- a/llvm/lib/Target/ARM/ARMCallLowering.cpp +++ b/llvm/lib/Target/ARM/ARMCallLowering.cpp @@ -203,7 +203,7 @@ void ARMCallLowering::splitToValueTypes(const ArgInfo &OrigArg, // Even if there is no splitting to do, we still want to replace the // original type (e.g. pointer type -> integer). auto Flags = OrigArg.Flags[0]; - Flags.setOrigAlign(Align(DL.getABITypeAlignment(OrigArg.Ty))); + Flags.setOrigAlign(DL.getABITypeAlign(OrigArg.Ty)); SplitArgs.emplace_back(OrigArg.Regs[0], SplitVTs[0].getTypeForEVT(Ctx), Flags, OrigArg.IsFixed); return; @@ -215,7 +215,7 @@ void ARMCallLowering::splitToValueTypes(const ArgInfo &OrigArg, Type *SplitTy = SplitVT.getTypeForEVT(Ctx); auto Flags = OrigArg.Flags[0]; - Flags.setOrigAlign(Align(DL.getABITypeAlignment(SplitTy))); + Flags.setOrigAlign(DL.getABITypeAlign(SplitTy)); bool NeedsConsecutiveRegisters = TLI.functionArgumentNeedsConsecutiveRegisters( diff --git a/llvm/lib/Target/ARM/ARMFastISel.cpp b/llvm/lib/Target/ARM/ARMFastISel.cpp index f47e9ff9f3b651..4bfca8a803ca43 100644 --- a/llvm/lib/Target/ARM/ARMFastISel.cpp +++ b/llvm/lib/Target/ARM/ARMFastISel.cpp @@ -2236,7 +2236,7 @@ bool ARMFastISel::ARMEmitLibcall(const Instruction *I, RTLIB::Libcall Call) { if (!isTypeLegal(ArgTy, ArgVT)) return false; ISD::ArgFlagsTy Flags; - Flags.setOrigAlign(Align(DL.getABITypeAlignment(ArgTy))); + Flags.setOrigAlign(DL.getABITypeAlign(ArgTy)); Args.push_back(Op); ArgRegs.push_back(Arg); @@ -2367,7 +2367,7 @@ bool ARMFastISel::SelectCall(const Instruction *I, if (!Arg.isValid()) return false; - Flags.setOrigAlign(Align(DL.getABITypeAlignment(ArgTy))); + Flags.setOrigAlign(DL.getABITypeAlign(ArgTy)); Args.push_back(*ArgI); ArgRegs.push_back(Arg); diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index 03c4966c758493..b0983f2c1847fc 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -18838,7 +18838,7 @@ static bool isHomogeneousAggregate(Type *Ty, HABaseType &Base, /// Return the correct alignment for the current calling convention. Align ARMTargetLowering::getABIAlignmentForCallingConv(Type *ArgTy, DataLayout DL) const { - const Align ABITypeAlign(DL.getABITypeAlignment(ArgTy)); + const Align ABITypeAlign = DL.getABITypeAlign(ArgTy); if (!ArgTy->isVectorTy()) return ABITypeAlign; diff --git a/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp b/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp index 04bc40a2970414..d570e3fd114f02 100644 --- a/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp +++ b/llvm/lib/Target/Hexagon/HexagonISelLowering.cpp @@ -1990,8 +1990,7 @@ bool HexagonTargetLowering::getTgtMemIntrinsic(IntrinsicInfo &Info, // The offset value comes through Modifier register. For now, assume the // offset is 0. Info.offset = 0; - Info.align = - MaybeAlign(DL.getABITypeAlignment(Info.memVT.getTypeForEVT(Cont))); + Info.align = DL.getABITypeAlign(Info.memVT.getTypeForEVT(Cont)); Info.flags = MachineMemOperand::MOLoad; return true; } diff --git a/llvm/lib/Target/Target.cpp b/llvm/lib/Target/Target.cpp index ade097111fbed6..7411687e2ca3d3 100644 --- a/llvm/lib/Target/Target.cpp +++ b/llvm/lib/Target/Target.cpp @@ -111,11 +111,11 @@ unsigned long long LLVMABISizeOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { } unsigned LLVMABIAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { - return unwrap(TD)->getABITypeAlignment(unwrap(Ty)); + return unwrap(TD)->getABITypeAlign(unwrap(Ty)).value(); } unsigned LLVMCallFrameAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { - return unwrap(TD)->getABITypeAlignment(unwrap(Ty)); + return unwrap(TD)->getABITypeAlign(unwrap(Ty)).value(); } unsigned LLVMPreferredAlignmentOfType(LLVMTargetDataRef TD, LLVMTypeRef Ty) { diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp index 116e68b783b70f..372d87ec3461f9 100644 --- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp +++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp @@ -555,8 +555,7 @@ static GlobalVariable *SRAGlobal(GlobalVariable *GV, const DataLayout &DL) { // propagate info to each field. uint64_t FieldOffset = Layout.getElementOffset(ElementIdx); Align NewAlign(MinAlign(StartAlignment, FieldOffset)); - if (NewAlign > - Align(DL.getABITypeAlignment(STy->getElementType(ElementIdx)))) + if (NewAlign > DL.getABITypeAlign(STy->getElementType(ElementIdx))) NGV->setAlignment(NewAlign); // Copy over the debug info for the variable. @@ -565,7 +564,7 @@ static GlobalVariable *SRAGlobal(GlobalVariable *GV, const DataLayout &DL) { transferSRADebugInfo(GV, NGV, FragmentOffsetInBits, Size); } else { uint64_t EltSize = DL.getTypeAllocSize(ElTy); - Align EltAlign(DL.getABITypeAlignment(ElTy)); + Align EltAlign = DL.getABITypeAlign(ElTy); uint64_t FragmentSizeInBits = DL.getTypeAllocSizeInBits(ElTy); // Calculate the known alignment of the field. If the original aggregate diff --git a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp index 8b108f1bf50c62..fac52cb3d84593 100644 --- a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp +++ b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp @@ -835,11 +835,10 @@ void LowerTypeTestsModule::buildBitSetsFromGlobalVariables( uint64_t DesiredPadding = 0; for (GlobalTypeMember *G : Globals) { auto *GV = cast(G->getGlobal()); - MaybeAlign Alignment(GV->getAlignment()); - if (!Alignment) - Alignment = Align(DL.getABITypeAlignment(GV->getValueType())); - MaxAlign = std::max(MaxAlign, *Alignment); - uint64_t GVOffset = alignTo(CurOffset + DesiredPadding, *Alignment); + Align Alignment = + DL.getValueOrABITypeAlignment(GV->getAlign(), 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; diff --git a/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp b/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp index ccffbbd0d175d6..7bea1503ea6305 100644 --- a/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp +++ b/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp @@ -1652,10 +1652,8 @@ 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. - MaybeAlign Alignment(B.GV->getAlignment()); - if (!Alignment) - Alignment = - Align(M.getDataLayout().getABITypeAlignment(B.GV->getValueType())); + Align Alignment = M.getDataLayout().getValueOrABITypeAlignment( + B.GV->getAlign(), B.GV->getValueType()); B.Before.Bytes.resize(alignTo(B.Before.Bytes.size(), Alignment)); // Before was stored in reverse order; flip it now.