Skip to content

Commit

Permalink
[NFC][ScopBuilder] Move addRecordedAssumption to ScopBuilder
Browse files Browse the repository at this point in the history
Scope of changes:
1) Moved addRecordedAssumptions to ScopBuilder.
2) Moved Assumption struct outside Scop class.
3) Refactored addRecordedAssumptions function. Replaced while loop by
for range loop.
4) Added function to clear processed Assumptions.

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

llvm-svn: 366260
  • Loading branch information
DominikAdamski committed Jul 16, 2019
1 parent 12154ee commit ddbb837
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 56 deletions.
3 changes: 3 additions & 0 deletions polly/include/polly/ScopBuilder.h
Expand Up @@ -327,6 +327,9 @@ class ScopBuilder {
BasicBlock *IncomingBlock, Value *IncomingValue,
bool IsExitBlock);

/// Add all recorded assumptions to the assumed context.
void addRecordedAssumptions();

/// Create a MemoryAccess for reading the value of a phi.
///
/// The modeling assumes that all incoming blocks write their incoming value
Expand Down
51 changes: 29 additions & 22 deletions polly/include/polly/ScopInfo.h
Expand Up @@ -1624,6 +1624,24 @@ class ScopStmt {
/// Print ScopStmt S to raw_ostream OS.
raw_ostream &operator<<(raw_ostream &OS, const ScopStmt &S);

/// Helper struct to remember assumptions.
struct Assumption {
/// The kind of the assumption (e.g., WRAPPING).
AssumptionKind Kind;

/// Flag to distinguish assumptions and restrictions.
AssumptionSign Sign;

/// The valid/invalid context if this is an assumption/restriction.
isl::set Set;

/// The location that caused this assumption.
DebugLoc Loc;

/// An optional block whose domain can simplify the assumption.
BasicBlock *BB;
};

/// Static Control Part
///
/// A Scop is the polyhedral representation of a control flow region detected
Expand Down Expand Up @@ -1782,24 +1800,7 @@ class Scop {
/// need to be "false". Otherwise they behave the same.
isl::set InvalidContext;

/// Helper struct to remember assumptions.
struct Assumption {
/// The kind of the assumption (e.g., WRAPPING).
AssumptionKind Kind;

/// Flag to distinguish assumptions and restrictions.
AssumptionSign Sign;

/// The valid/invalid context if this is an assumption/restriction.
isl::set Set;

/// The location that caused this assumption.
DebugLoc Loc;

/// An optional block whose domain can simplify the assumption.
BasicBlock *BB;
};

using RecordedAssumptionsTy = SmallVector<Assumption, 8>;
/// Collection to hold taken assumptions.
///
/// There are two reasons why we want to record assumptions first before we
Expand All @@ -1810,7 +1811,7 @@ class Scop {
/// construction (basically after we know all parameters), thus the user
/// might see overly complicated assumptions to be taken while they will
/// only be simplified later on.
SmallVector<Assumption, 8> RecordedAssumptions;
RecordedAssumptionsTy RecordedAssumptions;

/// The schedule of the SCoP
///
Expand Down Expand Up @@ -2338,6 +2339,12 @@ class Scop {
InvariantEquivClasses.end());
}

/// Return an iterator range containing hold assumptions.
iterator_range<RecordedAssumptionsTy::const_iterator>
recorded_assumptions() const {
return make_range(RecordedAssumptions.begin(), RecordedAssumptions.end());
}

/// Return whether this scop is empty, i.e. contains no statements that
/// could be executed.
bool isEmpty() const { return Stmts.empty(); }
Expand Down Expand Up @@ -2494,6 +2501,9 @@ class Scop {
/// @returns True if the optimized SCoP can be executed.
bool hasFeasibleRuntimeContext() const;

/// Clear assumptions which have been already processed.
void clearRecordedAssumptions() { return RecordedAssumptions.clear(); }

/// Check if the assumption in @p Set is trivial or not.
///
/// @param Set The relations between parameters that are assumed to hold.
Expand Down Expand Up @@ -2559,9 +2569,6 @@ class Scop {
void recordAssumption(AssumptionKind Kind, isl::set Set, DebugLoc Loc,
AssumptionSign Sign, BasicBlock *BB = nullptr);

/// Add all recorded assumptions to the assumed context.
void addRecordedAssumptions();

/// Mark the scop as invalid.
///
/// This method adds an assumption to the scop that is always invalid. As a
Expand Down
36 changes: 35 additions & 1 deletion polly/lib/Analysis/ScopBuilder.cpp
Expand Up @@ -385,6 +385,40 @@ Value *ScopBuilder::findFADAllocationInvisible(MemAccInst Inst) {
return Descriptor;
}

void ScopBuilder::addRecordedAssumptions() {
for (auto &AS : llvm::reverse(scop->recorded_assumptions())) {

if (!AS.BB) {
scop->addAssumption(AS.Kind, AS.Set, AS.Loc, AS.Sign,
nullptr /* BasicBlock */);
continue;
}

// If the domain was deleted the assumptions are void.
isl_set *Dom = scop->getDomainConditions(AS.BB).release();
if (!Dom)
continue;

// If a basic block was given use its domain to simplify the assumption.
// In case of restrictions we know they only have to hold on the domain,
// thus we can intersect them with the domain of the block. However, for
// assumptions the domain has to imply them, thus:
// _ _____
// Dom => S <==> A v B <==> A - B
//
// To avoid the complement we will register A - B as a restriction not an
// assumption.
isl_set *S = AS.Set.copy();
if (AS.Sign == AS_RESTRICTION)
S = isl_set_params(isl_set_intersect(S, Dom));
else /* (AS.Sign == AS_ASSUMPTION) */
S = isl_set_params(isl_set_subtract(Dom, S));

scop->addAssumption(AS.Kind, isl::manage(S), AS.Loc, AS_RESTRICTION, AS.BB);
}
scop->clearRecordedAssumptions();
}

bool ScopBuilder::buildAccessMultiDimFixed(MemAccInst Inst, ScopStmt *Stmt) {
Value *Val = Inst.getValueOperand();
Type *ElementType = Val->getType();
Expand Down Expand Up @@ -1972,7 +2006,7 @@ void ScopBuilder::buildScop(Region &R, AssumptionCache &AC,
// After the context was fully constructed, thus all our knowledge about
// the parameters is in there, we add all recorded assumptions to the
// assumed/invalid context.
scop->addRecordedAssumptions();
addRecordedAssumptions();

scop->simplifyContexts();
if (!scop->buildAliasChecks(AA)) {
Expand Down
33 changes: 0 additions & 33 deletions polly/lib/Analysis/ScopInfo.cpp
Expand Up @@ -3779,39 +3779,6 @@ void Scop::recordAssumption(AssumptionKind Kind, isl::set Set, DebugLoc Loc,
RecordedAssumptions.push_back({Kind, Sign, Set, Loc, BB});
}

void Scop::addRecordedAssumptions() {
while (!RecordedAssumptions.empty()) {
Assumption AS = RecordedAssumptions.pop_back_val();

if (!AS.BB) {
addAssumption(AS.Kind, AS.Set, AS.Loc, AS.Sign, nullptr /* BasicBlock */);
continue;
}

// If the domain was deleted the assumptions are void.
isl_set *Dom = getDomainConditions(AS.BB).release();
if (!Dom)
continue;

// If a basic block was given use its domain to simplify the assumption.
// In case of restrictions we know they only have to hold on the domain,
// thus we can intersect them with the domain of the block. However, for
// assumptions the domain has to imply them, thus:
// _ _____
// Dom => S <==> A v B <==> A - B
//
// To avoid the complement we will register A - B as a restriction not an
// assumption.
isl_set *S = AS.Set.copy();
if (AS.Sign == AS_RESTRICTION)
S = isl_set_params(isl_set_intersect(S, Dom));
else /* (AS.Sign == AS_ASSUMPTION) */
S = isl_set_params(isl_set_subtract(Dom, S));

addAssumption(AS.Kind, isl::manage(S), AS.Loc, AS_RESTRICTION, AS.BB);
}
}

void Scop::invalidate(AssumptionKind Kind, DebugLoc Loc, BasicBlock *BB) {
LLVM_DEBUG(dbgs() << "Invalidate SCoP because of reason " << Kind << "\n");
addAssumption(Kind, isl::set::empty(getParamSpace()), Loc, AS_ASSUMPTION, BB);
Expand Down

0 comments on commit ddbb837

Please sign in to comment.