forked from OSchip/llvm-project
[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:
parent
c2fed1dc8a
commit
81df452d82
|
@ -2185,30 +2185,6 @@ struct AAAlignImpl : AAAlign {
|
|||
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(...).
|
||||
ChangeStatus manifest(Attributor &A) override {
|
||||
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(...).
|
||||
ChangeStatus updateImpl(Attributor &A) override {
|
||||
const DataLayout &DL = A.getDataLayout();
|
||||
|
|
|
@ -90,6 +90,8 @@ define internal i8* @f1(i8* readnone %0) local_unnamed_addr #0 {
|
|||
; <label>:3: ; preds = %1
|
||||
; ATTRIBUTOR: %4 = tail call i8* @f2(i8* nonnull align 8 dereferenceable(1) @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
|
||||
|
||||
; <label>:5: ; preds = %1, %3
|
||||
|
|
Loading…
Reference in New Issue