[Attributor][NFC] Simplify the IRPosition interface

We pretended IRPosition came either as mutable or immutable objects
while they are basically always immutable, with a single (existing)
unfortunate exceptions. This patch cleans up the uses to deal with the
immutable version.
This commit is contained in:
Johannes Doerfert 2019-10-20 22:46:48 -05:00
parent 4318d3c64c
commit b2083c5382
2 changed files with 16 additions and 68 deletions

View File

@ -252,22 +252,14 @@ struct IRPosition {
/// sufficient to determine where arguments will be manifested. This is, so
/// far, only the case for call site arguments as the value is not sufficient
/// to pinpoint them. Instead, we can use the call site as an anchor.
///
///{
Value &getAnchorValue() {
Value &getAnchorValue() const {
assert(KindOrArgNo != IRP_INVALID &&
"Invalid position does not have an anchor value!");
return *AnchorVal;
}
const Value &getAnchorValue() const {
return const_cast<IRPosition *>(this)->getAnchorValue();
}
///}
/// Return the associated function, if any.
///
///{
Function *getAssociatedFunction() {
Function *getAssociatedFunction() const {
if (auto *CB = dyn_cast<CallBase>(AnchorVal))
return CB->getCalledFunction();
assert(KindOrArgNo != IRP_INVALID &&
@ -281,15 +273,9 @@ struct IRPosition {
return cast<Instruction>(V).getFunction();
return nullptr;
}
const Function *getAssociatedFunction() const {
return const_cast<IRPosition *>(this)->getAssociatedFunction();
}
///}
/// Return the associated argument, if any.
///
///{
Argument *getAssociatedArgument() {
Argument *getAssociatedArgument() const {
if (auto *Arg = dyn_cast<Argument>(&getAnchorValue()))
return Arg;
int ArgNo = getArgNo();
@ -300,10 +286,6 @@ struct IRPosition {
return nullptr;
return AssociatedFn->arg_begin() + ArgNo;
}
const Argument *getAssociatedArgument() const {
return const_cast<IRPosition *>(this)->getAssociatedArgument();
}
///}
/// Return true if the position refers to a function interface, that is the
/// function scope, the function return, or an argumnt.
@ -319,9 +301,7 @@ struct IRPosition {
}
/// Return the Function surrounding the anchor value.
///
///{
Function *getAnchorScope() {
Function *getAnchorScope() const {
Value &V = getAnchorValue();
if (isa<Function>(V))
return &cast<Function>(V);
@ -331,15 +311,9 @@ struct IRPosition {
return cast<Instruction>(V).getFunction();
return nullptr;
}
const Function *getAnchorScope() const {
return const_cast<IRPosition *>(this)->getAnchorScope();
}
///}
/// Return the context instruction, if any.
///
///{
Instruction *getCtxI() {
Instruction *getCtxI() const {
Value &V = getAnchorValue();
if (auto *I = dyn_cast<Instruction>(&V))
return I;
@ -351,15 +325,9 @@ struct IRPosition {
return &(F->getEntryBlock().front());
return nullptr;
}
const Instruction *getCtxI() const {
return const_cast<IRPosition *>(this)->getCtxI();
}
///}
/// Return the value this abstract attribute is associated with.
///
///{
Value &getAssociatedValue() {
Value &getAssociatedValue() const {
assert(KindOrArgNo != IRP_INVALID &&
"Invalid position does not have an associated value!");
if (getArgNo() < 0 || isa<Argument>(AnchorVal))
@ -367,10 +335,6 @@ struct IRPosition {
assert(isa<CallBase>(AnchorVal) && "Expected a call base!");
return *cast<CallBase>(AnchorVal)->getArgOperand(getArgNo());
}
const Value &getAssociatedValue() const {
return const_cast<IRPosition *>(this)->getAssociatedValue();
}
///}
/// Return the argument number of the associated value if it is an argument or
/// call site argument, otherwise a negative value.
@ -449,7 +413,7 @@ struct IRPosition {
}
/// Remove the attribute of kind \p AKs existing in the IR at this position.
void removeAttrs(ArrayRef<Attribute::AttrKind> AKs) {
void removeAttrs(ArrayRef<Attribute::AttrKind> AKs) const {
if (getPositionKind() == IRP_INVALID || getPositionKind() == IRP_FLOAT)
return;
@ -502,6 +466,7 @@ private:
/// Verify internal invariants.
void verify();
protected:
/// The value this position is anchored at.
Value *AnchorVal;
@ -785,7 +750,7 @@ struct Attributor {
"'AbstractAttribute'!");
// Put the attribute in the lookup map structure and the container we use to
// keep track of all attributes.
IRPosition &IRP = AA.getIRPosition();
const IRPosition &IRP = AA.getIRPosition();
auto &KindToAbstractAttributeMap = AAMap[IRP];
assert(!KindToAbstractAttributeMap.count(&AAType::ID) &&
"Attribute already in map!");
@ -1320,7 +1285,7 @@ private:
/// Helper struct necessary as the modular build fails if the virtual method
/// IRAttribute::manifest is defined in the Attributor.cpp.
struct IRAttributeManifest {
static ChangeStatus manifestAttrs(Attributor &A, IRPosition &IRP,
static ChangeStatus manifestAttrs(Attributor &A, const IRPosition &IRP,
const ArrayRef<Attribute> &DeducedAttrs);
};
@ -1383,11 +1348,7 @@ struct IRAttribute : public IRPosition, public Base {
}
/// Return an IR position, see struct IRPosition.
///
///{
IRPosition &getIRPosition() override { return *this; }
const IRPosition &getIRPosition() const override { return *this; }
///}
};
/// Base struct for all "concrete attribute" deductions.
@ -1492,9 +1453,6 @@ protected:
/// add statistics for them.
virtual void trackStatistics() const = 0;
/// Return an IR position, see struct IRPosition.
virtual IRPosition &getIRPosition() = 0;
/// The actual update/transfer function which has to be implemented by the
/// derived classes.
///
@ -1751,11 +1709,7 @@ struct AAIsDead : public StateWrapper<BooleanState, AbstractAttribute>,
}
/// Return an IR position, see struct IRPosition.
///
///{
IRPosition &getIRPosition() override { return *this; }
const IRPosition &getIRPosition() const override { return *this; }
///}
/// Create an abstract attribute view for the position \p IRP.
static AAIsDead &createForPosition(const IRPosition &IRP, Attributor &A);
@ -1957,11 +1911,7 @@ struct AAValueSimplify : public StateWrapper<BooleanState, AbstractAttribute>,
AAValueSimplify(const IRPosition &IRP) : IRPosition(IRP) {}
/// Return an IR position, see struct IRPosition.
///
///{
IRPosition &getIRPosition() { return *this; }
const IRPosition &getIRPosition() const { return *this; }
///}
/// Return an assumed simplified value if a single candidate is found. If
/// there cannot be one, return original value. If it is not clear yet, return
@ -1987,11 +1937,7 @@ struct AAHeapToStack : public StateWrapper<BooleanState, AbstractAttribute>,
bool isKnownHeapToStack() const { return getKnown(); }
/// Return an IR position, see struct IRPosition.
///
///{
IRPosition &getIRPosition() { return *this; }
const IRPosition &getIRPosition() const { return *this; }
///}
/// Create an abstract attribute view for the position \p IRP.
static AAHeapToStack &createForPosition(const IRPosition &IRP, Attributor &A);

View File

@ -328,7 +328,7 @@ ChangeStatus AbstractAttribute::update(Attributor &A) {
}
ChangeStatus
IRAttributeManifest::manifestAttrs(Attributor &A, IRPosition &IRP,
IRAttributeManifest::manifestAttrs(Attributor &A, const IRPosition &IRP,
const ArrayRef<Attribute> &DeducedAttrs) {
Function *ScopeFn = IRP.getAssociatedFunction();
IRPosition::Kind PK = IRP.getPositionKind();
@ -705,7 +705,7 @@ struct AAFromMustBeExecutedContext : public Base {
void initialize(Attributor &A) override {
Base::initialize(A);
IRPosition &IRP = this->getIRPosition();
const IRPosition &IRP = this->getIRPosition();
Instruction *CtxI = IRP.getCtxI();
if (!CtxI)
@ -987,7 +987,9 @@ ChangeStatus AAReturnedValuesImpl::manifest(Attributor &A) {
// If the assumed unique return value is an argument, annotate it.
if (auto *UniqueRVArg = dyn_cast<Argument>(UniqueRV.getValue())) {
getIRPosition() = IRPosition::argument(*UniqueRVArg);
// TODO: This should be handled differently!
this->AnchorVal = UniqueRVArg;
this->KindOrArgNo = UniqueRVArg->getArgNo();
Changed = IRAttribute::manifest(A);
} else if (auto *RVC = dyn_cast<Constant>(UniqueRV.getValue())) {
// We can replace the returned value with the unique returned constant.
@ -3816,7 +3818,7 @@ struct AAMemoryBehaviorImpl : public AAMemoryBehavior {
/// See AbstractAttribute::manifest(...).
ChangeStatus manifest(Attributor &A) override {
IRPosition &IRP = getIRPosition();
const IRPosition &IRP = getIRPosition();
// Check if we would improve the existing attributes first.
SmallVector<Attribute, 4> DeducedAttrs;