[Alignment][NFC] Deprecate Align::None()

Summary:
This is a follow up on https://reviews.llvm.org/D71473#inline-647262.
There's a caveat here that `Align(1)` relies on the compiler understanding of `Log2_64` implementation to produce good code. One could use `Align()` as a replacement but I believe it is less clear that the alignment is one in that case.

Reviewers: xbolva00, courbet, bollu

Subscribers: arsenm, dylanmckay, sdardis, nemanjai, jvesely, nhaehnle, hiraditya, kbarton, jrtc27, atanasyan, jsji, Jim, kerbowa, cfe-commits, llvm-commits

Tags: #clang, #llvm

Differential Revision: https://reviews.llvm.org/D73099
This commit is contained in:
Guillaume Chatelet 2020-01-21 15:00:04 +01:00
parent 2ee218f365
commit 805c157e8a
47 changed files with 111 additions and 120 deletions

View File

@ -10591,11 +10591,11 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
case X86::BI__builtin_ia32_storedquqi512_mask: case X86::BI__builtin_ia32_storedquqi512_mask:
case X86::BI__builtin_ia32_storeupd512_mask: case X86::BI__builtin_ia32_storeupd512_mask:
case X86::BI__builtin_ia32_storeups512_mask: case X86::BI__builtin_ia32_storeups512_mask:
return EmitX86MaskedStore(*this, Ops, Align::None()); return EmitX86MaskedStore(*this, Ops, Align(1));
case X86::BI__builtin_ia32_storess128_mask: case X86::BI__builtin_ia32_storess128_mask:
case X86::BI__builtin_ia32_storesd128_mask: case X86::BI__builtin_ia32_storesd128_mask:
return EmitX86MaskedStore(*this, Ops, Align::None()); return EmitX86MaskedStore(*this, Ops, Align(1));
case X86::BI__builtin_ia32_vpopcntb_128: case X86::BI__builtin_ia32_vpopcntb_128:
case X86::BI__builtin_ia32_vpopcntd_128: case X86::BI__builtin_ia32_vpopcntd_128:
@ -10730,11 +10730,11 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
case X86::BI__builtin_ia32_loaddqudi128_mask: case X86::BI__builtin_ia32_loaddqudi128_mask:
case X86::BI__builtin_ia32_loaddqudi256_mask: case X86::BI__builtin_ia32_loaddqudi256_mask:
case X86::BI__builtin_ia32_loaddqudi512_mask: case X86::BI__builtin_ia32_loaddqudi512_mask:
return EmitX86MaskedLoad(*this, Ops, Align::None()); return EmitX86MaskedLoad(*this, Ops, Align(1));
case X86::BI__builtin_ia32_loadss128_mask: case X86::BI__builtin_ia32_loadss128_mask:
case X86::BI__builtin_ia32_loadsd128_mask: case X86::BI__builtin_ia32_loadsd128_mask:
return EmitX86MaskedLoad(*this, Ops, Align::None()); return EmitX86MaskedLoad(*this, Ops, Align(1));
case X86::BI__builtin_ia32_loadaps128_mask: case X86::BI__builtin_ia32_loadaps128_mask:
case X86::BI__builtin_ia32_loadaps256_mask: case X86::BI__builtin_ia32_loadaps256_mask:
@ -11558,7 +11558,7 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
// Unaligned nontemporal store of the scalar value. // Unaligned nontemporal store of the scalar value.
StoreInst *SI = Builder.CreateDefaultAlignedStore(Src, BC); StoreInst *SI = Builder.CreateDefaultAlignedStore(Src, BC);
SI->setMetadata(CGM.getModule().getMDKindID("nontemporal"), Node); SI->setMetadata(CGM.getModule().getMDKindID("nontemporal"), Node);
SI->setAlignment(llvm::Align::None()); SI->setAlignment(llvm::Align(1));
return SI; return SI;
} }
// Rotate is a special case of funnel shift - 1st 2 args are the same. // Rotate is a special case of funnel shift - 1st 2 args are the same.
@ -12509,7 +12509,7 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
case X86::BI__stosb: { case X86::BI__stosb: {
// We treat __stosb as a volatile memset - it may not generate "rep stosb" // We treat __stosb as a volatile memset - it may not generate "rep stosb"
// instruction, but it will create a memset that won't be optimized away. // instruction, but it will create a memset that won't be optimized away.
return Builder.CreateMemSet(Ops[0], Ops[1], Ops[2], Align::None(), true); return Builder.CreateMemSet(Ops[0], Ops[1], Ops[2], Align(1), true);
} }
case X86::BI__ud2: case X86::BI__ud2:
// llvm.trap makes a ud2a instruction on x86. // llvm.trap makes a ud2a instruction on x86.

View File

@ -2035,7 +2035,7 @@ CGObjCCommonMac::GenerateConstantNSString(const StringLiteral *Literal) {
GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global); GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
// Don't enforce the target's minimum global alignment, since the only use // Don't enforce the target's minimum global alignment, since the only use
// of the string is via this class initializer. // of the string is via this class initializer.
GV->setAlignment(llvm::Align::None()); GV->setAlignment(llvm::Align(1));
Fields.addBitCast(GV, CGM.Int8PtrTy); Fields.addBitCast(GV, CGM.Int8PtrTy);
// String length. // String length.

View File

@ -659,7 +659,7 @@ public:
/// Return the alignment for the specified \p GV. /// Return the alignment for the specified \p GV.
static Align getGVAlignment(const GlobalValue *GV, const DataLayout &DL, static Align getGVAlignment(const GlobalValue *GV, const DataLayout &DL,
Align InAlign = Align::None()); Align InAlign = Align(1));
private: private:
/// Private state for PrintSpecial() /// Private state for PrintSpecial()

View File

@ -75,7 +75,7 @@ private:
bool StackRealignable; bool StackRealignable;
public: public:
TargetFrameLowering(StackDirection D, Align StackAl, int LAO, TargetFrameLowering(StackDirection D, Align StackAl, int LAO,
Align TransAl = Align::None(), bool StackReal = true) Align TransAl = Align(1), bool StackReal = true)
: StackDir(D), StackAlignment(StackAl), TransientStackAlignment(TransAl), : StackDir(D), StackAlignment(StackAl), TransientStackAlignment(TransAl),
LocalAreaOffset(LAO), StackRealignable(StackReal) {} LocalAreaOffset(LAO), StackRealignable(StackReal) {}

View File

@ -864,7 +864,7 @@ public:
int offset = 0; // offset off of ptrVal int offset = 0; // offset off of ptrVal
uint64_t size = 0; // the size of the memory location uint64_t size = 0; // the size of the memory location
// (taken from memVT if zero) // (taken from memVT if zero)
MaybeAlign align = Align::None(); // alignment MaybeAlign align = Align(1); // alignment
MachineMemOperand::Flags flags = MachineMemOperand::MONone; MachineMemOperand::Flags flags = MachineMemOperand::MONone;
IntrinsicInfo() = default; IntrinsicInfo() = default;

View File

@ -86,11 +86,14 @@ public:
uint64_t value() const { return uint64_t(1) << ShiftValue; } uint64_t value() const { return uint64_t(1) << ShiftValue; }
/// Returns a default constructed Align which corresponds to no alignment. /// Returns a default constructed Align which corresponds to no alignment.
/// This is useful to test for unalignment as it conveys clear semantic. /// It was decided to deprecate Align::None because it's too close to
/// `if (A != Align::None())` /// llvm::None which can be used to initialize `MaybeAlign`.
/// would be better than /// MaybeAlign = llvm::None means unspecified alignment,
/// `if (A > Align(1))` /// Align = Align::None() means alignment of one byte.
constexpr static const Align None() { return Align(); } LLVM_ATTRIBUTE_DEPRECATED(constexpr static const Align None(),
"Use Align() or Align(1) instead") {
return Align();
}
/// Allow constructions of constexpr Align. /// Allow constructions of constexpr Align.
template <size_t kValue> constexpr static LogValue Constant() { template <size_t kValue> constexpr static LogValue Constant() {
@ -184,7 +187,8 @@ inline uint64_t alignTo(uint64_t Size, MaybeAlign A) {
inline uintptr_t alignAddr(const void *Addr, Align Alignment) { inline uintptr_t alignAddr(const void *Addr, Align Alignment) {
uintptr_t ArithAddr = reinterpret_cast<uintptr_t>(Addr); uintptr_t ArithAddr = reinterpret_cast<uintptr_t>(Addr);
assert(static_cast<uintptr_t>(ArithAddr + Alignment.value() - 1) >= assert(static_cast<uintptr_t>(ArithAddr + Alignment.value() - 1) >=
ArithAddr && "Overflow"); ArithAddr &&
"Overflow");
return alignTo(ArithAddr, Alignment); return alignTo(ArithAddr, Alignment);
} }

View File

@ -162,7 +162,7 @@ bool llvm::isDereferenceablePointer(const Value *V, Type *Ty,
const DataLayout &DL, const DataLayout &DL,
const Instruction *CtxI, const Instruction *CtxI,
const DominatorTree *DT) { const DominatorTree *DT) {
return isDereferenceableAndAlignedPointer(V, Ty, Align::None(), DL, CtxI, DT); return isDereferenceableAndAlignedPointer(V, Ty, Align(1), DL, CtxI, DT);
} }
/// Test if A and B will obviously have the same value. /// Test if A and B will obviously have the same value.

View File

@ -2182,7 +2182,7 @@ void AsmPrinter::EmitAlignment(Align Alignment, const GlobalObject *GV) const {
if (GV) if (GV)
Alignment = getGVAlignment(GV, GV->getParent()->getDataLayout(), Alignment); Alignment = getGVAlignment(GV, GV->getParent()->getDataLayout(), Alignment);
if (Alignment == Align::None()) if (Alignment == Align(1))
return; // 1-byte aligned: no need to emit alignment. return; // 1-byte aligned: no need to emit alignment.
if (getCurrentSection()->getKind().isText()) if (getCurrentSection()->getKind().isText())
@ -2955,7 +2955,7 @@ void AsmPrinter::EmitBasicBlockStart(const MachineBasicBlock &MBB) {
// Emit an alignment directive for this block, if needed. // Emit an alignment directive for this block, if needed.
const Align Alignment = MBB.getAlignment(); const Align Alignment = MBB.getAlignment();
if (Alignment != Align::None()) if (Alignment != Align(1))
EmitAlignment(Alignment); EmitAlignment(Alignment);
// If the block has its address taken, emit any labels that were used to // If the block has its address taken, emit any labels that were used to

View File

@ -239,7 +239,7 @@ bool CallLowering::handleAssignments(CCState &CCInfo,
if (Part == 0) { if (Part == 0) {
Flags.setSplit(); Flags.setSplit();
} else { } else {
Flags.setOrigAlign(Align::None()); Flags.setOrigAlign(Align(1));
if (Part == NumParts - 1) if (Part == NumParts - 1)
Flags.setSplitEnd(); Flags.setSplitEnd();
} }
@ -272,7 +272,7 @@ bool CallLowering::handleAssignments(CCState &CCInfo,
if (PartIdx == 0) { if (PartIdx == 0) {
Flags.setSplit(); Flags.setSplit();
} else { } else {
Flags.setOrigAlign(Align::None()); Flags.setOrigAlign(Align(1));
if (PartIdx == NumParts - 1) if (PartIdx == NumParts - 1)
Flags.setSplitEnd(); Flags.setSplitEnd();
} }

View File

@ -629,7 +629,7 @@ void MIPrinter::print(const MachineBasicBlock &MBB) {
OS << "landing-pad"; OS << "landing-pad";
HasAttributes = true; HasAttributes = true;
} }
if (MBB.getAlignment() != Align::None()) { if (MBB.getAlignment() != Align(1)) {
OS << (HasAttributes ? ", " : " ("); OS << (HasAttributes ? ", " : " (");
OS << "align " << MBB.getAlignment().value(); OS << "align " << MBB.getAlignment().value();
HasAttributes = true; HasAttributes = true;

View File

@ -326,7 +326,7 @@ void MachineBasicBlock::print(raw_ostream &OS, ModuleSlotTracker &MST,
OS << "landing-pad"; OS << "landing-pad";
HasAttributes = true; HasAttributes = true;
} }
if (getAlignment() != Align::None()) { if (getAlignment() != Align(1)) {
OS << (HasAttributes ? ", " : " ("); OS << (HasAttributes ? ", " : " (");
OS << "align " << Log2(getAlignment()); OS << "align " << Log2(getAlignment());
HasAttributes = true; HasAttributes = true;

View File

@ -89,7 +89,7 @@ int MachineFrameInfo::CreateFixedObject(uint64_t Size, int64_t SPOffset,
// stack needs realignment, we can't assume that the stack will in fact be // stack needs realignment, we can't assume that the stack will in fact be
// aligned. // aligned.
Align Alignment = Align Alignment =
commonAlignment(ForcedRealign ? Align::None() : StackAlignment, SPOffset); commonAlignment(ForcedRealign ? Align(1) : StackAlignment, SPOffset);
Alignment = clampStackAlignment(!StackRealignable, Alignment, StackAlignment); Alignment = clampStackAlignment(!StackRealignable, Alignment, StackAlignment);
Objects.insert(Objects.begin(), Objects.insert(Objects.begin(),
StackObject(Size, Alignment, SPOffset, IsImmutable, StackObject(Size, Alignment, SPOffset, IsImmutable,
@ -102,7 +102,7 @@ int MachineFrameInfo::CreateFixedSpillStackObject(uint64_t Size,
int64_t SPOffset, int64_t SPOffset,
bool IsImmutable) { bool IsImmutable) {
Align Alignment = Align Alignment =
commonAlignment(ForcedRealign ? Align::None() : StackAlignment, SPOffset); commonAlignment(ForcedRealign ? Align(1) : StackAlignment, SPOffset);
Alignment = clampStackAlignment(!StackRealignable, Alignment, StackAlignment); Alignment = clampStackAlignment(!StackRealignable, Alignment, StackAlignment);
Objects.insert(Objects.begin(), Objects.insert(Objects.begin(),
StackObject(Size, Alignment, SPOffset, IsImmutable, StackObject(Size, Alignment, SPOffset, IsImmutable,

View File

@ -970,8 +970,7 @@ bool MachinePointerInfo::isDereferenceable(unsigned Size, LLVMContext &C,
return false; return false;
return isDereferenceableAndAlignedPointer( return isDereferenceableAndAlignedPointer(
BasePtr, Align::None(), APInt(DL.getPointerSizeInBits(), Offset + Size), BasePtr, Align(1), APInt(DL.getPointerSizeInBits(), Offset + Size), DL);
DL);
} }
/// getConstantPool - Return a MachinePointerInfo record that refers to the /// getConstantPool - Return a MachinePointerInfo record that refers to the

View File

@ -9279,7 +9279,7 @@ TargetLowering::LowerCallTo(TargetLowering::CallLoweringInfo &CLI) const {
if (NumParts > 1 && j == 0) if (NumParts > 1 && j == 0)
MyFlags.Flags.setSplit(); MyFlags.Flags.setSplit();
else if (j != 0) { else if (j != 0) {
MyFlags.Flags.setOrigAlign(Align::None()); MyFlags.Flags.setOrigAlign(Align(1));
if (j == NumParts - 1) if (j == NumParts - 1)
MyFlags.Flags.setSplitEnd(); MyFlags.Flags.setSplitEnd();
} }
@ -9754,7 +9754,7 @@ void SelectionDAGISel::LowerArguments(const Function &F) {
MyFlags.Flags.setSplit(); MyFlags.Flags.setSplit();
// if it isn't first piece, alignment must be 1 // if it isn't first piece, alignment must be 1
else if (i > 0) { else if (i > 0) {
MyFlags.Flags.setOrigAlign(Align::None()); MyFlags.Flags.setOrigAlign(Align(1));
if (i == NumRegs - 1) if (i == NumRegs - 1)
MyFlags.Flags.setSplitEnd(); MyFlags.Flags.setSplitEnd();
} }

View File

@ -96,7 +96,7 @@ void IRSpeculationLayer::emit(MaterializationResponsibility R,
M, LoadValueTy, false, GlobalValue::LinkageTypes::InternalLinkage, M, LoadValueTy, false, GlobalValue::LinkageTypes::InternalLinkage,
ConstantInt::get(LoadValueTy, 0), ConstantInt::get(LoadValueTy, 0),
"__orc_speculate.guard.for." + Fn.getName()); "__orc_speculate.guard.for." + Fn.getName());
SpeculatorGuard->setAlignment(Align::None()); SpeculatorGuard->setAlignment(Align(1));
SpeculatorGuard->setUnnamedAddr(GlobalValue::UnnamedAddr::Local); SpeculatorGuard->setUnnamedAddr(GlobalValue::UnnamedAddr::Local);
BasicBlock &ProgramEntry = Fn.getEntryBlock(); BasicBlock &ProgramEntry = Fn.getEntryBlock();

View File

@ -1239,7 +1239,7 @@ static Value *UpgradeMaskedStore(IRBuilder<> &Builder,
llvm::PointerType::getUnqual(Data->getType())); llvm::PointerType::getUnqual(Data->getType()));
const Align Alignment = const Align Alignment =
Aligned ? Align(cast<VectorType>(Data->getType())->getBitWidth() / 8) Aligned ? Align(cast<VectorType>(Data->getType())->getBitWidth() / 8)
: Align::None(); : Align(1);
// If the mask is all ones just emit a regular store. // If the mask is all ones just emit a regular store.
if (const auto *C = dyn_cast<Constant>(Mask)) if (const auto *C = dyn_cast<Constant>(Mask))
@ -1260,7 +1260,7 @@ static Value *UpgradeMaskedLoad(IRBuilder<> &Builder,
Ptr = Builder.CreateBitCast(Ptr, llvm::PointerType::getUnqual(ValTy)); Ptr = Builder.CreateBitCast(Ptr, llvm::PointerType::getUnqual(ValTy));
const Align Alignment = const Align Alignment =
Aligned ? Align(cast<VectorType>(Passthru->getType())->getBitWidth() / 8) Aligned ? Align(cast<VectorType>(Passthru->getType())->getBitWidth() / 8)
: Align::None(); : Align(1);
// If the mask is all ones just emit a regular store. // If the mask is all ones just emit a regular store.
if (const auto *C = dyn_cast<Constant>(Mask)) if (const auto *C = dyn_cast<Constant>(Mask))

View File

@ -718,7 +718,7 @@ Align DataLayout::getAlignment(Type *Ty, bool abi_or_pref) const {
case Type::StructTyID: { case Type::StructTyID: {
// Packed structure types always have an ABI alignment of one. // Packed structure types always have an ABI alignment of one.
if (cast<StructType>(Ty)->isPacked() && abi_or_pref) if (cast<StructType>(Ty)->isPacked() && abi_or_pref)
return Align::None(); return Align(1);
// Get the layout annotation... which is lazily created on demand. // Get the layout annotation... which is lazily created on demand.
const StructLayout *Layout = getStructLayout(cast<StructType>(Ty)); const StructLayout *Layout = getStructLayout(cast<StructType>(Ty));

View File

@ -49,7 +49,7 @@ GlobalVariable *IRBuilderBase::CreateGlobalString(StringRef Str,
nullptr, GlobalVariable::NotThreadLocal, nullptr, GlobalVariable::NotThreadLocal,
AddressSpace); AddressSpace);
GV->setUnnamedAddr(GlobalValue::UnnamedAddr::Global); GV->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
GV->setAlignment(Align::None()); GV->setAlignment(Align(1));
return GV; return GV;
} }

View File

@ -79,7 +79,7 @@ void AArch64CompressJumpTables::scanFunction() {
for (MachineBasicBlock &MBB : *MF) { for (MachineBasicBlock &MBB : *MF) {
const Align Alignment = MBB.getAlignment(); const Align Alignment = MBB.getAlignment();
unsigned AlignedOffset; unsigned AlignedOffset;
if (Alignment == Align::None()) if (Alignment == Align(1))
AlignedOffset = Offset; AlignedOffset = Offset;
else else
AlignedOffset = alignTo(Offset, Alignment); AlignedOffset = alignTo(Offset, Alignment);

View File

@ -26,7 +26,7 @@ namespace llvm {
class AMDGPUFrameLowering : public TargetFrameLowering { class AMDGPUFrameLowering : public TargetFrameLowering {
public: public:
AMDGPUFrameLowering(StackDirection D, Align StackAl, int LAO, AMDGPUFrameLowering(StackDirection D, Align StackAl, int LAO,
Align TransAl = Align::None()); Align TransAl = Align(1));
~AMDGPUFrameLowering() override; ~AMDGPUFrameLowering() override;
/// \returns The number of 32-bit sub-registers that are used when storing /// \returns The number of 32-bit sub-registers that are used when storing

View File

@ -497,7 +497,7 @@ uint64_t AMDGPUSubtarget::getExplicitKernArgSize(const Function &F,
const DataLayout &DL = F.getParent()->getDataLayout(); const DataLayout &DL = F.getParent()->getDataLayout();
uint64_t ExplicitArgBytes = 0; uint64_t ExplicitArgBytes = 0;
MaxAlign = Align::None(); MaxAlign = Align(1);
for (const Argument &Arg : F.args()) { for (const Argument &Arg : F.args()) {
Type *ArgTy = Arg.getType(); Type *ArgTy = Arg.getType();

View File

@ -16,7 +16,7 @@ namespace llvm {
class R600FrameLowering : public AMDGPUFrameLowering { class R600FrameLowering : public AMDGPUFrameLowering {
public: public:
R600FrameLowering(StackDirection D, Align StackAl, int LAO, R600FrameLowering(StackDirection D, Align StackAl, int LAO,
Align TransAl = Align::None()) Align TransAl = Align(1))
: AMDGPUFrameLowering(D, StackAl, LAO, TransAl) {} : AMDGPUFrameLowering(D, StackAl, LAO, TransAl) {}
~R600FrameLowering() override; ~R600FrameLowering() override;

View File

@ -21,7 +21,7 @@ class GCNSubtarget;
class SIFrameLowering final : public AMDGPUFrameLowering { class SIFrameLowering final : public AMDGPUFrameLowering {
public: public:
SIFrameLowering(StackDirection D, Align StackAl, int LAO, SIFrameLowering(StackDirection D, Align StackAl, int LAO,
Align TransAl = Align::None()) Align TransAl = Align(1))
: AMDGPUFrameLowering(D, StackAl, LAO, TransAl) {} : AMDGPUFrameLowering(D, StackAl, LAO, TransAl) {}
~SIFrameLowering() override = default; ~SIFrameLowering() override = default;

View File

@ -49,7 +49,7 @@ void ARMBasicBlockUtils::computeBlockSize(MachineBasicBlock *MBB) {
BasicBlockInfo &BBI = BBInfo[MBB->getNumber()]; BasicBlockInfo &BBI = BBInfo[MBB->getNumber()];
BBI.Size = 0; BBI.Size = 0;
BBI.Unalign = 0; BBI.Unalign = 0;
BBI.PostAlign = Align::None(); BBI.PostAlign = Align(1);
for (MachineInstr &I : *MBB) { for (MachineInstr &I : *MBB) {
BBI.Size += TII->getInstSizeInBytes(I); BBI.Size += TII->getInstSizeInBytes(I);

View File

@ -87,10 +87,10 @@ struct BasicBlockInfo {
/// Compute the offset immediately following this block. If Align is /// Compute the offset immediately following this block. If Align is
/// specified, return the offset the successor block will get if it has /// specified, return the offset the successor block will get if it has
/// this alignment. /// this alignment.
unsigned postOffset(Align Alignment = Align::None()) const { unsigned postOffset(Align Alignment = Align(1)) const {
unsigned PO = Offset + Size; unsigned PO = Offset + Size;
const Align PA = std::max(PostAlign, Alignment); const Align PA = std::max(PostAlign, Alignment);
if (PA == Align::None()) if (PA == Align(1))
return PO; return PO;
// Add alignment padding from the terminator. // Add alignment padding from the terminator.
return PO + UnknownPadding(PA, internalKnownBits()); return PO + UnknownPadding(PA, internalKnownBits());
@ -101,7 +101,7 @@ struct BasicBlockInfo {
/// instruction alignment. An aligned terminator may increase the number /// instruction alignment. An aligned terminator may increase the number
/// of know bits. /// of know bits.
/// If LogAlign is given, also consider the alignment of the next block. /// If LogAlign is given, also consider the alignment of the next block.
unsigned postKnownBits(Align Align = Align::None()) const { unsigned postKnownBits(Align Align = llvm::Align(1)) const {
return std::max(Log2(std::max(PostAlign, Align)), internalKnownBits()); return std::max(Log2(std::max(PostAlign, Align)), internalKnownBits());
} }
}; };

View File

@ -1566,7 +1566,7 @@ void ARMConstantIslands::removeDeadCPEMI(MachineInstr *CPEMI) {
BBInfo[CPEBB->getNumber()].Size = 0; BBInfo[CPEBB->getNumber()].Size = 0;
// This block no longer needs to be aligned. // This block no longer needs to be aligned.
CPEBB->setAlignment(Align::None()); CPEBB->setAlignment(Align(1));
} else { } else {
// Entries are sorted by descending alignment, so realign from the front. // Entries are sorted by descending alignment, so realign from the front.
CPEBB->setAlignment(getCPEAlign(&*CPEBB->begin())); CPEBB->setAlignment(getCPEAlign(&*CPEBB->begin()));

View File

@ -30,8 +30,7 @@
namespace llvm { namespace llvm {
AVRFrameLowering::AVRFrameLowering() AVRFrameLowering::AVRFrameLowering()
: TargetFrameLowering(TargetFrameLowering::StackGrowsDown, Align::None(), : TargetFrameLowering(TargetFrameLowering::StackGrowsDown, Align(1), -2) {}
-2) {}
bool AVRFrameLowering::canSimplifyCallFramePseudos( bool AVRFrameLowering::canSimplifyCallFramePseudos(
const MachineFunction &MF) const { const MachineFunction &MF) const {

View File

@ -105,7 +105,7 @@ void HexagonBranchRelaxation::computeOffset(MachineFunction &MF,
// offset of the current instruction from the start. // offset of the current instruction from the start.
unsigned InstOffset = 0; unsigned InstOffset = 0;
for (auto &B : MF) { for (auto &B : MF) {
if (B.getAlignment() != Align::None()) { if (B.getAlignment() != Align(1)) {
// Although we don't know the exact layout of the final code, we need // Although we don't know the exact layout of the final code, we need
// to account for alignment padding somehow. This heuristic pads each // to account for alignment padding somehow. This heuristic pads each
// aligned basic block according to the alignment value. // aligned basic block according to the alignment value.

View File

@ -114,7 +114,7 @@ bool HexagonFixupHwLoops::fixupLoopInstrs(MachineFunction &MF) {
// First pass - compute the offset of each basic block. // First pass - compute the offset of each basic block.
for (const MachineBasicBlock &MBB : MF) { for (const MachineBasicBlock &MBB : MF) {
if (MBB.getAlignment() != Align::None()) { if (MBB.getAlignment() != Align(1)) {
// Although we don't know the exact layout of the final code, we need // Although we don't know the exact layout of the final code, we need
// to account for alignment padding somehow. This heuristic pads each // to account for alignment padding somehow. This heuristic pads each
// aligned basic block according to the alignment value. // aligned basic block according to the alignment value.

View File

@ -32,7 +32,7 @@ public:
// First register which could possibly hold a variable argument. // First register which could possibly hold a variable argument.
int FirstVarArgSavedReg; int FirstVarArgSavedReg;
explicit HexagonFrameLowering() explicit HexagonFrameLowering()
: TargetFrameLowering(StackGrowsDown, Align(8), 0, Align::None(), true) {} : TargetFrameLowering(StackGrowsDown, Align(8), 0, Align(1), true) {}
// All of the prolog/epilog functionality, including saving and restoring // All of the prolog/epilog functionality, including saving and restoring
// callee-saved registers is handled in emitPrologue. This is to have the // callee-saved registers is handled in emitPrologue. This is to have the

View File

@ -183,7 +183,7 @@ unsigned HexagonTTIImpl::getMemoryOpCost(unsigned Opcode, Type *Src,
unsigned Cost = unsigned Cost =
VecTy->getElementType()->isFloatingPointTy() ? FloatFactor : 1; VecTy->getElementType()->isFloatingPointTy() ? FloatFactor : 1;
// At this point unspecified alignment is considered as Align::None(). // At this point unspecified alignment is considered as Align(1).
const Align BoundAlignment = std::min(Alignment.valueOrOne(), Align(8)); const Align BoundAlignment = std::min(Alignment.valueOrOne(), Align(8));
unsigned AlignWidth = 8 * BoundAlignment.value(); unsigned AlignWidth = 8 * BoundAlignment.value();
unsigned NumLoads = alignTo(VecWidth, AlignWidth) / AlignWidth; unsigned NumLoads = alignTo(VecWidth, AlignWidth) / AlignWidth;

View File

@ -691,7 +691,7 @@ void MipsCallLowering::subTargetRegTypeForCallingConv(
if (i == 0) if (i == 0)
Flags.setOrigAlign(TLI.getABIAlignmentForCallingConv(Arg.Ty, DL)); Flags.setOrigAlign(TLI.getABIAlignmentForCallingConv(Arg.Ty, DL));
else else
Flags.setOrigAlign(Align::None()); Flags.setOrigAlign(Align(1));
ISDArgs.emplace_back(Flags, RegisterVT, VT, true, OrigArgIndices[ArgNo], ISDArgs.emplace_back(Flags, RegisterVT, VT, true, OrigArgIndices[ArgNo],
0); 0);

View File

@ -940,7 +940,7 @@ bool MipsConstantIslands::isWaterInRange(unsigned UserOffset,
MachineFunction::const_iterator NextBlock = ++Water->getIterator(); MachineFunction::const_iterator NextBlock = ++Water->getIterator();
if (NextBlock == MF->end()) { if (NextBlock == MF->end()) {
NextBlockOffset = BBInfo[Water->getNumber()].postOffset(); NextBlockOffset = BBInfo[Water->getNumber()].postOffset();
NextBlockAlignment = Align::None(); NextBlockAlignment = Align(1);
} else { } else {
NextBlockOffset = BBInfo[NextBlock->getNumber()].Offset; NextBlockOffset = BBInfo[NextBlock->getNumber()].Offset;
NextBlockAlignment = NextBlock->getAlignment(); NextBlockAlignment = NextBlock->getAlignment();

View File

@ -82,7 +82,7 @@ FunctionPass *llvm::createPPCBranchSelectionPass() {
unsigned PPCBSel::GetAlignmentAdjustment(MachineBasicBlock &MBB, unsigned PPCBSel::GetAlignmentAdjustment(MachineBasicBlock &MBB,
unsigned Offset) { unsigned Offset) {
const Align Alignment = MBB.getAlignment(); const Align Alignment = MBB.getAlignment();
if (Alignment == Align::None()) if (Alignment == Align(1))
return 0; return 0;
const Align ParentAlign = MBB.getParent()->getAlignment(); const Align ParentAlign = MBB.getParent()->getAlignment();

View File

@ -14939,7 +14939,7 @@ bool PPCTargetLowering::getTgtMemIntrinsic(IntrinsicInfo &Info,
Info.ptrVal = I.getArgOperand(0); Info.ptrVal = I.getArgOperand(0);
Info.offset = -VT.getStoreSize()+1; Info.offset = -VT.getStoreSize()+1;
Info.size = 2*VT.getStoreSize()-1; Info.size = 2*VT.getStoreSize()-1;
Info.align = Align::None(); Info.align = Align(1);
Info.flags = MachineMemOperand::MOLoad; Info.flags = MachineMemOperand::MOLoad;
return true; return true;
} }
@ -14973,7 +14973,7 @@ bool PPCTargetLowering::getTgtMemIntrinsic(IntrinsicInfo &Info,
Info.ptrVal = I.getArgOperand(0); Info.ptrVal = I.getArgOperand(0);
Info.offset = 0; Info.offset = 0;
Info.size = VT.getStoreSize(); Info.size = VT.getStoreSize();
Info.align = Align::None(); Info.align = Align(1);
Info.flags = MachineMemOperand::MOLoad; Info.flags = MachineMemOperand::MOLoad;
return true; return true;
} }
@ -15025,7 +15025,7 @@ bool PPCTargetLowering::getTgtMemIntrinsic(IntrinsicInfo &Info,
Info.ptrVal = I.getArgOperand(1); Info.ptrVal = I.getArgOperand(1);
Info.offset = -VT.getStoreSize()+1; Info.offset = -VT.getStoreSize()+1;
Info.size = 2*VT.getStoreSize()-1; Info.size = 2*VT.getStoreSize()-1;
Info.align = Align::None(); Info.align = Align(1);
Info.flags = MachineMemOperand::MOStore; Info.flags = MachineMemOperand::MOStore;
return true; return true;
} }
@ -15058,7 +15058,7 @@ bool PPCTargetLowering::getTgtMemIntrinsic(IntrinsicInfo &Info,
Info.ptrVal = I.getArgOperand(1); Info.ptrVal = I.getArgOperand(1);
Info.offset = 0; Info.offset = 0;
Info.size = VT.getStoreSize(); Info.size = VT.getStoreSize();
Info.align = Align::None(); Info.align = Align(1);
Info.flags = MachineMemOperand::MOStore; Info.flags = MachineMemOperand::MOStore;
return true; return true;
} }

View File

@ -355,8 +355,7 @@ static bool hasVariantSymbol(const MCInst &MI) {
} }
bool X86AsmBackend::allowAutoPadding() const { bool X86AsmBackend::allowAutoPadding() const {
return (AlignBoundary != Align::None() && return (AlignBoundary != Align(1) && AlignBranchType != X86::AlignBranchNone);
AlignBranchType != X86::AlignBranchNone);
} }
bool X86AsmBackend::needAlign(MCObjectStreamer &OS) const { bool X86AsmBackend::needAlign(MCObjectStreamer &OS) const {

View File

@ -4972,7 +4972,7 @@ bool X86TargetLowering::getTgtMemIntrinsic(IntrinsicInfo &Info,
ScalarVT = MVT::i32; ScalarVT = MVT::i32;
Info.memVT = MVT::getVectorVT(ScalarVT, VT.getVectorNumElements()); Info.memVT = MVT::getVectorVT(ScalarVT, VT.getVectorNumElements());
Info.align = Align::None(); Info.align = Align(1);
Info.flags |= MachineMemOperand::MOStore; Info.flags |= MachineMemOperand::MOStore;
break; break;
} }
@ -4985,7 +4985,7 @@ bool X86TargetLowering::getTgtMemIntrinsic(IntrinsicInfo &Info,
unsigned NumElts = std::min(DataVT.getVectorNumElements(), unsigned NumElts = std::min(DataVT.getVectorNumElements(),
IndexVT.getVectorNumElements()); IndexVT.getVectorNumElements());
Info.memVT = MVT::getVectorVT(DataVT.getVectorElementType(), NumElts); Info.memVT = MVT::getVectorVT(DataVT.getVectorElementType(), NumElts);
Info.align = Align::None(); Info.align = Align(1);
Info.flags |= MachineMemOperand::MOLoad; Info.flags |= MachineMemOperand::MOLoad;
break; break;
} }
@ -4997,7 +4997,7 @@ bool X86TargetLowering::getTgtMemIntrinsic(IntrinsicInfo &Info,
unsigned NumElts = std::min(DataVT.getVectorNumElements(), unsigned NumElts = std::min(DataVT.getVectorNumElements(),
IndexVT.getVectorNumElements()); IndexVT.getVectorNumElements());
Info.memVT = MVT::getVectorVT(DataVT.getVectorElementType(), NumElts); Info.memVT = MVT::getVectorVT(DataVT.getVectorElementType(), NumElts);
Info.align = Align::None(); Info.align = Align(1);
Info.flags |= MachineMemOperand::MOStore; Info.flags |= MachineMemOperand::MOStore;
break; break;
} }

View File

@ -1332,7 +1332,7 @@ static Instruction *simplifyX86MaskedLoad(IntrinsicInst &II, InstCombiner &IC) {
// The pass-through vector for an x86 masked load is a zero vector. // The pass-through vector for an x86 masked load is a zero vector.
CallInst *NewMaskedLoad = CallInst *NewMaskedLoad =
IC.Builder.CreateMaskedLoad(PtrCast, Align::None(), BoolMask, ZeroVec); IC.Builder.CreateMaskedLoad(PtrCast, Align(1), BoolMask, ZeroVec);
return IC.replaceInstUsesWith(II, NewMaskedLoad); return IC.replaceInstUsesWith(II, NewMaskedLoad);
} }
@ -1373,7 +1373,7 @@ static bool simplifyX86MaskedStore(IntrinsicInst &II, InstCombiner &IC) {
// on each element's most significant bit (the sign bit). // on each element's most significant bit (the sign bit).
Constant *BoolMask = getNegativeIsTrueBoolVec(ConstMask); Constant *BoolMask = getNegativeIsTrueBoolVec(ConstMask);
IC.Builder.CreateMaskedStore(Vec, PtrCast, Align::None(), BoolMask); IC.Builder.CreateMaskedStore(Vec, PtrCast, Align(1), BoolMask);
// 'Replace uses' doesn't work for stores. Erase the original masked store. // 'Replace uses' doesn't work for stores. Erase the original masked store.
IC.eraseInstFromFunction(II); IC.eraseInstFromFunction(II);
@ -2381,7 +2381,7 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
// Turn PPC VSX loads into normal loads. // Turn PPC VSX loads into normal loads.
Value *Ptr = Builder.CreateBitCast(II->getArgOperand(0), Value *Ptr = Builder.CreateBitCast(II->getArgOperand(0),
PointerType::getUnqual(II->getType())); PointerType::getUnqual(II->getType()));
return new LoadInst(II->getType(), Ptr, Twine(""), false, Align::None()); return new LoadInst(II->getType(), Ptr, Twine(""), false, Align(1));
} }
case Intrinsic::ppc_altivec_stvx: case Intrinsic::ppc_altivec_stvx:
case Intrinsic::ppc_altivec_stvxl: case Intrinsic::ppc_altivec_stvxl:
@ -2399,7 +2399,7 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
// Turn PPC VSX stores into normal stores. // Turn PPC VSX stores into normal stores.
Type *OpPtrTy = PointerType::getUnqual(II->getArgOperand(0)->getType()); Type *OpPtrTy = PointerType::getUnqual(II->getArgOperand(0)->getType());
Value *Ptr = Builder.CreateBitCast(II->getArgOperand(1), OpPtrTy); Value *Ptr = Builder.CreateBitCast(II->getArgOperand(1), OpPtrTy);
return new StoreInst(II->getArgOperand(0), Ptr, false, Align::None()); return new StoreInst(II->getArgOperand(0), Ptr, false, Align(1));
} }
case Intrinsic::ppc_qpx_qvlfs: case Intrinsic::ppc_qpx_qvlfs:
// Turn PPC QPX qvlfs -> load if the pointer is known aligned. // Turn PPC QPX qvlfs -> load if the pointer is known aligned.

View File

@ -2362,7 +2362,7 @@ bool ModuleAddressSanitizer::InstrumentGlobals(IRBuilder<> &IRB, Module &M,
// Set meaningful attributes for indicator symbol. // Set meaningful attributes for indicator symbol.
ODRIndicatorSym->setVisibility(NewGlobal->getVisibility()); ODRIndicatorSym->setVisibility(NewGlobal->getVisibility());
ODRIndicatorSym->setDLLStorageClass(NewGlobal->getDLLStorageClass()); ODRIndicatorSym->setDLLStorageClass(NewGlobal->getDLLStorageClass());
ODRIndicatorSym->setAlignment(Align::None()); ODRIndicatorSym->setAlignment(Align(1));
ODRIndicator = ODRIndicatorSym; ODRIndicator = ODRIndicatorSym;
} }

View File

@ -789,7 +789,7 @@ bool HWAddressSanitizer::tagAlloca(IRBuilder<> &IRB, AllocaInst *AI,
// llvm.memset right here into either a sequence of stores, or a call to // llvm.memset right here into either a sequence of stores, or a call to
// hwasan_tag_memory. // hwasan_tag_memory.
if (ShadowSize) if (ShadowSize)
IRB.CreateMemSet(ShadowPtr, JustTag, ShadowSize, Align::None()); IRB.CreateMemSet(ShadowPtr, JustTag, ShadowSize, Align(1));
if (Size != AlignedSize) { if (Size != AlignedSize) {
IRB.CreateStore( IRB.CreateStore(
ConstantInt::get(Int8Ty, Size % Mapping.getObjectAlignment()), ConstantInt::get(Int8Ty, Size % Mapping.getObjectAlignment()),

View File

@ -964,7 +964,7 @@ void InstrProfiling::emitNameData() {
// On COFF, it's important to reduce the alignment down to 1 to prevent the // 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 // linker from inserting padding before the start of the names section or
// between names entries. // between names entries.
NamesVar->setAlignment(Align::None()); NamesVar->setAlignment(Align(1));
UsedVars.push_back(NamesVar); UsedVars.push_back(NamesVar);
for (auto *NamePtr : ReferencedNames) for (auto *NamePtr : ReferencedNames)

View File

@ -68,8 +68,8 @@ GlobalVariable *llvm::createPrivateGlobalForString(Module &M, StringRef Str,
GlobalValue::PrivateLinkage, StrConst, NamePrefix); GlobalValue::PrivateLinkage, StrConst, NamePrefix);
if (AllowMerging) if (AllowMerging)
GV->setUnnamedAddr(GlobalValue::UnnamedAddr::Global); GV->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
GV->setAlignment(Align::None()); // Strings may not be merged w/o setting GV->setAlignment(Align(1)); // Strings may not be merged w/o setting
// alignment explicitly. // alignment explicitly.
return GV; return GV;
} }

View File

@ -1820,7 +1820,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
IRBuilder<> IRB(&I); IRBuilder<> IRB(&I);
Value *Addr = I.getOperand(0); Value *Addr = I.getOperand(0);
Value *ShadowPtr = getShadowOriginPtr(Addr, IRB, I.getType(), Align::None(), Value *ShadowPtr = getShadowOriginPtr(Addr, IRB, I.getType(), Align(1),
/*isStore*/ true) /*isStore*/ true)
.first; .first;
@ -2453,7 +2453,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
// We don't know the pointer alignment (could be unaligned SSE store!). // We don't know the pointer alignment (could be unaligned SSE store!).
// Have to assume to worst case. // Have to assume to worst case.
std::tie(ShadowPtr, OriginPtr) = getShadowOriginPtr( std::tie(ShadowPtr, OriginPtr) = getShadowOriginPtr(
Addr, IRB, Shadow->getType(), Align::None(), /*isStore*/ true); Addr, IRB, Shadow->getType(), Align(1), /*isStore*/ true);
IRB.CreateAlignedStore(Shadow, ShadowPtr, Align(1)); IRB.CreateAlignedStore(Shadow, ShadowPtr, Align(1));
if (ClCheckAccessAddress) if (ClCheckAccessAddress)
@ -2477,7 +2477,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
if (PropagateShadow) { if (PropagateShadow) {
// We don't know the pointer alignment (could be unaligned SSE load!). // We don't know the pointer alignment (could be unaligned SSE load!).
// Have to assume to worst case. // Have to assume to worst case.
const Align Alignment = Align::None(); const Align Alignment = Align(1);
std::tie(ShadowPtr, OriginPtr) = std::tie(ShadowPtr, OriginPtr) =
getShadowOriginPtr(Addr, IRB, ShadowTy, Alignment, /*isStore*/ false); getShadowOriginPtr(Addr, IRB, ShadowTy, Alignment, /*isStore*/ false);
setShadow(&I, setShadow(&I,
@ -2868,8 +2868,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
Value* Addr = I.getArgOperand(0); Value* Addr = I.getArgOperand(0);
Type *Ty = IRB.getInt32Ty(); Type *Ty = IRB.getInt32Ty();
Value *ShadowPtr = Value *ShadowPtr =
getShadowOriginPtr(Addr, IRB, Ty, Align::None(), /*isStore*/ true) getShadowOriginPtr(Addr, IRB, Ty, Align(1), /*isStore*/ true).first;
.first;
IRB.CreateStore(getCleanShadow(Ty), IRB.CreateStore(getCleanShadow(Ty),
IRB.CreatePointerCast(ShadowPtr, Ty->getPointerTo())); IRB.CreatePointerCast(ShadowPtr, Ty->getPointerTo()));
@ -2884,7 +2883,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
IRBuilder<> IRB(&I); IRBuilder<> IRB(&I);
Value *Addr = I.getArgOperand(0); Value *Addr = I.getArgOperand(0);
Type *Ty = IRB.getInt32Ty(); Type *Ty = IRB.getInt32Ty();
const Align Alignment = Align::None(); const Align Alignment = Align(1);
Value *ShadowPtr, *OriginPtr; Value *ShadowPtr, *OriginPtr;
std::tie(ShadowPtr, OriginPtr) = std::tie(ShadowPtr, OriginPtr) =
getShadowOriginPtr(Addr, IRB, Ty, Alignment, /*isStore*/ false); getShadowOriginPtr(Addr, IRB, Ty, Alignment, /*isStore*/ false);
@ -3450,7 +3449,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
} else { } else {
Value *ShadowBase, *OriginBase; Value *ShadowBase, *OriginBase;
std::tie(ShadowBase, OriginBase) = getShadowOriginPtr( std::tie(ShadowBase, OriginBase) = getShadowOriginPtr(
&I, IRB, IRB.getInt8Ty(), Align::None(), /*isStore*/ true); &I, IRB, IRB.getInt8Ty(), Align(1), /*isStore*/ true);
Value *PoisonValue = IRB.getInt8(PoisonStack ? ClPoisonStackPattern : 0); Value *PoisonValue = IRB.getInt8(PoisonStack ? ClPoisonStackPattern : 0);
IRB.CreateMemSet(ShadowBase, PoisonValue, Len, IRB.CreateMemSet(ShadowBase, PoisonValue, Len,

View File

@ -1254,8 +1254,8 @@ static void HandleByValArgumentInit(Value *Dst, Value *Src, Module *M,
// Always generate a memcpy of alignment 1 here because we don't know // Always generate a memcpy of alignment 1 here because we don't know
// the alignment of the src pointer. Other optimizations can infer // the alignment of the src pointer. Other optimizations can infer
// better alignment. // better alignment.
Builder.CreateMemCpy(Dst, /*DstAlign*/ Align::None(), Src, Builder.CreateMemCpy(Dst, /*DstAlign*/ Align(1), Src,
/*SrcAlign*/ Align::None(), Size); /*SrcAlign*/ Align(1), Size);
} }
/// When inlining a call site that has a byval argument, /// When inlining a call site that has a byval argument,

View File

@ -177,8 +177,7 @@ static bool canTransformToMemCmp(CallInst *CI, Value *Str, uint64_t Len,
if (!isOnlyUsedInComparisonWithZero(CI)) if (!isOnlyUsedInComparisonWithZero(CI))
return false; return false;
if (!isDereferenceableAndAlignedPointer(Str, Align::None(), APInt(64, Len), if (!isDereferenceableAndAlignedPointer(Str, Align(1), APInt(64, Len), DL))
DL))
return false; return false;
if (CI->getFunction()->hasFnAttribute(Attribute::SanitizeMemory)) if (CI->getFunction()->hasFnAttribute(Attribute::SanitizeMemory))
@ -289,7 +288,7 @@ Value *LibCallSimplifier::emitStrLenMemCpy(Value *Src, Value *Dst, uint64_t Len,
// We have enough information to now generate the memcpy call to do the // We have enough information to now generate the memcpy call to do the
// concatenation for us. Make a memcpy to copy the nul byte with align = 1. // concatenation for us. Make a memcpy to copy the nul byte with align = 1.
B.CreateMemCpy( B.CreateMemCpy(
CpyDst, Align::None(), Src, Align::None(), CpyDst, Align(1), Src, Align(1),
ConstantInt::get(DL.getIntPtrType(Src->getContext()), Len + 1)); ConstantInt::get(DL.getIntPtrType(Src->getContext()), Len + 1));
return Dst; return Dst;
} }
@ -562,7 +561,7 @@ Value *LibCallSimplifier::optimizeStrCpy(CallInst *CI, IRBuilder<> &B) {
// We have enough information to now generate the memcpy call to do the // We have enough information to now generate the memcpy call to do the
// copy for us. Make a memcpy to copy the nul byte with align = 1. // copy for us. Make a memcpy to copy the nul byte with align = 1.
CallInst *NewCI = CallInst *NewCI =
B.CreateMemCpy(Dst, Align::None(), Src, Align::None(), B.CreateMemCpy(Dst, Align(1), Src, Align(1),
ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len)); ConstantInt::get(DL.getIntPtrType(CI->getContext()), Len));
NewCI->setAttributes(CI->getAttributes()); NewCI->setAttributes(CI->getAttributes());
return Dst; return Dst;
@ -590,8 +589,7 @@ Value *LibCallSimplifier::optimizeStpCpy(CallInst *CI, IRBuilder<> &B) {
// We have enough information to now generate the memcpy call to do the // We have enough information to now generate the memcpy call to do the
// copy for us. Make a memcpy to copy the nul byte with align = 1. // copy for us. Make a memcpy to copy the nul byte with align = 1.
CallInst *NewCI = CallInst *NewCI = B.CreateMemCpy(Dst, Align(1), Src, Align(1), LenV);
B.CreateMemCpy(Dst, Align::None(), Src, Align::None(), LenV);
NewCI->setAttributes(CI->getAttributes()); NewCI->setAttributes(CI->getAttributes());
return DstEnd; return DstEnd;
} }
@ -626,7 +624,7 @@ Value *LibCallSimplifier::optimizeStrNCpy(CallInst *CI, IRBuilder<> &B) {
if (SrcLen == 0) { if (SrcLen == 0) {
// strncpy(x, "", y) -> memset(align 1 x, '\0', y) // strncpy(x, "", y) -> memset(align 1 x, '\0', y)
CallInst *NewCI = B.CreateMemSet(Dst, B.getInt8('\0'), Size, Align::None()); CallInst *NewCI = B.CreateMemSet(Dst, B.getInt8('\0'), Size, Align(1));
AttrBuilder ArgAttrs(CI->getAttributes().getParamAttributes(0)); AttrBuilder ArgAttrs(CI->getAttributes().getParamAttributes(0));
NewCI->setAttributes(NewCI->getAttributes().addParamAttributes( NewCI->setAttributes(NewCI->getAttributes().addParamAttributes(
CI->getContext(), 0, ArgAttrs)); CI->getContext(), 0, ArgAttrs));
@ -639,7 +637,7 @@ Value *LibCallSimplifier::optimizeStrNCpy(CallInst *CI, IRBuilder<> &B) {
Type *PT = Callee->getFunctionType()->getParamType(0); Type *PT = Callee->getFunctionType()->getParamType(0);
// strncpy(x, s, c) -> memcpy(align 1 x, align 1 s, c) [s and c are constant] // strncpy(x, s, c) -> memcpy(align 1 x, align 1 s, c) [s and c are constant]
CallInst *NewCI = B.CreateMemCpy(Dst, Align::None(), Src, Align::None(), CallInst *NewCI = B.CreateMemCpy(Dst, Align(1), Src, Align(1),
ConstantInt::get(DL.getIntPtrType(PT), Len)); ConstantInt::get(DL.getIntPtrType(PT), Len));
NewCI->setAttributes(CI->getAttributes()); NewCI->setAttributes(CI->getAttributes());
return Dst; return Dst;
@ -1116,8 +1114,8 @@ Value *LibCallSimplifier::optimizeMemCpy(CallInst *CI, IRBuilder<> &B) {
return nullptr; return nullptr;
// memcpy(x, y, n) -> llvm.memcpy(align 1 x, align 1 y, n) // memcpy(x, y, n) -> llvm.memcpy(align 1 x, align 1 y, n)
CallInst *NewCI = B.CreateMemCpy(CI->getArgOperand(0), Align::None(), CallInst *NewCI = B.CreateMemCpy(CI->getArgOperand(0), Align(1),
CI->getArgOperand(1), Align::None(), Size); CI->getArgOperand(1), Align(1), Size);
NewCI->setAttributes(CI->getAttributes()); NewCI->setAttributes(CI->getAttributes());
return CI->getArgOperand(0); return CI->getArgOperand(0);
} }
@ -1146,8 +1144,7 @@ Value *LibCallSimplifier::optimizeMemCCpy(CallInst *CI, IRBuilder<> &B) {
size_t Pos = SrcStr.find(StopChar->getSExtValue() & 0xFF); size_t Pos = SrcStr.find(StopChar->getSExtValue() & 0xFF);
if (Pos == StringRef::npos) { if (Pos == StringRef::npos) {
if (N->getZExtValue() <= SrcStr.size()) { if (N->getZExtValue() <= SrcStr.size()) {
B.CreateMemCpy(Dst, Align::None(), Src, Align::None(), B.CreateMemCpy(Dst, Align(1), Src, Align(1), CI->getArgOperand(3));
CI->getArgOperand(3));
return Constant::getNullValue(CI->getType()); return Constant::getNullValue(CI->getType());
} }
return nullptr; return nullptr;
@ -1156,7 +1153,7 @@ Value *LibCallSimplifier::optimizeMemCCpy(CallInst *CI, IRBuilder<> &B) {
Value *NewN = Value *NewN =
ConstantInt::get(N->getType(), std::min(uint64_t(Pos + 1), N->getZExtValue())); ConstantInt::get(N->getType(), std::min(uint64_t(Pos + 1), N->getZExtValue()));
// memccpy -> llvm.memcpy // memccpy -> llvm.memcpy
B.CreateMemCpy(Dst, Align::None(), Src, Align::None(), NewN); B.CreateMemCpy(Dst, Align(1), Src, Align(1), NewN);
return Pos + 1 <= N->getZExtValue() return Pos + 1 <= N->getZExtValue()
? B.CreateInBoundsGEP(B.getInt8Ty(), Dst, NewN) ? B.CreateInBoundsGEP(B.getInt8Ty(), Dst, NewN)
: Constant::getNullValue(CI->getType()); : Constant::getNullValue(CI->getType());
@ -1166,8 +1163,8 @@ Value *LibCallSimplifier::optimizeMemPCpy(CallInst *CI, IRBuilder<> &B) {
Value *Dst = CI->getArgOperand(0); Value *Dst = CI->getArgOperand(0);
Value *N = CI->getArgOperand(2); Value *N = CI->getArgOperand(2);
// mempcpy(x, y, n) -> llvm.memcpy(align 1 x, align 1 y, n), x + n // mempcpy(x, y, n) -> llvm.memcpy(align 1 x, align 1 y, n), x + n
CallInst *NewCI = B.CreateMemCpy(Dst, Align::None(), CI->getArgOperand(1), CallInst *NewCI =
Align::None(), N); B.CreateMemCpy(Dst, Align(1), CI->getArgOperand(1), Align(1), N);
NewCI->setAttributes(CI->getAttributes()); NewCI->setAttributes(CI->getAttributes());
return B.CreateInBoundsGEP(B.getInt8Ty(), Dst, N); return B.CreateInBoundsGEP(B.getInt8Ty(), Dst, N);
} }
@ -1179,8 +1176,8 @@ Value *LibCallSimplifier::optimizeMemMove(CallInst *CI, IRBuilder<> &B) {
return nullptr; return nullptr;
// memmove(x, y, n) -> llvm.memmove(align 1 x, align 1 y, n) // memmove(x, y, n) -> llvm.memmove(align 1 x, align 1 y, n)
CallInst *NewCI = B.CreateMemMove(CI->getArgOperand(0), Align::None(), CallInst *NewCI = B.CreateMemMove(CI->getArgOperand(0), Align(1),
CI->getArgOperand(1), Align::None(), Size); CI->getArgOperand(1), Align(1), Size);
NewCI->setAttributes(CI->getAttributes()); NewCI->setAttributes(CI->getAttributes());
return CI->getArgOperand(0); return CI->getArgOperand(0);
} }
@ -1240,8 +1237,7 @@ Value *LibCallSimplifier::optimizeMemSet(CallInst *CI, IRBuilder<> &B) {
// memset(p, v, n) -> llvm.memset(align 1 p, v, n) // memset(p, v, n) -> llvm.memset(align 1 p, v, n)
Value *Val = B.CreateIntCast(CI->getArgOperand(1), B.getInt8Ty(), false); Value *Val = B.CreateIntCast(CI->getArgOperand(1), B.getInt8Ty(), false);
CallInst *NewCI = CallInst *NewCI = B.CreateMemSet(CI->getArgOperand(0), Val, Size, Align(1));
B.CreateMemSet(CI->getArgOperand(0), Val, Size, Align::None());
NewCI->setAttributes(CI->getAttributes()); NewCI->setAttributes(CI->getAttributes());
return CI->getArgOperand(0); return CI->getArgOperand(0);
} }
@ -2477,8 +2473,7 @@ Value *LibCallSimplifier::optimizeSPrintFString(CallInst *CI, IRBuilder<> &B) {
// sprintf(str, fmt) -> llvm.memcpy(align 1 str, align 1 fmt, strlen(fmt)+1) // sprintf(str, fmt) -> llvm.memcpy(align 1 str, align 1 fmt, strlen(fmt)+1)
B.CreateMemCpy( B.CreateMemCpy(
CI->getArgOperand(0), Align::None(), CI->getArgOperand(1), CI->getArgOperand(0), Align(1), CI->getArgOperand(1), Align(1),
Align::None(),
ConstantInt::get(DL.getIntPtrType(CI->getContext()), ConstantInt::get(DL.getIntPtrType(CI->getContext()),
FormatStr.size() + 1)); // Copy the null byte. FormatStr.size() + 1)); // Copy the null byte.
return ConstantInt::get(CI->getType(), FormatStr.size()); return ConstantInt::get(CI->getType(), FormatStr.size());
@ -2515,8 +2510,8 @@ Value *LibCallSimplifier::optimizeSPrintFString(CallInst *CI, IRBuilder<> &B) {
return nullptr; return nullptr;
Value *IncLen = Value *IncLen =
B.CreateAdd(Len, ConstantInt::get(Len->getType(), 1), "leninc"); B.CreateAdd(Len, ConstantInt::get(Len->getType(), 1), "leninc");
B.CreateMemCpy(CI->getArgOperand(0), Align::None(), CI->getArgOperand(2), B.CreateMemCpy(CI->getArgOperand(0), Align(1), CI->getArgOperand(2),
Align::None(), IncLen); Align(1), IncLen);
// The sprintf result is the unincremented number of bytes in the string. // The sprintf result is the unincremented number of bytes in the string.
return B.CreateIntCast(Len, CI->getType(), false); return B.CreateIntCast(Len, CI->getType(), false);
@ -2587,8 +2582,7 @@ Value *LibCallSimplifier::optimizeSnPrintFString(CallInst *CI, IRBuilder<> &B) {
// snprintf(dst, size, fmt) -> llvm.memcpy(align 1 dst, align 1 fmt, // snprintf(dst, size, fmt) -> llvm.memcpy(align 1 dst, align 1 fmt,
// strlen(fmt)+1) // strlen(fmt)+1)
B.CreateMemCpy( B.CreateMemCpy(
CI->getArgOperand(0), Align::None(), CI->getArgOperand(2), CI->getArgOperand(0), Align(1), CI->getArgOperand(2), Align(1),
Align::None(),
ConstantInt::get(DL.getIntPtrType(CI->getContext()), ConstantInt::get(DL.getIntPtrType(CI->getContext()),
FormatStr.size() + 1)); // Copy the null byte. FormatStr.size() + 1)); // Copy the null byte.
return ConstantInt::get(CI->getType(), FormatStr.size()); return ConstantInt::get(CI->getType(), FormatStr.size());
@ -2629,9 +2623,8 @@ Value *LibCallSimplifier::optimizeSnPrintFString(CallInst *CI, IRBuilder<> &B) {
else if (N < Str.size() + 1) else if (N < Str.size() + 1)
return nullptr; return nullptr;
B.CreateMemCpy(CI->getArgOperand(0), Align::None(), CI->getArgOperand(3), B.CreateMemCpy(CI->getArgOperand(0), Align(1), CI->getArgOperand(3),
Align::None(), Align(1), ConstantInt::get(CI->getType(), Str.size() + 1));
ConstantInt::get(CI->getType(), Str.size() + 1));
// The snprintf result is the unincremented number of bytes in the string. // The snprintf result is the unincremented number of bytes in the string.
return ConstantInt::get(CI->getType(), Str.size()); return ConstantInt::get(CI->getType(), Str.size());
@ -2848,9 +2841,8 @@ Value *LibCallSimplifier::optimizePuts(CallInst *CI, IRBuilder<> &B) {
Value *LibCallSimplifier::optimizeBCopy(CallInst *CI, IRBuilder<> &B) { Value *LibCallSimplifier::optimizeBCopy(CallInst *CI, IRBuilder<> &B) {
// bcopy(src, dst, n) -> llvm.memmove(dst, src, n) // bcopy(src, dst, n) -> llvm.memmove(dst, src, n)
return B.CreateMemMove(CI->getArgOperand(1), Align::None(), return B.CreateMemMove(CI->getArgOperand(1), Align(1), CI->getArgOperand(0),
CI->getArgOperand(0), Align::None(), Align(1), CI->getArgOperand(2));
CI->getArgOperand(2));
} }
bool LibCallSimplifier::hasFloatVersion(StringRef FuncName) { bool LibCallSimplifier::hasFloatVersion(StringRef FuncName) {
@ -3282,9 +3274,9 @@ FortifiedLibCallSimplifier::isFortifiedCallFoldable(CallInst *CI,
Value *FortifiedLibCallSimplifier::optimizeMemCpyChk(CallInst *CI, Value *FortifiedLibCallSimplifier::optimizeMemCpyChk(CallInst *CI,
IRBuilder<> &B) { IRBuilder<> &B) {
if (isFortifiedCallFoldable(CI, 3, 2)) { if (isFortifiedCallFoldable(CI, 3, 2)) {
CallInst *NewCI = B.CreateMemCpy(CI->getArgOperand(0), Align::None(), CallInst *NewCI =
CI->getArgOperand(1), Align::None(), B.CreateMemCpy(CI->getArgOperand(0), Align(1), CI->getArgOperand(1),
CI->getArgOperand(2)); Align(1), CI->getArgOperand(2));
NewCI->setAttributes(CI->getAttributes()); NewCI->setAttributes(CI->getAttributes());
return CI->getArgOperand(0); return CI->getArgOperand(0);
} }
@ -3294,9 +3286,9 @@ Value *FortifiedLibCallSimplifier::optimizeMemCpyChk(CallInst *CI,
Value *FortifiedLibCallSimplifier::optimizeMemMoveChk(CallInst *CI, Value *FortifiedLibCallSimplifier::optimizeMemMoveChk(CallInst *CI,
IRBuilder<> &B) { IRBuilder<> &B) {
if (isFortifiedCallFoldable(CI, 3, 2)) { if (isFortifiedCallFoldable(CI, 3, 2)) {
CallInst *NewCI = B.CreateMemMove(CI->getArgOperand(0), Align::None(), CallInst *NewCI =
CI->getArgOperand(1), Align::None(), B.CreateMemMove(CI->getArgOperand(0), Align(1), CI->getArgOperand(1),
CI->getArgOperand(2)); Align(1), CI->getArgOperand(2));
NewCI->setAttributes(CI->getAttributes()); NewCI->setAttributes(CI->getAttributes());
return CI->getArgOperand(0); return CI->getArgOperand(0);
} }
@ -3310,7 +3302,7 @@ Value *FortifiedLibCallSimplifier::optimizeMemSetChk(CallInst *CI,
if (isFortifiedCallFoldable(CI, 3, 2)) { if (isFortifiedCallFoldable(CI, 3, 2)) {
Value *Val = B.CreateIntCast(CI->getArgOperand(1), B.getInt8Ty(), false); Value *Val = B.CreateIntCast(CI->getArgOperand(1), B.getInt8Ty(), false);
CallInst *NewCI = B.CreateMemSet(CI->getArgOperand(0), Val, CallInst *NewCI = B.CreateMemSet(CI->getArgOperand(0), Val,
CI->getArgOperand(2), Align::None()); CI->getArgOperand(2), Align(1));
NewCI->setAttributes(CI->getAttributes()); NewCI->setAttributes(CI->getAttributes());
return CI->getArgOperand(0); return CI->getArgOperand(0);
} }

View File

@ -52,7 +52,6 @@ std::vector<uint64_t> getValidAlignments() {
TEST(AlignmentTest, AlignDefaultCTor) { TEST(AlignmentTest, AlignDefaultCTor) {
EXPECT_EQ(Align().value(), 1ULL); EXPECT_EQ(Align().value(), 1ULL);
EXPECT_EQ(Align::None().value(), 1ULL);
} }
TEST(AlignmentTest, MaybeAlignDefaultCTor) { TEST(AlignmentTest, MaybeAlignDefaultCTor) {

View File

@ -468,7 +468,7 @@ GlobalVariable *ParallelLoopGeneratorKMP::createSourceLocation() {
// Global Variable Definitions // Global Variable Definitions
GlobalVariable *StrVar = new GlobalVariable( GlobalVariable *StrVar = new GlobalVariable(
*M, ArrayType, true, GlobalValue::PrivateLinkage, 0, ".str.ident"); *M, ArrayType, true, GlobalValue::PrivateLinkage, 0, ".str.ident");
StrVar->setAlignment(llvm::Align::None()); StrVar->setAlignment(llvm::Align(1));
SourceLocDummy = new GlobalVariable( SourceLocDummy = new GlobalVariable(
*M, IdentTy, true, GlobalValue::PrivateLinkage, nullptr, LocName); *M, IdentTy, true, GlobalValue::PrivateLinkage, nullptr, LocName);