[polly] r212198 - Derive run-time conditions for delinearization
Johannes Doerfert
doerfert at cs.uni-saarland.de
Sat Aug 2 19:20:41 PDT 2014
Hey Tobias,
I think this change introduces an unwanted effect.
For one dimensional parametric array accesses we add assumptions about the
parameters to ensure we access the array only in a positive range. Is this
intended? I see the point for multidimensional array accesses but why do we
enforce this for one dimensional accesses too?
Best regards,
Johannes
On 07/02, Tobias Grosser wrote:
> Author: grosser
> Date: Wed Jul 2 12:47:48 2014
> New Revision: 212198
>
> URL: http://llvm.org/viewvc/llvm-project?rev=212198&view=rev
> Log:
> Derive run-time conditions for delinearization
>
> As our delinearization works optimistically, we need in some cases run-time
> checks that verify our optimistic assumptions. A simple example is the
> following code:
>
> void foo(long n, long m, long o, double A[n][m][o]) {
>
> for (long i = 0; i < 100; i++)
> for (long j = 0; j < 150; j++)
> for (long k = 0; k < 200; k++)
> A[i][j][k] = 1.0;
> }
>
> After clang linearized the access to A and we delinearized it again to
> A[i][j][k] we need to ensure that we do not access the delinearized array
> out of bounds (this information is not available in LLVM-IR). Hence, we
> need to verify the following constraints at run-time:
>
> CHECK: Assumed Context:
> CHECK: [o, m] -> { : m >= 150 and o >= 200 }
>
> Added:
> polly/trunk/test/Isl/Ast/simple-run-time-condition.ll
> polly/trunk/test/Isl/CodeGen/multidim_2d_parametric_array_static_loop_bounds.ll
> - copied, changed from r212186, polly/trunk/test/ScopInfo/multidim_only_ivs_2d.ll
> polly/trunk/test/Isl/CodeGen/run-time-condition-with-scev-parameters.ll
> polly/trunk/test/ScopInfo/multidim_2d_outer_larger_than_zero.ll
> - copied, changed from r212186, polly/trunk/test/ScopInfo/multidim_only_ivs_2d.ll
> polly/trunk/test/ScopInfo/multidim_2d_parametric_array_static_loop_bounds.ll
> - copied, changed from r212186, polly/trunk/test/ScopInfo/multidim_only_ivs_2d.ll
> polly/trunk/test/ScopInfo/multidim_3d_parametric_array_static_loop_bounds.ll
> - copied, changed from r212186, polly/trunk/test/ScopInfo/multidim_only_ivs_3d.ll
> Modified:
> polly/trunk/include/polly/ScopInfo.h
> polly/trunk/lib/Analysis/ScopInfo.cpp
> polly/trunk/lib/CodeGen/IslAst.cpp
> polly/trunk/lib/CodeGen/IslCodeGeneration.cpp
> polly/trunk/test/ScopInfo/multidim_2d-diagonal-matrix.ll
> polly/trunk/test/ScopInfo/multidim_ivs_and_integer_offsets_3d.ll
> polly/trunk/test/ScopInfo/multidim_ivs_and_parameteric_offsets_3d.ll
> polly/trunk/test/ScopInfo/multidim_nested_start_integer.ll
> polly/trunk/test/ScopInfo/multidim_nested_start_share_parameter.ll
> polly/trunk/test/ScopInfo/multidim_only_ivs_2d.ll
> polly/trunk/test/ScopInfo/multidim_only_ivs_3d.ll
> polly/trunk/test/ScopInfo/multidim_only_ivs_3d_cast.ll
> polly/trunk/test/ScopInfo/multidim_only_ivs_3d_reverse.ll
> polly/trunk/test/ScopInfo/simple_loop_1.ll
>
> Modified: polly/trunk/include/polly/ScopInfo.h
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/ScopInfo.h?rev=212198&r1=212197&r2=212198&view=diff
> ==============================================================================
> --- polly/trunk/include/polly/ScopInfo.h (original)
> +++ polly/trunk/include/polly/ScopInfo.h Wed Jul 2 12:47:48 2014
> @@ -140,6 +140,8 @@ private:
> /// Updated access relation read from JSCOP file.
> isl_map *newAccessRelation;
>
> + void assumeNoOutOfBound(const IRAccess &Access);
> +
> public:
> // @brief Create a memory access from an access in LLVM-IR.
> //
> @@ -177,6 +179,9 @@ public:
>
> isl_map *getAccessRelation() const;
>
> + /// @brief Return the space in which the access relation lives in.
> + __isl_give isl_space *getAccessRelationSpace() const;
> +
> /// @brief Get an isl string representing this access function.
> std::string getAccessRelationStr() const;
>
> @@ -541,6 +546,9 @@ class Scop {
> /// @brief Add the bounds of the parameters to the context.
> void addParameterBounds();
>
> + /// @brief Simplify the assumed context.
> + void simplifyAssumedContext();
> +
> /// Build the Scop and Statement with precalculated scop information.
> void buildScop(TempScop &TempScop, const Region &CurRegion,
> // Loops in Scop containing CurRegion
> @@ -631,9 +639,27 @@ public:
> /// @return The assumed context of this Scop.
> __isl_give isl_set *getAssumedContext() const;
>
> + /// @brief Add assumptions to assumed context.
> + ///
> + /// The assumptions added will be assumed to hold during the execution of the
> + /// scop. However, as they are generally not statically provable, at code
> + /// generation time run-time checks will be generated that ensure the
> + /// assumptions hold.
> + ///
> + /// WARNING: We currently exploit in simplifyAssumedContext the knowledge
> + /// that assumptions do not change the set of statement instances
> + /// executed.
> + ///
> + /// @param Set A set describing relations between parameters that are assumed
> + /// to hold.
> + void addAssumption(__isl_take isl_set *Set);
> +
> /// @brief Get an isl string representing the context.
> std::string getContextStr() const;
>
> + /// @brief Get an isl string representing the assumed context.
> + std::string getAssumedContextStr() const;
> +
> /// @name Statements Iterators
> ///
> /// These iterators iterate over all statements of this Scop.
>
> Modified: polly/trunk/lib/Analysis/ScopInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopInfo.cpp?rev=212198&r1=212197&r2=212198&view=diff
> ==============================================================================
> --- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
> +++ polly/trunk/lib/Analysis/ScopInfo.cpp Wed Jul 2 12:47:48 2014
> @@ -342,6 +342,10 @@ std::string MemoryAccess::getAccessRelat
> return stringFromIslObj(AccessRelation);
> }
>
> +__isl_give isl_space *MemoryAccess::getAccessRelationSpace() const {
> + return isl_map_get_space(AccessRelation);
> +}
> +
> isl_map *MemoryAccess::getNewAccessRelation() const {
> return isl_map_copy(newAccessRelation);
> }
> @@ -356,6 +360,66 @@ isl_basic_map *MemoryAccess::createBasic
> isl_basic_set_universe(Space));
> }
>
> +// Formalize no out-of-bound access assumption
> +//
> +// When delinearizing array accesses we optimistically assume that the
> +// delinearized accesses do not access out of bound locations (the subscript
> +// expression of each array evaluates for each statement instance that is
> +// executed to a value that is larger than zero and strictly smaller than the
> +// size of the corresponding dimension). The only exception is the outermost
> +// dimension for which we do not assume any upper bound. At this point we
> +// formalize this assumption to ensure that at code generation time the relevant
> +// run-time checks can be generated.
> +//
> +// To find the set of constraints necessary to avoid out of bound accesses, we
> +// first build the set of data locations that are not within array bounds. We
> +// then apply the reverse access relation to obtain the set of iterations that
> +// may contain invalid accesses and reduce this set of iterations to the ones
> +// that are actually executed by intersecting them with the domain of the
> +// statement. If we now project out all loop dimensions, we obtain a set of
> +// parameters that may cause statement instances to be executed that may
> +// possibly yield out of bound memory accesses. The complement of these
> +// constraints is the set of constraints that needs to be assumed to ensure such
> +// statement instances are never executed.
> +void MemoryAccess::assumeNoOutOfBound(const IRAccess &Access) {
> + isl_space *Space = isl_space_range(getAccessRelationSpace());
> + isl_set *Outside = isl_set_empty(isl_space_copy(Space));
> + for (int i = 0, Size = Access.Subscripts.size(); i < Size; ++i) {
> + isl_local_space *LS = isl_local_space_from_space(isl_space_copy(Space));
> + isl_pw_aff *Var =
> + isl_pw_aff_var_on_domain(isl_local_space_copy(LS), isl_dim_set, i);
> + isl_pw_aff *Zero = isl_pw_aff_zero_on_domain(LS);
> +
> + isl_set *DimOutside;
> +
> + if (i == 0) {
> + DimOutside = isl_pw_aff_lt_set(Var, Zero);
> + } else {
> + DimOutside = isl_pw_aff_lt_set(isl_pw_aff_copy(Var), Zero);
> + isl_pw_aff *SizeE =
> + SCEVAffinator::getPwAff(Statement, Access.Sizes[i - 1]);
> +
> + SizeE = isl_pw_aff_drop_dims(SizeE, isl_dim_in, 0,
> + Statement->getNumIterators());
> + SizeE = isl_pw_aff_add_dims(SizeE, isl_dim_in,
> + isl_space_dim(Space, isl_dim_set));
> + SizeE = isl_pw_aff_set_tuple_id(
> + SizeE, isl_dim_in, isl_space_get_tuple_id(Space, isl_dim_set));
> +
> + DimOutside = isl_set_union(DimOutside, isl_pw_aff_le_set(SizeE, Var));
> + }
> +
> + Outside = isl_set_union(Outside, DimOutside);
> + }
> +
> + Outside = isl_set_apply(Outside, isl_map_reverse(getAccessRelation()));
> + Outside = isl_set_intersect(Outside, Statement->getDomain());
> + Outside = isl_set_params(Outside);
> + Outside = isl_set_complement(Outside);
> + Statement->getParent()->addAssumption(Outside);
> + isl_space_free(Space);
> +}
> +
> MemoryAccess::MemoryAccess(const IRAccess &Access, const Instruction *AccInst,
> ScopStmt *Statement)
> : Statement(Statement), Inst(AccInst), newAccessRelation(nullptr) {
> @@ -409,6 +473,7 @@ MemoryAccess::MemoryAccess(const IRAcces
> isl_space_free(Space);
> AccessRelation = isl_map_set_tuple_name(AccessRelation, isl_dim_out,
> getBaseName().c_str());
> + assumeNoOutOfBound(Access);
> }
>
> void MemoryAccess::realignParams() {
> @@ -1051,6 +1116,39 @@ void Scop::realignParams() {
> Stmt->realignParams();
> }
>
> +void Scop::simplifyAssumedContext() {
> + // The parameter constraints of the iteration domains give us a set of
> + // constraints that need to hold for all cases where at least a single
> + // statement iteration is executed in the whole scop. We now simplify the
> + // assumed context under the assumption that such constraints hold and at
> + // least a single statement iteration is executed. For cases where no
> + // statement instances are executed, the assumptions we have taken about
> + // the executed code do not matter and can be changed.
> + //
> + // WARNING: This only holds if the assumptions we have taken do not reduce
> + // the set of statement instances that are executed. Otherwise we
> + // may run into a case where the iteration domains suggest that
> + // for a certain set of parameter constraints no code is executed,
> + // but in the original program some computation would have been
> + // performed. In such a case, modifying the run-time conditions and
> + // possibly influencing the run-time check may cause certain scops
> + // to not be executed.
> + //
> + // Example:
> + //
> + // When delinearizing the following code:
> + //
> + // for (long i = 0; i < 100; i++)
> + // for (long j = 0; j < m; j++)
> + // A[i+p][j] = 1.0;
> + //
> + // we assume that the condition m <= 0 or (m >= 1 and p >= 0) holds as
> + // otherwise we would access out of bound data. Now, knowing that code is
> + // only executed for the case m >= 0, it is sufficient to assume p >= 0.
> + AssumedContext =
> + isl_set_gist_params(AssumedContext, isl_union_set_params(getDomains()));
> +}
> +
> Scop::Scop(TempScop &tempScop, LoopInfo &LI, ScalarEvolution &ScalarEvolution,
> isl_ctx *Context)
> : SE(&ScalarEvolution), R(tempScop.getMaxRegion()),
> @@ -1069,6 +1167,7 @@ Scop::Scop(TempScop &tempScop, LoopInfo
>
> realignParams();
> addParameterBounds();
> + simplifyAssumedContext();
>
> assert(NestLoops.empty() && "NestLoops not empty at top level!");
> }
> @@ -1083,6 +1182,9 @@ Scop::~Scop() {
> }
>
> std::string Scop::getContextStr() const { return stringFromIslObj(Context); }
> +std::string Scop::getAssumedContextStr() const {
> + return stringFromIslObj(AssumedContext);
> +}
>
> std::string Scop::getNameStr() const {
> std::string ExitName, EntryName;
> @@ -1110,6 +1212,10 @@ __isl_give isl_set *Scop::getAssumedCont
> return isl_set_copy(AssumedContext);
> }
>
> +void Scop::addAssumption(__isl_take isl_set *Set) {
> + AssumedContext = isl_set_intersect(AssumedContext, Set);
> +}
> +
> void Scop::printContext(raw_ostream &OS) const {
> OS << "Context:\n";
>
> @@ -1120,6 +1226,14 @@ void Scop::printContext(raw_ostream &OS)
>
> OS.indent(4) << getContextStr() << "\n";
>
> + OS.indent(4) << "Assumed Context:\n";
> + if (!AssumedContext) {
> + OS.indent(4) << "n/a\n\n";
> + return;
> + }
> +
> + OS.indent(4) << getAssumedContextStr() << "\n";
> +
> for (const SCEV *Parameter : Parameters) {
> int Dim = ParameterIds.find(Parameter)->second;
> OS.indent(4) << "p" << Dim << ": " << *Parameter << "\n";
>
> Modified: polly/trunk/lib/CodeGen/IslAst.cpp
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGen/IslAst.cpp?rev=212198&r1=212197&r2=212198&view=diff
> ==============================================================================
> --- polly/trunk/lib/CodeGen/IslAst.cpp (original)
> +++ polly/trunk/lib/CodeGen/IslAst.cpp Wed Jul 2 12:47:48 2014
> @@ -341,7 +341,7 @@ void IslAst::buildRunCondition(__isl_kee
> PwZero = isl_pw_aff_intersect_domain(
> PwZero, isl_set_complement(S->getAssumedContext()));
>
> - isl_pw_aff *Cond = isl_pw_aff_union_max(PwZero, PwOne);
> + isl_pw_aff *Cond = isl_pw_aff_union_max(PwOne, PwZero);
>
> RunCondition = isl_ast_build_expr_from_pw_aff(Context, Cond);
> }
>
> Modified: polly/trunk/lib/CodeGen/IslCodeGeneration.cpp
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGen/IslCodeGeneration.cpp?rev=212198&r1=212197&r2=212198&view=diff
> ==============================================================================
> --- polly/trunk/lib/CodeGen/IslCodeGeneration.cpp (original)
> +++ polly/trunk/lib/CodeGen/IslCodeGeneration.cpp Wed Jul 2 12:47:48 2014
> @@ -1151,6 +1151,8 @@ public:
>
> IslNodeBuilder NodeBuilder(Builder, Annotator, this);
>
> + Builder.SetInsertPoint(StartBlock->getSinglePredecessor()->begin());
> + NodeBuilder.addParameters(S.getContext());
> // Build condition that evaluates at run-time if all assumptions taken
> // for the scop hold. If we detect some assumptions do not hold, the
> // original code is executed.
> @@ -1160,8 +1162,8 @@ public:
> BasicBlock *PrevBB = StartBlock->getUniquePredecessor();
> BranchInst *Branch = dyn_cast<BranchInst>(PrevBB->getTerminator());
> Branch->setCondition(V);
> + Builder.SetInsertPoint(StartBlock->begin());
>
> - NodeBuilder.addParameters(S.getContext());
> NodeBuilder.create(Ast);
> return true;
> }
>
> Added: polly/trunk/test/Isl/Ast/simple-run-time-condition.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Isl/Ast/simple-run-time-condition.ll?rev=212198&view=auto
> ==============================================================================
> --- polly/trunk/test/Isl/Ast/simple-run-time-condition.ll (added)
> +++ polly/trunk/test/Isl/Ast/simple-run-time-condition.ll Wed Jul 2 12:47:48 2014
> @@ -0,0 +1,94 @@
> +; RUN: opt %loadPolly -polly-ast -analyze -polly-delinearize < %s | FileCheck %s
> +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
> +target triple = "x86_64-unknown-linux-gnu"
> +
> +; void foo(long n, long m, int o, double A[n][m], long p, long q) {
> +;
> +; if (o >= 0)
> +; for (long i = 0; i < n; i++)
> +; for (long j = 0; j < m; j++)
> +; A[i+p][j+q] = 1.0;
> +; else
> +; for (long i = 0; i < n; i++)
> +; for (long j = 0; j < m; j++)
> +; A[i+p][j+q-100] = 1.0;
> +;
> +
> +; This test case is meant to verify that the run-time condition generated
> +; for the delinearization is simplified such that conditions that would not
> +; cause any code to be executed are not generated.
> +
> +; CHECK: if ((q == 100 && o <= 0 && p >= 0) || (q == 0 && o >= 1 && p >= 0) ? 1 : 0)
> +
> +; CHECK: if (o >= 1) {
> +; CHECK: for (int c1 = 0; c1 < n; c1 += 1)
> +; CHECK: for (int c3 = 0; c3 < m; c3 += 1)
> +; CHECK: Stmt_for_j(c1, c3);
> +; CHECK: } else
> +; CHECK: for (int c1 = 0; c1 < n; c1 += 1)
> +; CHECK: for (int c3 = 0; c3 < m; c3 += 1)
> +; CHECK: Stmt_for_j_1(c1, c3);
> +
> +; CHECK: else
> +; CHECK: { /* original code */ }
> +
> +define void @foo(i64 %n, i64 %m, i64 %o, double* %A, i64 %p, i64 %q) {
> +entry:
> + br label %cond
> +
> +cond:
> + %cmp = icmp sgt i64 %o, 0
> + br i1 %cmp, label %for.i, label %for.i.1
> +
> +for.i:
> + %i = phi i64 [ 0, %cond ], [ %i.inc, %for.i.inc ]
> + br label %for.j
> +
> +for.j:
> + %j = phi i64 [ 0, %for.i ], [ %j.inc, %for.j.inc ]
> + %offset0 = add nsw i64 %i, %p
> + %subscript0 = mul i64 %offset0, %m
> + %offset1 = add nsw i64 %j, %q
> + %subscript1 = add i64 %offset1, %subscript0
> + %idx = getelementptr inbounds double* %A, i64 %subscript1
> + store double 1.0, double* %idx
> + br label %for.j.inc
> +
> +for.j.inc:
> + %j.inc = add nsw i64 %j, 1
> + %j.exitcond = icmp eq i64 %j.inc, %m
> + br i1 %j.exitcond, label %for.i.inc, label %for.j
> +
> +for.i.inc:
> + %i.inc = add nsw i64 %i, 1
> + %i.exitcond = icmp eq i64 %i.inc, %n
> + br i1 %i.exitcond, label %end, label %for.i
> +
> +for.i.1:
> + %i.1 = phi i64 [ 0, %cond ], [ %i.inc.1, %for.i.inc.1 ]
> + br label %for.j.1
> +
> +for.j.1:
> + %j.1 = phi i64 [ 0, %for.i.1 ], [ %j.inc.1, %for.j.inc.1 ]
> + %offset0.1 = add nsw i64 %i.1, %p
> + %subscript0.1 = mul i64 %offset0.1, %m
> + %offset1.1 = add nsw i64 %j.1, %q
> + %subscript1.1 = add i64 %offset1.1, %subscript0.1
> + %subscript1.2 = sub i64 %subscript1.1, 100
> + %idx.1 = getelementptr inbounds double* %A, i64 %subscript1.2
> + store double 1.0, double* %idx.1
> + br label %for.j.inc.1
> +
> +for.j.inc.1:
> + %j.inc.1 = add nsw i64 %j.1, 1
> + %j.exitcond.1 = icmp eq i64 %j.inc.1, %m
> + br i1 %j.exitcond.1, label %for.i.inc.1, label %for.j.1
> +
> +for.i.inc.1:
> + %i.inc.1 = add nsw i64 %i.1, 1
> + %i.exitcond.1 = icmp eq i64 %i.inc.1, %n
> + br i1 %i.exitcond.1, label %end, label %for.i.1
> +
> +end:
> + ret void
> +}
>
> Copied: polly/trunk/test/Isl/CodeGen/multidim_2d_parametric_array_static_loop_bounds.ll (from r212186, polly/trunk/test/ScopInfo/multidim_only_ivs_2d.ll)
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Isl/CodeGen/multidim_2d_parametric_array_static_loop_bounds.ll?p2=polly/trunk/test/Isl/CodeGen/multidim_2d_parametric_array_static_loop_bounds.ll&p1=polly/trunk/test/ScopInfo/multidim_only_ivs_2d.ll&r1=212186&r2=212198&rev=212198&view=diff
> ==============================================================================
> --- polly/trunk/test/ScopInfo/multidim_only_ivs_2d.ll (original)
> +++ polly/trunk/test/Isl/CodeGen/multidim_2d_parametric_array_static_loop_bounds.ll Wed Jul 2 12:47:48 2014
> @@ -1,25 +1,20 @@
> -; RUN: opt %loadPolly -polly-scops -analyze -polly-delinearize < %s | FileCheck %s
> +; RUN: opt %loadPolly -polly-codegen-isl -S -polly-delinearize < %s | FileCheck %s
> target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
> target triple = "x86_64-unknown-linux-gnu"
>
> ; Derived from the following code:
> ;
> ; void foo(long n, long m, double A[n][m]) {
> -; for (long i = 0; i < n; i++)
> -; for (long j = 0; j < m; j++)
> +; for (long i = 0; i < 100; i++)
> +; for (long j = 0; j < 150; j++)
> ; A[i][j] = 1.0;
> ; }
>
> -; CHECK: p0: %n
> -; CHECK: p1: %m
> -; CHECK-NOT: p3
> -
> -; CHECK: Domain
> -; CHECK: [n, m] -> { Stmt_for_j[i0, i1] : i0 >= 0 and i0 <= -1 + n and i1 >= 0 and i1 <= -1 + m };
> -; CHECK: Scattering
> -; CHECK: [n, m] -> { Stmt_for_j[i0, i1] -> scattering[0, i0, 0, i1, 0] };
> -; CHECK: MustWriteAccess
> -; CHECK: [n, m] -> { Stmt_for_j[i0, i1] -> MemRef_A[i0, i1] };
> +; CHECK: polly.split_new_and_old:
> +; CHECK: %0 = icmp sge i64 %m, 150
> +; CHECK: %1 = select i1 %0, i64 1, i64 0
> +; CHECK: %2 = icmp ne i64 0, %1
> +; CHECK: br i1 %2, label %polly.start, label %for.i
>
> define void @foo(i64 %n, i64 %m, double* %A) {
> entry:
> @@ -36,12 +31,12 @@ for.j:
> %arrayidx = getelementptr inbounds double* %A, i64 %vlaarrayidx.sum
> store double 1.0, double* %arrayidx
> %j.inc = add nsw i64 %j, 1
> - %j.exitcond = icmp eq i64 %j.inc, %m
> + %j.exitcond = icmp eq i64 %j.inc, 150
> br i1 %j.exitcond, label %for.i.inc, label %for.j
>
> for.i.inc:
> %i.inc = add nsw i64 %i, 1
> - %i.exitcond = icmp eq i64 %i.inc, %n
> + %i.exitcond = icmp eq i64 %i.inc, 100
> br i1 %i.exitcond, label %end, label %for.i
>
> end:
>
> Added: polly/trunk/test/Isl/CodeGen/run-time-condition-with-scev-parameters.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Isl/CodeGen/run-time-condition-with-scev-parameters.ll?rev=212198&view=auto
> ==============================================================================
> --- polly/trunk/test/Isl/CodeGen/run-time-condition-with-scev-parameters.ll (added)
> +++ polly/trunk/test/Isl/CodeGen/run-time-condition-with-scev-parameters.ll Wed Jul 2 12:47:48 2014
> @@ -0,0 +1,28 @@
> +; RUN: opt %loadPolly -polly-codegen-isl -S -polly-delinearize < %s | FileCheck %s
> +; RUN: opt %loadPolly -polly-codegen-isl -S -polly-delinearize -polly-codegen-scev < %s | FileCheck %s
> +
> +; CHECK: %1 = zext i32 %n to i64
> +; CHECK: %2 = icmp sge i64 %1, 1
> +; CHECK: %3 = select i1 %2, i64 1, i64 0
> +; CHECK: %4 = icmp ne i64 0, %3
> +
> +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
> +target triple = "x86_64-unknown-linux-gnu"
> +
> +define void @init_array(i32 %n, double* %data) {
> +entry:
> + %0 = zext i32 %n to i64
> + br label %for.body4
> +
> +for.body4: ; preds = %for.body4, %entry
> + %indvar1 = phi i64 [ %indvar.next2, %for.body4 ], [ 0, %entry ]
> + %.moved.to.for.body4 = mul i64 %0, %indvar1
> + %1 = add i64 %.moved.to.for.body4, 0
> + %arrayidx7 = getelementptr double* %data, i64 %1
> + store double undef, double* %arrayidx7, align 8
> + %indvar.next2 = add i64 %indvar1, 1
> + br i1 false, label %for.body4, label %for.end10
> +
> +for.end10: ; preds = %for.body4
> + ret void
> +}
>
> Modified: polly/trunk/test/ScopInfo/multidim_2d-diagonal-matrix.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/multidim_2d-diagonal-matrix.ll?rev=212198&r1=212197&r2=212198&view=diff
> ==============================================================================
> --- polly/trunk/test/ScopInfo/multidim_2d-diagonal-matrix.ll (original)
> +++ polly/trunk/test/ScopInfo/multidim_2d-diagonal-matrix.ll Wed Jul 2 12:47:48 2014
> @@ -9,6 +9,10 @@ target triple = "x86_64-unknown-linux-gn
> ; A[i][i] = 1.0;
> ; }
>
> +
> +; CHECK: Assumed Context:
> +; CHECK: [n] -> { : }
> +
> ; CHECK: p0: %n
> ; CHECK-NOT: p1
>
>
> Copied: polly/trunk/test/ScopInfo/multidim_2d_outer_larger_than_zero.ll (from r212186, polly/trunk/test/ScopInfo/multidim_only_ivs_2d.ll)
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/multidim_2d_outer_larger_than_zero.ll?p2=polly/trunk/test/ScopInfo/multidim_2d_outer_larger_than_zero.ll&p1=polly/trunk/test/ScopInfo/multidim_only_ivs_2d.ll&r1=212186&r2=212198&rev=212198&view=diff
> ==============================================================================
> --- polly/trunk/test/ScopInfo/multidim_only_ivs_2d.ll (original)
> +++ polly/trunk/test/ScopInfo/multidim_2d_outer_larger_than_zero.ll Wed Jul 2 12:47:48 2014
> @@ -4,30 +4,34 @@ target triple = "x86_64-unknown-linux-gn
>
> ; Derived from the following code:
> ;
> -; void foo(long n, long m, double A[n][m]) {
> -; for (long i = 0; i < n; i++)
> +; void foo(long n, long m, long p, double A[n][m]) {
> +; for (long i = 0; i < 100; i++)
> ; for (long j = 0; j < m; j++)
> -; A[i][j] = 1.0;
> +; A[i+p][j] = 1.0;
> ; }
>
> -; CHECK: p0: %n
> -; CHECK: p1: %m
> -; CHECK-NOT: p3
> -
> -; CHECK: Domain
> -; CHECK: [n, m] -> { Stmt_for_j[i0, i1] : i0 >= 0 and i0 <= -1 + n and i1 >= 0 and i1 <= -1 + m };
> -; CHECK: Scattering
> -; CHECK: [n, m] -> { Stmt_for_j[i0, i1] -> scattering[0, i0, 0, i1, 0] };
> -; CHECK: MustWriteAccess
> -; CHECK: [n, m] -> { Stmt_for_j[i0, i1] -> MemRef_A[i0, i1] };
> +; CHECK: Assumed Context:
> +; CHECK: [m, p] -> { : p >= 0 }
> +; CHECK: p0: %m
> +; CHECK: p1: %p
> +; CHECK: Statements {
> +; CHECK: Stmt_for_j
> +; CHECK: Domain :=
> +; CHECK: [m, p] -> { Stmt_for_j[i0, i1] : i0 >= 0 and i0 <= 99 and i1 >= 0 and i1 <= -1 + m };
> +; CHECK: Scattering :=
> +; CHECK: [m, p] -> { Stmt_for_j[i0, i1] -> scattering[0, i0, 0, i1, 0] };
> +; CHECK: MustWriteAccess := [Reduction Type: NONE]
> +; CHECK: [m, p] -> { Stmt_for_j[i0, i1] -> MemRef_A[p + i0, i1] };
> +; CHECK: }
>
> -define void @foo(i64 %n, i64 %m, double* %A) {
> +define void @foo(i64 %n, i64 %m, i64 %p, double* %A) {
> entry:
> br label %for.i
>
> for.i:
> %i = phi i64 [ 0, %entry ], [ %i.inc, %for.i.inc ]
> - %tmp = mul nsw i64 %i, %m
> + %add = add nsw i64 %i, %p
> + %tmp = mul nsw i64 %add, %m
> br label %for.j
>
> for.j:
> @@ -41,7 +45,7 @@ for.j:
>
> for.i.inc:
> %i.inc = add nsw i64 %i, 1
> - %i.exitcond = icmp eq i64 %i.inc, %n
> + %i.exitcond = icmp eq i64 %i.inc, 100
> br i1 %i.exitcond, label %end, label %for.i
>
> end:
>
> Copied: polly/trunk/test/ScopInfo/multidim_2d_parametric_array_static_loop_bounds.ll (from r212186, polly/trunk/test/ScopInfo/multidim_only_ivs_2d.ll)
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/multidim_2d_parametric_array_static_loop_bounds.ll?p2=polly/trunk/test/ScopInfo/multidim_2d_parametric_array_static_loop_bounds.ll&p1=polly/trunk/test/ScopInfo/multidim_only_ivs_2d.ll&r1=212186&r2=212198&rev=212198&view=diff
> ==============================================================================
> --- polly/trunk/test/ScopInfo/multidim_only_ivs_2d.ll (original)
> +++ polly/trunk/test/ScopInfo/multidim_2d_parametric_array_static_loop_bounds.ll Wed Jul 2 12:47:48 2014
> @@ -5,21 +5,21 @@ target triple = "x86_64-unknown-linux-gn
> ; Derived from the following code:
> ;
> ; void foo(long n, long m, double A[n][m]) {
> -; for (long i = 0; i < n; i++)
> -; for (long j = 0; j < m; j++)
> +; for (long i = 0; i < 100; i++)
> +; for (long j = 0; j < 150; j++)
> ; A[i][j] = 1.0;
> ; }
> -
> -; CHECK: p0: %n
> -; CHECK: p1: %m
> -; CHECK-NOT: p3
> -
> -; CHECK: Domain
> -; CHECK: [n, m] -> { Stmt_for_j[i0, i1] : i0 >= 0 and i0 <= -1 + n and i1 >= 0 and i1 <= -1 + m };
> -; CHECK: Scattering
> -; CHECK: [n, m] -> { Stmt_for_j[i0, i1] -> scattering[0, i0, 0, i1, 0] };
> -; CHECK: MustWriteAccess
> -; CHECK: [n, m] -> { Stmt_for_j[i0, i1] -> MemRef_A[i0, i1] };
> +; CHECK: Assumed Context:
> +; CHECK: [m] -> { : m >= 150 }
> +; CHECK: p0: %m
> +; CHECK: Statements {
> +; CHECK: Stmt_for_j
> +; CHECK: Domain :=
> +; CHECK: [m] -> { Stmt_for_j[i0, i1] : i0 >= 0 and i0 <= 99 and i1 >= 0 and i1 <= 149 };
> +; CHECK: Scattering :=
> +; CHECK: [m] -> { Stmt_for_j[i0, i1] -> scattering[0, i0, 0, i1, 0] };
> +; CHECK: MustWriteAccess := [Reduction Type: NONE]
> +; CHECK: [m] -> { Stmt_for_j[i0, i1] -> MemRef_A[i0, i1] };
>
> define void @foo(i64 %n, i64 %m, double* %A) {
> entry:
> @@ -36,12 +36,12 @@ for.j:
> %arrayidx = getelementptr inbounds double* %A, i64 %vlaarrayidx.sum
> store double 1.0, double* %arrayidx
> %j.inc = add nsw i64 %j, 1
> - %j.exitcond = icmp eq i64 %j.inc, %m
> + %j.exitcond = icmp eq i64 %j.inc, 150
> br i1 %j.exitcond, label %for.i.inc, label %for.j
>
> for.i.inc:
> %i.inc = add nsw i64 %i, 1
> - %i.exitcond = icmp eq i64 %i.inc, %n
> + %i.exitcond = icmp eq i64 %i.inc, 100
> br i1 %i.exitcond, label %end, label %for.i
>
> end:
>
> Copied: polly/trunk/test/ScopInfo/multidim_3d_parametric_array_static_loop_bounds.ll (from r212186, polly/trunk/test/ScopInfo/multidim_only_ivs_3d.ll)
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/multidim_3d_parametric_array_static_loop_bounds.ll?p2=polly/trunk/test/ScopInfo/multidim_3d_parametric_array_static_loop_bounds.ll&p1=polly/trunk/test/ScopInfo/multidim_only_ivs_3d.ll&r1=212186&r2=212198&rev=212198&view=diff
> ==============================================================================
> --- polly/trunk/test/ScopInfo/multidim_only_ivs_3d.ll (original)
> +++ polly/trunk/test/ScopInfo/multidim_3d_parametric_array_static_loop_bounds.ll Wed Jul 2 12:47:48 2014
> @@ -4,23 +4,24 @@ target triple = "x86_64-unknown-linux-gn
>
> ; void foo(long n, long m, long o, double A[n][m][o]) {
> ;
> -; for (long i = 0; i < n; i++)
> -; for (long j = 0; j < m; j++)
> -; for (long k = 0; k < o; k++)
> +; for (long i = 0; i < 100; i++)
> +; for (long j = 0; j < 150; j++)
> +; for (long k = 0; k < 200; k++)
> ; A[i][j][k] = 1.0;
> ; }
>
> -; CHECK: p0: %n
> -; CHECK: p1: %m
> -; CHECK: p2: %o
> -; CHECK-NOT: p3
> -;
> -; CHECK: Domain
> -; CHECK: [n, m, o] -> { Stmt_for_k[i0, i1, i2] : i0 >= 0 and i0 <= -1 + n and i1 >= 0 and i1 <= -1 + m and i2 >= 0 and i2 <= -1 + o };
> -; CHECK: Scattering
> -; CHECK: [n, m, o] -> { Stmt_for_k[i0, i1, i2] -> scattering[0, i0, 0, i1, 0, i2, 0] };
> -; CHECK: WriteAccess
> -; CHECK: [n, m, o] -> { Stmt_for_k[i0, i1, i2] -> MemRef_A[i0, i1, i2] };
> +; CHECK: Assumed Context:
> +; CHECK: [m, o] -> { : m >= 150 and o >= 200 }
> +; CHECK: p0: %m
> +; CHECK: p1: %o
> +; CHECK: Statements {
> +; CHECK: Stmt_for_k
> +; CHECK: Domain :=
> +; CHECK: [m, o] -> { Stmt_for_k[i0, i1, i2] : i0 >= 0 and i0 <= 99 and i1 >= 0 and i1 <= 149 and i2 >= 0 and i2 <= 199 };
> +; CHECK: Scattering :=
> +; CHECK: [m, o] -> { Stmt_for_k[i0, i1, i2] -> scattering[0, i0, 0, i1, 0, i2, 0] };
> +; CHECK: MustWriteAccess := [Reduction Type: NONE]
> +; CHECK: [m, o] -> { Stmt_for_k[i0, i1, i2] -> MemRef_A[i0, i1, i2] };
>
> define void @foo(i64 %n, i64 %m, i64 %o, double* %A) {
> entry:
> @@ -46,17 +47,17 @@ for.k:
>
> for.k.inc:
> %k.inc = add nsw i64 %k, 1
> - %k.exitcond = icmp eq i64 %k.inc, %o
> + %k.exitcond = icmp eq i64 %k.inc, 200
> br i1 %k.exitcond, label %for.j.inc, label %for.k
>
> for.j.inc:
> %j.inc = add nsw i64 %j, 1
> - %j.exitcond = icmp eq i64 %j.inc, %m
> + %j.exitcond = icmp eq i64 %j.inc, 150
> br i1 %j.exitcond, label %for.i.inc, label %for.j
>
> for.i.inc:
> %i.inc = add nsw i64 %i, 1
> - %i.exitcond = icmp eq i64 %i.inc, %n
> + %i.exitcond = icmp eq i64 %i.inc, 100
> br i1 %i.exitcond, label %end, label %for.i
>
> end:
>
> Modified: polly/trunk/test/ScopInfo/multidim_ivs_and_integer_offsets_3d.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/multidim_ivs_and_integer_offsets_3d.ll?rev=212198&r1=212197&r2=212198&view=diff
> ==============================================================================
> --- polly/trunk/test/ScopInfo/multidim_ivs_and_integer_offsets_3d.ll (original)
> +++ polly/trunk/test/ScopInfo/multidim_ivs_and_integer_offsets_3d.ll Wed Jul 2 12:47:48 2014
> @@ -10,6 +10,9 @@ target triple = "x86_64-unknown-linux-gn
> ; A[i+3][j-4][k+7] = 1.0;
> ; }
>
> +; CHECK: Assumed Context:
> +; CHECK: { : }
> +
> ; CHECK: p0: %n
> ; CHECK: p1: %m
> ; CHECK: p2: %o
>
> Modified: polly/trunk/test/ScopInfo/multidim_ivs_and_parameteric_offsets_3d.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/multidim_ivs_and_parameteric_offsets_3d.ll?rev=212198&r1=212197&r2=212198&view=diff
> ==============================================================================
> --- polly/trunk/test/ScopInfo/multidim_ivs_and_parameteric_offsets_3d.ll (original)
> +++ polly/trunk/test/ScopInfo/multidim_ivs_and_parameteric_offsets_3d.ll Wed Jul 2 12:47:48 2014
> @@ -13,6 +13,9 @@ target triple = "x86_64-unknown-linux-gn
> ; Access function:
> ; {{{((8 * ((((%m * %p) + %q) * %o) + %r)) + %A),+,(8 * %m * %o)}<%for.i>,+,
> ; (8 * %o)}<%for.j>,+,8}<%for.k>
> +
> +; CHECK: Assumed Context:
> +; CHECK: [n, m, o, p, q, r] -> { : q = 0 and r = 0 and p >= 0 }
> ;
> ; CHECK: p0: %n
> ; CHECK: p1: %m
>
> Modified: polly/trunk/test/ScopInfo/multidim_nested_start_integer.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/multidim_nested_start_integer.ll?rev=212198&r1=212197&r2=212198&view=diff
> ==============================================================================
> --- polly/trunk/test/ScopInfo/multidim_nested_start_integer.ll (original)
> +++ polly/trunk/test/ScopInfo/multidim_nested_start_integer.ll Wed Jul 2 12:47:48 2014
> @@ -9,6 +9,8 @@ target triple = "x86_64-unknown-linux-gn
> ; A[i+3][j-4][k+7] = 1.0;
> ; }
> ;
> +; CHECK: Assumed Context:
> +; CHECK: { : }
> ; CHECK: p0: %n
> ; CHECK: p1: %m
> ; CHECK: p2: %o
>
> Modified: polly/trunk/test/ScopInfo/multidim_nested_start_share_parameter.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/multidim_nested_start_share_parameter.ll?rev=212198&r1=212197&r2=212198&view=diff
> ==============================================================================
> --- polly/trunk/test/ScopInfo/multidim_nested_start_share_parameter.ll (original)
> +++ polly/trunk/test/ScopInfo/multidim_nested_start_share_parameter.ll Wed Jul 2 12:47:48 2014
> @@ -12,6 +12,8 @@ target triple = "x86_64-unknown-linux-gn
> ; }
> ; }
> ;
> +; CHECK: Assumed Context:
> +; CHECK: { : }
> ; CHECK: p0: %n
> ; CHECK: p1: %m
> ; CHECK: p2: %o
>
> Modified: polly/trunk/test/ScopInfo/multidim_only_ivs_2d.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/multidim_only_ivs_2d.ll?rev=212198&r1=212197&r2=212198&view=diff
> ==============================================================================
> --- polly/trunk/test/ScopInfo/multidim_only_ivs_2d.ll (original)
> +++ polly/trunk/test/ScopInfo/multidim_only_ivs_2d.ll Wed Jul 2 12:47:48 2014
> @@ -10,6 +10,8 @@ target triple = "x86_64-unknown-linux-gn
> ; A[i][j] = 1.0;
> ; }
>
> +; CHECK: Assumed Context:
> +; CHECK: [n, m] -> { : }
> ; CHECK: p0: %n
> ; CHECK: p1: %m
> ; CHECK-NOT: p3
>
> Modified: polly/trunk/test/ScopInfo/multidim_only_ivs_3d.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/multidim_only_ivs_3d.ll?rev=212198&r1=212197&r2=212198&view=diff
> ==============================================================================
> --- polly/trunk/test/ScopInfo/multidim_only_ivs_3d.ll (original)
> +++ polly/trunk/test/ScopInfo/multidim_only_ivs_3d.ll Wed Jul 2 12:47:48 2014
> @@ -10,6 +10,8 @@ target triple = "x86_64-unknown-linux-gn
> ; A[i][j][k] = 1.0;
> ; }
>
> +; CHECK: Assumed Context:
> +; CHECK: [n, m, o] -> { : }
> ; CHECK: p0: %n
> ; CHECK: p1: %m
> ; CHECK: p2: %o
>
> Modified: polly/trunk/test/ScopInfo/multidim_only_ivs_3d_cast.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/multidim_only_ivs_3d_cast.ll?rev=212198&r1=212197&r2=212198&view=diff
> ==============================================================================
> --- polly/trunk/test/ScopInfo/multidim_only_ivs_3d_cast.ll (original)
> +++ polly/trunk/test/ScopInfo/multidim_only_ivs_3d_cast.ll Wed Jul 2 12:47:48 2014
> @@ -8,17 +8,25 @@
> ; A[i][j][k] = 1.0;
> ; }
>
> +; We currently fail to get the relation between the 32 and 64 bit versions of
> +; m and o, such that we generate unnecessary run-time checks. This is not a
> +; correctness issue, but could be improved.
> +
> +; CHECK: Assumed Context:
> +; CHECK: [n, m, o, p_3, p_4] -> { : p_4 >= o and p_3 >= m }
> ; CHECK: p0: %n
> ; CHECK: p1: %m
> ; CHECK: p2: %o
> -; CHECK-NOT: p3
> +; CHECK: p3: (zext i32 %m to i64)
> +; CHECK: p4: (zext i32 %o to i64)
> +; CHECK-NOT: p5
>
> ; CHECK: Domain
> -; CHECK: [n, m, o] -> { Stmt_for_k[i0, i1, i2] : i0 >= 0 and i0 <= -1 + n and i1 >= 0 and i1 <= -1 + m and i2 >= 0 and i2 <= -1 + o };
> +; CHECK: [n, m, o, p_3, p_4] -> { Stmt_for_k[i0, i1, i2] : i0 >= 0 and i0 <= -1 + n and i1 >= 0 and i1 <= -1 + m and i2 >= 0 and i2 <= -1 + o };
> ; CHECK: Scattering
> -; CHECK: [n, m, o] -> { Stmt_for_k[i0, i1, i2] -> scattering[0, i0, 0, i1, 0, i2, 0] };
> +; CHECK: [n, m, o, p_3, p_4] -> { Stmt_for_k[i0, i1, i2] -> scattering[0, i0, 0, i1, 0, i2, 0] };
> ; CHECK: WriteAccess
> -; CHECK: [n, m, o] -> { Stmt_for_k[i0, i1, i2] -> MemRef_A[i0, i1, i2] };
> +; CHECK: [n, m, o, p_3, p_4] -> { Stmt_for_k[i0, i1, i2] -> MemRef_A[i0, i1, i2] };
>
> target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
> target triple = "x86_64-unknown-linux-gnu"
>
> Modified: polly/trunk/test/ScopInfo/multidim_only_ivs_3d_reverse.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/multidim_only_ivs_3d_reverse.ll?rev=212198&r1=212197&r2=212198&view=diff
> ==============================================================================
> --- polly/trunk/test/ScopInfo/multidim_only_ivs_3d_reverse.ll (original)
> +++ polly/trunk/test/ScopInfo/multidim_only_ivs_3d_reverse.ll Wed Jul 2 12:47:48 2014
> @@ -10,22 +10,24 @@ target triple = "x86_64-unknown-linux-gn
> ; void foo(long n, long m, long o, double A[n][m][o]) {
> ;
> ; for (long i = 0; i < n; i++)
> -; for (long j = 0; j < m; j++)
> -; for (long k = 0; k < o; k++)
> -; A[i][k][j] = 1.0;
> +; for (long k = 0; k < o; k++)
> +; for (long j = 0; j < m; j++)
> +; A[i][j][k] = 1.0;
> ; }
>
> +; CHECK: Assumed Context:
> +; CHECK: { : }
> ; CHECK: p0: %n
> -; CHECK: p1: %m
> -; CHECK: p2: %o
> +; CHECK: p1: %o
> +; CHECK: p2: %m
> ; CHECK-NOT: p3
> ;
> ; CHECK: Domain
> -; CHECK: [n, m, o] -> { Stmt_for_k[i0, i1, i2] : i0 >= 0 and i0 <= -1 + n and i1 >= 0 and i1 <= -1 + m and i2 >= 0 and i2 <= -1 + o };
> +; CHECK: [n, o, m] -> { Stmt_for_j[i0, i1, i2] : i0 >= 0 and i0 <= -1 + n and i1 >= 0 and i1 <= -1 + o and i2 >= 0 and i2 <= -1 + m };
> ; CHECK: Scattering
> -; CHECK: [n, m, o] -> { Stmt_for_k[i0, i1, i2] -> scattering[0, i0, 0, i1, 0, i2, 0] };
> +; CHECK: [n, o, m] -> { Stmt_for_j[i0, i1, i2] -> scattering[0, i0, 0, i1, 0, i2, 0] };
> ; CHECK: WriteAccess
> -; CHECK: [n, m, o] -> { Stmt_for_k[i0, i1, i2] -> MemRef_A[i0, i2, i1] };
> +; CHECK: [n, o, m] -> { Stmt_for_j[i0, i1, i2] -> MemRef_A[i0, i2, i1] };
>
> define void @foo(i64 %n, i64 %m, i64 %o, double* %A) {
> entry:
> @@ -33,31 +35,31 @@ entry:
>
> for.i:
> %i = phi i64 [ 0, %entry ], [ %i.inc, %for.i.inc ]
> - br label %for.j
> -
> -for.j:
> - %j = phi i64 [ 0, %for.i ], [ %j.inc, %for.j.inc ]
> br label %for.k
>
> for.k:
> - %k = phi i64 [ 0, %for.j ], [ %k.inc, %for.k.inc ]
> + %k = phi i64 [ 0, %for.i ], [ %k.inc, %for.k.inc ]
> + br label %for.j
> +
> +for.j:
> + %j = phi i64 [ 0, %for.k ], [ %j.inc, %for.j.inc ]
> %subscript0 = mul i64 %i, %m
> - %subscript1 = add i64 %k, %subscript0
> + %subscript1 = add i64 %j, %subscript0
> %subscript2 = mul i64 %subscript1, %o
> - %subscript = add i64 %subscript2, %j
> + %subscript = add i64 %subscript2, %k
> %idx = getelementptr inbounds double* %A, i64 %subscript
> store double 1.0, double* %idx
> - br label %for.k.inc
> -
> -for.k.inc:
> - %k.inc = add nsw i64 %k, 1
> - %k.exitcond = icmp eq i64 %k.inc, %o
> - br i1 %k.exitcond, label %for.j.inc, label %for.k
> + br label %for.j.inc
>
> for.j.inc:
> %j.inc = add nsw i64 %j, 1
> %j.exitcond = icmp eq i64 %j.inc, %m
> - br i1 %j.exitcond, label %for.i.inc, label %for.j
> + br i1 %j.exitcond, label %for.k.inc, label %for.j
> +
> +for.k.inc:
> + %k.inc = add nsw i64 %k, 1
> + %k.exitcond = icmp eq i64 %k.inc, %o
> + br i1 %k.exitcond, label %for.i.inc, label %for.k
>
> for.i.inc:
> %i.inc = add nsw i64 %i, 1
>
> Modified: polly/trunk/test/ScopInfo/simple_loop_1.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/simple_loop_1.ll?rev=212198&r1=212197&r2=212198&view=diff
> ==============================================================================
> --- polly/trunk/test/ScopInfo/simple_loop_1.ll (original)
> +++ polly/trunk/test/ScopInfo/simple_loop_1.ll Wed Jul 2 12:47:48 2014
> @@ -25,6 +25,9 @@ return:
> ret void
> }
>
> +; CHECK: Assumed Context:
> +; CHECK: { : }
> +
> ; CHECK: Stmt_bb
> ; CHECK: Domain :=
> ; CHECK: [N] -> { Stmt_bb[i0] : i0 >= 0 and i0 <= -1 + N };
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
--
Johannes Doerfert
Researcher / PhD Student
Compiler Design Lab (Prof. Hack)
Saarland University, Computer Science
Building E1.3, Room 4.26
Tel. +49 (0)681 302-57521 : doerfert at cs.uni-saarland.de
Fax. +49 (0)681 302-3065 : http://www.cdl.uni-saarland.de/people/doerfert
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 213 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140802/57cdbbb5/attachment.sig>
More information about the llvm-commits
mailing list