[Attributor][NFC] Refactor interface

This commit is contained in:
Johannes Doerfert 2020-02-20 02:02:57 -06:00
parent 2d214fefe5
commit dec8fd7748
2 changed files with 26 additions and 22 deletions

View File

@ -411,22 +411,6 @@ struct IRPosition {
SmallVectorImpl<Attribute> &Attrs,
bool IgnoreSubsumingPositions = false) const;
/// Return the attribute of kind \p AK existing in the IR at this position.
Attribute getAttr(Attribute::AttrKind AK) const {
if (getPositionKind() == IRP_INVALID || getPositionKind() == IRP_FLOAT)
return Attribute();
AttributeList AttrList;
if (ImmutableCallSite ICS = ImmutableCallSite(&getAnchorValue()))
AttrList = ICS.getAttributes();
else
AttrList = getAssociatedFunction()->getAttributes();
if (AttrList.hasAttribute(getAttrIdx(), AK))
return AttrList.getAttribute(getAttrIdx(), AK);
return Attribute();
}
/// Remove the attribute of kind \p AKs existing in the IR at this position.
void removeAttrs(ArrayRef<Attribute::AttrKind> AKs) const {
if (getPositionKind() == IRP_INVALID || getPositionKind() == IRP_FLOAT)
@ -481,6 +465,10 @@ private:
/// Verify internal invariants.
void verify();
/// Return the attributes of kind \p AK existing in the IR as attribute.
bool getAttrsFromIRAttr(Attribute::AttrKind AK,
SmallVectorImpl<Attribute> &Attrs) const;
protected:
/// The value this position is anchored at.
Value *AnchorVal;

View File

@ -678,9 +678,10 @@ SubsumingPositionIterator::SubsumingPositionIterator(const IRPosition &IRP) {
bool IRPosition::hasAttr(ArrayRef<Attribute::AttrKind> AKs,
bool IgnoreSubsumingPositions) const {
SmallVector<Attribute, 4> Attrs;
for (const IRPosition &EquivIRP : SubsumingPositionIterator(*this)) {
for (Attribute::AttrKind AK : AKs)
if (EquivIRP.getAttr(AK).getKindAsEnum() == AK)
if (EquivIRP.getAttrsFromIRAttr(AK, Attrs))
return true;
// The first position returned by the SubsumingPositionIterator is
// always the position itself. If we ignore subsuming positions we
@ -695,11 +696,8 @@ void IRPosition::getAttrs(ArrayRef<Attribute::AttrKind> AKs,
SmallVectorImpl<Attribute> &Attrs,
bool IgnoreSubsumingPositions) const {
for (const IRPosition &EquivIRP : SubsumingPositionIterator(*this)) {
for (Attribute::AttrKind AK : AKs) {
const Attribute &Attr = EquivIRP.getAttr(AK);
if (Attr.getKindAsEnum() == AK)
Attrs.push_back(Attr);
}
for (Attribute::AttrKind AK : AKs)
EquivIRP.getAttrsFromIRAttr(AK, Attrs);
// The first position returned by the SubsumingPositionIterator is
// always the position itself. If we ignore subsuming positions we
// are done after the first iteration.
@ -708,6 +706,24 @@ void IRPosition::getAttrs(ArrayRef<Attribute::AttrKind> AKs,
}
}
bool IRPosition::getAttrsFromIRAttr(Attribute::AttrKind AK,
SmallVectorImpl<Attribute> &Attrs) const {
if (getPositionKind() == IRP_INVALID || getPositionKind() == IRP_FLOAT)
return false;
AttributeList AttrList;
if (ImmutableCallSite ICS = ImmutableCallSite(&getAnchorValue()))
AttrList = ICS.getAttributes();
else
AttrList = getAssociatedFunction()->getAttributes();
bool HasAttr = AttrList.hasAttribute(getAttrIdx(), AK);
if (HasAttr)
Attrs.push_back(AttrList.getAttribute(getAttrIdx(), AK));
return HasAttr;
}
void IRPosition::verify() {
switch (KindOrArgNo) {
default: