[Attributor] Manifest load/store alignment generally

Summary:
Any pointer could have load/store users not only floating ones so we
move the manifest logic for alignment into the AAAlignImpl class.

Reviewers: uenoku, sstefan1

Subscribers: hiraditya, bollu, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D66922

llvm-svn: 370479
This commit is contained in:
Johannes Doerfert 2019-08-30 15:22:28 +00:00
parent c2fed1dc8a
commit 81df452d82
2 changed files with 27 additions and 25 deletions

View File

@ -2185,30 +2185,6 @@ struct AAAlignImpl : AAAlign {
takeKnownMaximum(Attr.getValueAsInt()); takeKnownMaximum(Attr.getValueAsInt());
} }
// TODO: Provide a helper to determine the implied ABI alignment and check in
// the existing manifest method and a new one for AAAlignImpl that value
// to avoid making the alignment explicit if it did not improve.
/// See AbstractAttribute::getDeducedAttributes
virtual void
getDeducedAttributes(LLVMContext &Ctx,
SmallVectorImpl<Attribute> &Attrs) const override {
if (getAssumedAlign() > 1)
Attrs.emplace_back(Attribute::getWithAlignment(Ctx, getAssumedAlign()));
}
/// See AbstractAttribute::getAsStr().
const std::string getAsStr() const override {
return getAssumedAlign() ? ("align<" + std::to_string(getKnownAlign()) +
"-" + std::to_string(getAssumedAlign()) + ">")
: "unknown-align";
}
};
/// Align attribute for a floating value.
struct AAAlignFloating : AAAlignImpl {
AAAlignFloating(const IRPosition &IRP) : AAAlignImpl(IRP) {}
/// See AbstractAttribute::manifest(...). /// See AbstractAttribute::manifest(...).
ChangeStatus manifest(Attributor &A) override { ChangeStatus manifest(Attributor &A) override {
ChangeStatus Changed = ChangeStatus::UNCHANGED; ChangeStatus Changed = ChangeStatus::UNCHANGED;
@ -2235,9 +2211,33 @@ struct AAAlignFloating : AAAlignImpl {
} }
} }
return AAAlignImpl::manifest(A) | Changed; return AAAlign::manifest(A) | Changed;
} }
// TODO: Provide a helper to determine the implied ABI alignment and check in
// the existing manifest method and a new one for AAAlignImpl that value
// to avoid making the alignment explicit if it did not improve.
/// See AbstractAttribute::getDeducedAttributes
virtual void
getDeducedAttributes(LLVMContext &Ctx,
SmallVectorImpl<Attribute> &Attrs) const override {
if (getAssumedAlign() > 1)
Attrs.emplace_back(Attribute::getWithAlignment(Ctx, getAssumedAlign()));
}
/// See AbstractAttribute::getAsStr().
const std::string getAsStr() const override {
return getAssumedAlign() ? ("align<" + std::to_string(getKnownAlign()) +
"-" + std::to_string(getAssumedAlign()) + ">")
: "unknown-align";
}
};
/// Align attribute for a floating value.
struct AAAlignFloating : AAAlignImpl {
AAAlignFloating(const IRPosition &IRP) : AAAlignImpl(IRP) {}
/// See AbstractAttribute::updateImpl(...). /// See AbstractAttribute::updateImpl(...).
ChangeStatus updateImpl(Attributor &A) override { ChangeStatus updateImpl(Attributor &A) override {
const DataLayout &DL = A.getDataLayout(); const DataLayout &DL = A.getDataLayout();

View File

@ -90,6 +90,8 @@ define internal i8* @f1(i8* readnone %0) local_unnamed_addr #0 {
; <label>:3: ; preds = %1 ; <label>:3: ; preds = %1
; ATTRIBUTOR: %4 = tail call i8* @f2(i8* nonnull align 8 dereferenceable(1) @a1) ; ATTRIBUTOR: %4 = tail call i8* @f2(i8* nonnull align 8 dereferenceable(1) @a1)
%4 = tail call i8* @f2(i8* nonnull @a1) %4 = tail call i8* @f2(i8* nonnull @a1)
; ATTRIBUTOR: %l = load i8, i8* %4, align 8
%l = load i8, i8* %4
br label %5 br label %5
; <label>:5: ; preds = %1, %3 ; <label>:5: ; preds = %1, %3