[Attributor] Fix the "clamp" operator

The clamp operator should not take the known of the given state as the
known is potentially based on assumed information. This also adds TODOs
to guide improvements.

llvm-svn: 369327
This commit is contained in:
Johannes Doerfert 2019-08-20 05:57:01 +00:00
parent a08e139d50
commit 028b2aa56a
2 changed files with 12 additions and 3 deletions

View File

@ -890,10 +890,13 @@ struct IntegerState : public AbstractState {
/// Inequality for IntegerState.
bool operator!=(const IntegerState &R) const { return !(*this == R); }
/// "Clamp" this state with \p R. The result is the maximum of the known
/// information but the minimum of the assumed.
/// "Clamp" this state with \p R. The result is the minimum of the assumed
/// information but not less than what was known before.
///
/// TODO: Consider replacing the operator with a call or using it only when
/// we can also take the maximum of the known information, thus when
/// \p R is not dependent on additional assumed state.
IntegerState operator^=(const IntegerState &R) {
takeKnownMaximum(R.Known);
takeAssumedMinimum(R.Assumed);
return *this;
}

View File

@ -526,6 +526,8 @@ struct AAReturnedFromReturnedValues : public AAType {
ChangeStatus updateImpl(Attributor &A) override {
StateType S;
clampReturnedValueStates<AAType, StateType>(A, *this, S);
// TODO: If we know we visited all returned values, thus no are assumed
// dead, we can take the known information from the state T.
return clampStateAndIndicateChange<StateType>(this->getState(), S);
}
};
@ -585,6 +587,8 @@ struct AAArgumentFromCallSiteArguments : public AAType {
ChangeStatus updateImpl(Attributor &A) override {
StateType S;
clampCallSiteArgumentStates<AAType, StateType>(A, *this, S);
// TODO: If we know we visited all incoming values, thus no are assumed
// dead, we can take the known information from the state T.
return clampStateAndIndicateChange<StateType>(this->getState(), S);
}
};
@ -2265,6 +2269,8 @@ struct AAAlignFloating : AAAlignImpl {
VisitValueCB))
indicatePessimisticFixpoint();
// TODO: If we know we visited all incoming values, thus no are assumed
// dead, we can take the known information from the state T.
return clampStateAndIndicateChange(getState(), T);
}