[polly] r366260 - [NFC][ScopBuilder] Move addRecordedAssumption to ScopBuilder

Michael Kruse via llvm-commits llvm-commits at lists.llvm.org
Tue Jul 16 16:27:05 PDT 2019


Thank you for the contribution.

Michael

Am Di., 16. Juli 2019 um 15:50 Uhr schrieb Dominik Adamski via
llvm-commits <llvm-commits at lists.llvm.org>:
>
> Author: domada
> Date: Tue Jul 16 13:51:04 2019
> New Revision: 366260
>
> URL: http://llvm.org/viewvc/llvm-project?rev=366260&view=rev
> Log:
> [NFC][ScopBuilder] Move addRecordedAssumption to ScopBuilder
>
> 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
>
> Modified:
>     polly/trunk/include/polly/ScopBuilder.h
>     polly/trunk/include/polly/ScopInfo.h
>     polly/trunk/lib/Analysis/ScopBuilder.cpp
>     polly/trunk/lib/Analysis/ScopInfo.cpp
>
> Modified: polly/trunk/include/polly/ScopBuilder.h
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/ScopBuilder.h?rev=366260&r1=366259&r2=366260&view=diff
> ==============================================================================
> --- polly/trunk/include/polly/ScopBuilder.h (original)
> +++ polly/trunk/include/polly/ScopBuilder.h Tue Jul 16 13:51:04 2019
> @@ -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
>
> Modified: polly/trunk/include/polly/ScopInfo.h
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/ScopInfo.h?rev=366260&r1=366259&r2=366260&view=diff
> ==============================================================================
> --- polly/trunk/include/polly/ScopInfo.h (original)
> +++ polly/trunk/include/polly/ScopInfo.h Tue Jul 16 13:51:04 2019
> @@ -1624,6 +1624,24 @@ public:
>  /// 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
> @@ -1782,24 +1800,7 @@ private:
>    /// 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
> @@ -1810,7 +1811,7 @@ private:
>    ///      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
>    ///
> @@ -2338,6 +2339,12 @@ public:
>                        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(); }
> @@ -2494,6 +2501,9 @@ public:
>    /// @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.
> @@ -2559,9 +2569,6 @@ public:
>    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
>
> Modified: polly/trunk/lib/Analysis/ScopBuilder.cpp
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopBuilder.cpp?rev=366260&r1=366259&r2=366260&view=diff
> ==============================================================================
> --- polly/trunk/lib/Analysis/ScopBuilder.cpp (original)
> +++ polly/trunk/lib/Analysis/ScopBuilder.cpp Tue Jul 16 13:51:04 2019
> @@ -385,6 +385,40 @@ Value *ScopBuilder::findFADAllocationInv
>    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();
> @@ -1972,7 +2006,7 @@ void ScopBuilder::buildScop(Region &R, A
>    // 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)) {
>
> Modified: polly/trunk/lib/Analysis/ScopInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopInfo.cpp?rev=366260&r1=366259&r2=366260&view=diff
> ==============================================================================
> --- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
> +++ polly/trunk/lib/Analysis/ScopInfo.cpp Tue Jul 16 13:51:04 2019
> @@ -3779,39 +3779,6 @@ void Scop::recordAssumption(AssumptionKi
>    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);
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list