[polly] r205799 - delinearize memory access functions

Sebastian Pop spop at codeaurora.org
Tue Apr 8 14:20:45 PDT 2014


Author: spop
Date: Tue Apr  8 16:20:44 2014
New Revision: 205799

URL: http://llvm.org/viewvc/llvm-project?rev=205799&view=rev
Log:
delinearize memory access functions

Modified:
    polly/trunk/include/polly/ScopDetection.h
    polly/trunk/include/polly/TempScopInfo.h
    polly/trunk/lib/Analysis/ScopDetection.cpp
    polly/trunk/lib/Analysis/ScopInfo.cpp
    polly/trunk/lib/Analysis/TempScopInfo.cpp
    polly/trunk/test/Dependences/do_pluto_matmult.ll
    polly/trunk/test/Isl/Ast/OpenMP/nested_loop_both_parallel_parametric.ll
    polly/trunk/test/ScopInfo/constant_start_integer.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

Modified: polly/trunk/include/polly/ScopDetection.h
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/ScopDetection.h?rev=205799&r1=205798&r2=205799&view=diff
==============================================================================
--- polly/trunk/include/polly/ScopDetection.h (original)
+++ polly/trunk/include/polly/ScopDetection.h Tue Apr  8 16:20:44 2014
@@ -73,6 +73,7 @@ namespace polly {
 typedef std::set<const SCEV *> ParamSetType;
 
 extern bool PollyTrackFailures;
+extern bool PollyDelinearize;
 
 //===----------------------------------------------------------------------===//
 /// @brief Pass to detect the maximal static control parts (Scops) of a

Modified: polly/trunk/include/polly/TempScopInfo.h
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/TempScopInfo.h?rev=205799&r1=205798&r2=205799&view=diff
==============================================================================
--- polly/trunk/include/polly/TempScopInfo.h (original)
+++ polly/trunk/include/polly/TempScopInfo.h Tue Apr  8 16:20:44 2014
@@ -29,6 +29,8 @@ using namespace llvm;
 
 namespace polly {
 
+extern bool PollyDelinearize;
+
 //===---------------------------------------------------------------------===//
 /// @brief A memory access described by a SCEV expression and the access type.
 class IRAccess {
@@ -52,10 +54,14 @@ private:
   bool IsAffine;
 
 public:
+  SmallVector<const SCEV *, 4> Subscripts, Sizes;
+
   explicit IRAccess(TypeKind Type, const Value *BaseAddress, const SCEV *Offset,
-                    unsigned elemBytes, bool Affine)
+                    unsigned elemBytes, bool Affine,
+                    SmallVector<const SCEV *, 4> Subscripts,
+                    SmallVector<const SCEV *, 4> Sizes)
       : BaseAddress(BaseAddress), Offset(Offset), ElemBytes(elemBytes),
-        Type(Type), IsAffine(Affine) {}
+        Type(Type), IsAffine(Affine), Subscripts(Subscripts), Sizes(Sizes) {}
 
   enum TypeKind getType() const { return Type; }
 

Modified: polly/trunk/lib/Analysis/ScopDetection.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopDetection.cpp?rev=205799&r1=205798&r2=205799&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopDetection.cpp (original)
+++ polly/trunk/lib/Analysis/ScopDetection.cpp Tue Apr  8 16:20:44 2014
@@ -117,6 +117,12 @@ TrackFailures("polly-detect-track-failur
               cl::location(PollyTrackFailures), cl::Hidden, cl::ZeroOrMore,
               cl::init(false), cl::cat(PollyCategory));
 
+static cl::opt<bool, true>
+PollyDelinearizeX("polly-delinearize",
+                  cl::desc("Delinearize array access functions"),
+                  cl::location(PollyDelinearize), cl::Hidden, cl::ZeroOrMore,
+                  cl::init(false), cl::cat(PollyCategory));
+
 static cl::opt<bool>
 VerifyScops("polly-detect-verify",
             cl::desc("Verify the detected SCoPs after each transformation"),
@@ -124,6 +130,7 @@ VerifyScops("polly-detect-verify",
             cl::cat(PollyCategory));
 
 bool polly::PollyTrackFailures = false;
+bool polly::PollyDelinearize = false;
 
 //===----------------------------------------------------------------------===//
 // Statistics.
@@ -357,11 +364,25 @@ bool ScopDetection::isValidMemoryAccess(
     return invalid<ReportVariantBasePtr>(Context, /*Assert=*/false, BaseValue);
 
   AccessFunction = SE->getMinusSCEV(AccessFunction, BasePointer);
+  const SCEVAddRecExpr *AF = dyn_cast<SCEVAddRecExpr>(AccessFunction);
 
-  if (!AllowNonAffine &&
-      !isAffineExpr(&Context.CurRegion, AccessFunction, *SE, BaseValue))
+  if (AllowNonAffine) {
+    // Do not check whether AccessFunction is affine.
+  } else if (PollyDelinearize && AF) {
+    // Try to delinearize AccessFunction.
+    SmallVector<const SCEV *, 4> Subscripts, Sizes;
+    AF->delinearize(*SE, Subscripts, Sizes);
+    int size = Subscripts.size();
+
+    for (int i = 0; i < size; ++i)
+      if (!isAffineExpr(&Context.CurRegion, Subscripts[i], *SE, BaseValue))
+        return invalid<ReportNonAffineAccess>(Context, /*Assert=*/true,
+                                              AccessFunction);
+  } else if (!isAffineExpr(&Context.CurRegion, AccessFunction, *SE,
+                           BaseValue)) {
     return invalid<ReportNonAffineAccess>(Context, /*Assert=*/true,
                                           AccessFunction);
+  }
 
   // FIXME: Alias Analysis thinks IntToPtrInst aliases with alloca instructions
   // created by IndependentBlocks Pass.

Modified: polly/trunk/lib/Analysis/ScopInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopInfo.cpp?rev=205799&r1=205798&r2=205799&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
+++ polly/trunk/lib/Analysis/ScopInfo.cpp Tue Apr  8 16:20:44 2014
@@ -337,21 +337,37 @@ MemoryAccess::MemoryAccess(const IRAcces
 
   Type = Access.isRead() ? READ : MUST_WRITE;
 
-  isl_pw_aff *Affine = SCEVAffinator::getPwAff(Statement, Access.getOffset());
+  int Size = Access.Subscripts.size();
+  assert(Size > 0 && "access function with no subscripts");
+  AccessRelation = NULL;
 
-  // Divide the access function by the size of the elements in the array.
-  //
-  // A stride one array access in C expressed as A[i] is expressed in LLVM-IR
-  // as something like A[i * elementsize]. This hides the fact that two
-  // subsequent values of 'i' index two values that are stored next to each
-  // other in memory. By this division we make this characteristic obvious
-  // again.
-  isl_val *v;
-  v = isl_val_int_from_si(isl_pw_aff_get_ctx(Affine),
-                          Access.getElemSizeInBytes());
-  Affine = isl_pw_aff_scale_down_val(Affine, v);
+  for (int i = 0; i < Size; ++i) {
+    isl_pw_aff *Affine =
+        SCEVAffinator::getPwAff(Statement, Access.Subscripts[i]);
+
+    if (i == Size - 1) {
+      // Divide the access function of the last subscript by the size of the
+      // elements in the array.
+      //
+      // A stride one array access in C expressed as A[i] is expressed in
+      // LLVM-IR as something like A[i * elementsize]. This hides the fact that
+      // two subsequent values of 'i' index two values that are stored next to
+      // each other in memory. By this division we make this characteristic
+      // obvious again.
+      isl_val *v;
+      v = isl_val_int_from_si(isl_pw_aff_get_ctx(Affine),
+                              Access.getElemSizeInBytes());
+      Affine = isl_pw_aff_scale_down_val(Affine, v);
+    }
+
+    isl_map *SubscriptMap = isl_map_from_pw_aff(Affine);
+
+    if (!AccessRelation)
+      AccessRelation = SubscriptMap;
+    else
+      AccessRelation = isl_map_flat_range_product(AccessRelation, SubscriptMap);
+  }
 
-  AccessRelation = isl_map_from_pw_aff(Affine);
   isl_space *Space = Statement->getDomainSpace();
   AccessRelation = isl_map_set_tuple_id(
       AccessRelation, isl_dim_in, isl_space_get_tuple_id(Space, isl_dim_set));

Modified: polly/trunk/lib/Analysis/TempScopInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/TempScopInfo.cpp?rev=205799&r1=205798&r2=205799&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/TempScopInfo.cpp (original)
+++ polly/trunk/lib/Analysis/TempScopInfo.cpp Tue Apr  8 16:20:44 2014
@@ -131,9 +131,14 @@ bool TempScopInfo::buildScalarDependence
 
     assert(!isa<PHINode>(UI) && "Non synthesizable PHINode found in a SCoP!");
 
+    SmallVector<const SCEV *, 4> Subscripts, Sizes;
+    Subscripts.push_back(SE->getConstant(ZeroOffset->getType(), 0));
+    Sizes.push_back(SE->getConstant(ZeroOffset->getType(), 1));
+
     // Use the def instruction as base address of the IRAccess, so that it will
     // become the name of the scalar access in the polyhedral form.
-    IRAccess ScalarAccess(IRAccess::SCALARREAD, Inst, ZeroOffset, 1, true);
+    IRAccess ScalarAccess(IRAccess::SCALARREAD, Inst, ZeroOffset, 1, true,
+                          Subscripts, Sizes);
     AccFuncMap[UseParent].push_back(std::make_pair(ScalarAccess, UI));
   }
 
@@ -142,14 +147,17 @@ bool TempScopInfo::buildScalarDependence
 
 IRAccess TempScopInfo::buildIRAccess(Instruction *Inst, Loop *L, Region *R) {
   unsigned Size;
+  Type *SizeType;
   enum IRAccess::TypeKind Type;
 
   if (LoadInst *Load = dyn_cast<LoadInst>(Inst)) {
-    Size = TD->getTypeStoreSize(Load->getType());
+    SizeType = Load->getType();
+    Size = TD->getTypeStoreSize(SizeType);
     Type = IRAccess::READ;
   } else {
     StoreInst *Store = cast<StoreInst>(Inst);
-    Size = TD->getTypeStoreSize(Store->getValueOperand()->getType());
+    SizeType = Store->getValueOperand()->getType();
+    Size = TD->getTypeStoreSize(SizeType);
     Type = IRAccess::WRITE;
   }
 
@@ -159,11 +167,36 @@ IRAccess TempScopInfo::buildIRAccess(Ins
 
   assert(BasePointer && "Could not find base pointer");
   AccessFunction = SE->getMinusSCEV(AccessFunction, BasePointer);
+  SmallVector<const SCEV *, 4> Subscripts, Sizes;
+
+  bool IsAffine = true;
+  const SCEVAddRecExpr *AF = dyn_cast<SCEVAddRecExpr>(AccessFunction);
 
-  bool IsAffine = isAffineExpr(R, AccessFunction, *SE, BasePointer->getValue());
+  if (PollyDelinearize && AF) {
+    const SCEV *Remainder = AF->delinearize(*SE, Subscripts, Sizes);
+    int NSubs = Subscripts.size();
+
+    // Normalize the last dimension: integrate the size of the "scalar dimension"
+    // and the remainder of the delinearization.
+    Subscripts[NSubs-1] = SE->getMulExpr(Subscripts[NSubs-1],
+                                         Sizes[NSubs-1]);
+    Subscripts[NSubs-1] = SE->getAddExpr(Subscripts[NSubs-1], Remainder);
+
+    for (int i = 0; i < NSubs; ++i)
+      if (!isAffineExpr(R, Subscripts[i], *SE, BasePointer->getValue())) {
+        IsAffine = false;
+        break;
+      }
+  }
+
+  if (Subscripts.size() == 0) {
+    Subscripts.push_back(AccessFunction);
+    Sizes.push_back(SE->getConstant(ZeroOffset->getType(), Size));
+    IsAffine = isAffineExpr(R, AccessFunction, *SE, BasePointer->getValue());
+  }
 
   return IRAccess(Type, BasePointer->getValue(), AccessFunction, Size,
-                  IsAffine);
+                  IsAffine, Subscripts, Sizes);
 }
 
 void TempScopInfo::buildAccessFunctions(Region &R, BasicBlock &BB) {
@@ -178,7 +211,11 @@ void TempScopInfo::buildAccessFunctions(
     if (!isa<StoreInst>(Inst) && buildScalarDependences(Inst, &R)) {
       // If the Instruction is used outside the statement, we need to build the
       // write access.
-      IRAccess ScalarAccess(IRAccess::SCALARWRITE, Inst, ZeroOffset, 1, true);
+      SmallVector<const SCEV *, 4> Subscripts, Sizes;
+      Subscripts.push_back(SE->getConstant(ZeroOffset->getType(), 0));
+      Sizes.push_back(SE->getConstant(ZeroOffset->getType(), 1));
+      IRAccess ScalarAccess(IRAccess::SCALARWRITE, Inst, ZeroOffset, 1, true,
+                            Subscripts, Sizes);
       Functions.push_back(std::make_pair(ScalarAccess, Inst));
     }
   }

Modified: polly/trunk/test/Dependences/do_pluto_matmult.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Dependences/do_pluto_matmult.ll?rev=205799&r1=205798&r2=205799&view=diff
==============================================================================
--- polly/trunk/test/Dependences/do_pluto_matmult.ll (original)
+++ polly/trunk/test/Dependences/do_pluto_matmult.ll Tue Apr  8 16:20:44 2014
@@ -1,5 +1,5 @@
 ; RUN: opt %loadPolly -basicaa -polly-dependences -analyze -polly-dependences-analysis-type=value-based < %s | FileCheck %s -check-prefix=VALUE
-; RUN: opt %loadPolly -basicaa -polly-dependences -analyze -polly-dependences-analysis-type=memory-based < %s | FileCheck %s -check-prefix=MEMORY
+; RUN: opt %loadPolly -basicaa -polly-dependences -analyze -polly-dependences-analysis-type=memory-based -polly-delinearize < %s | FileCheck %s -check-prefix=MEMORY
 
 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"
 target triple = "x86_64-unknown-linux-gnu"

Modified: polly/trunk/test/Isl/Ast/OpenMP/nested_loop_both_parallel_parametric.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Isl/Ast/OpenMP/nested_loop_both_parallel_parametric.ll?rev=205799&r1=205798&r2=205799&view=diff
==============================================================================
--- polly/trunk/test/Isl/Ast/OpenMP/nested_loop_both_parallel_parametric.ll (original)
+++ polly/trunk/test/Isl/Ast/OpenMP/nested_loop_both_parallel_parametric.ll Tue Apr  8 16:20:44 2014
@@ -1,4 +1,4 @@
-; RUN: opt %loadPolly -polly-ast -polly-ast-detect-parallel -analyze < %s | FileCheck %s
+; RUN: opt %loadPolly -polly-ast -polly-ast-detect-parallel -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"
 target triple = "x86_64-pc-linux-gnu"
 
@@ -49,8 +49,8 @@ ret:
 ; to polly. However, we should be able to obtain it due to the out of bounds
 ; memory accesses, that would happen if n >= 1024.
 ;
+; CHECK: #pragma omp parallel for
 ; CHECK: for (int c1 = 0; c1 < n; c1 += 1)
 ; CHECK:   #pragma simd
-; CHECK:   #pragma omp parallel for
 ; CHECK:   for (int c3 = 0; c3 < n; c3 += 1)
 ; CHECK:     Stmt_loop_body(c1, c3);

Modified: polly/trunk/test/ScopInfo/constant_start_integer.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/constant_start_integer.ll?rev=205799&r1=205798&r2=205799&view=diff
==============================================================================
--- polly/trunk/test/ScopInfo/constant_start_integer.ll (original)
+++ polly/trunk/test/ScopInfo/constant_start_integer.ll Tue Apr  8 16:20:44 2014
@@ -1,4 +1,4 @@
-; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s
+; RUN: opt %loadPolly -polly-scops -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"
 
@@ -11,20 +11,15 @@ target triple = "x86_64-unknown-linux-gn
 ;     }
 ;   }
 ; }
-;
-; Access functions:
-;
-;   input[j * 64 + i + 1] => {4,+,256}<%for.cond1.preheader>
-;   input[j * 64 + i + 0] => {0,+,256}<%for.cond1.preheader>
-;
-; They should share the same zero-start parameter:
-;
-;   p0: {0,+,256}<%for.cond1.preheader>
-;   input[j * 64 + i + 1] => p0 + 4
-;   input[j * 64 + i + 0] => p0
-;
 
-; Function Attrs: nounwind
+; CHECK  p0: {0,+,256}<%for.cond1.preheader>
+; CHECK-NOT: p1
+
+; CHECK: ReadAccess
+; CHECK:   [p_0] -> { Stmt_for_body3[i0] -> MemRef_input[p_0, 1 + i0] };
+; CHECK: MustWriteAccess
+; CHECK:   [p_0] -> { Stmt_for_body3[i0] -> MemRef_input[p_0, i0] };
+
 define void @foo(float* nocapture %input) {
 entry:
   br label %for.cond1.preheader
@@ -56,11 +51,3 @@ for.inc10:
 for.end12:                                        ; preds = %for.inc10
   ret void
 }
-
-; CHECK  p0: {0,+,256}<%for.cond1.preheader>
-; CHECK-NOT: p1
-
-; CHECK: ReadAccess :=
-; CHECK:   [p_0] -> { Stmt_for_body3[i0] -> MemRef_input[o0] : 4o0 = 4 + p_0 + 4i0 };
-; CHECK: MustWriteAccess :=
-; CHECK:   [p_0] -> { Stmt_for_body3[i0] -> MemRef_input[o0] : 4o0 = p_0 + 4i0 };

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=205799&r1=205798&r2=205799&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 Tue Apr  8 16:20:44 2014
@@ -1,4 +1,4 @@
-; RUN: opt %loadPolly -polly-scops -analyze -polly-allow-nonaffine < %s | FileCheck %s
+; RUN: opt %loadPolly -polly-scops -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"
 
@@ -9,14 +9,18 @@ target triple = "x86_64-unknown-linux-gn
 ;       for (long k = 0; k < o; k++)
 ;         A[i+3][j-4][k+7] = 1.0;
 ; }
-;
-; Access function:
-;
-;   {{{(56 + (8 * (-4 + (3 * %m)) * %o) + %A),+,(8 * %m * %o)}<%for.i>,+,
-;      (8 * %o)}<%for.j>,+,8}<%for.k>
-;
-; TODO: Recover the multi-dimensional array information to avoid the
-;       conservative approximation we are using today.
+
+; 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: MustWriteAccess
+; CHECK:   [n, m, o] -> { Stmt_for_k[i0, i1, i2] -> MemRef_A[3 + i0, -4 + i1, 7 + i2] };
 
 define void @foo(i64 %n, i64 %m, i64 %o, double* %A) {
 entry:
@@ -61,16 +65,3 @@ for.i.inc:
 end:
   ret void
 }
-
-; 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: MayWriteAccess
-; CHECK:   [n, m, o] -> { Stmt_for_k[i0, i1, i2] -> MemRef_A[o0] };
-

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=205799&r1=205798&r2=205799&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 Tue Apr  8 16:20:44 2014
@@ -1,4 +1,4 @@
-; RUN: opt %loadPolly -polly-scops -analyze -polly-allow-nonaffine < %s | FileCheck %s
+; RUN: opt %loadPolly -polly-scops -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"
 
@@ -14,8 +14,20 @@ target triple = "x86_64-unknown-linux-gn
 ;    {{{((8 * ((((%m * %p) + %q) * %o) + %r)) + %A),+,(8 * %m * %o)}<%for.i>,+,
 ;        (8 * %o)}<%for.j>,+,8}<%for.k>
 ;
-; TODO: Recover the multi-dimensional array information to avoid the
-;       conservative approximation we are using today.
+; CHECK: p0: %n
+; CHECK: p1: %m
+; CHECK: p2: %o
+; CHECK: p3: %p
+; CHECK: p4: %q
+; CHECK: p5: %r
+; CHECK-NOT: p6
+;
+; CHECK: Domain
+; CHECK:   [n, m, o, p, q, r] -> { 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, p, q, r] -> { Stmt_for_k[i0, i1, i2] -> scattering[0, i0, 0, i1, 0, i2, 0] };
+; CHECK: MustWriteAccess
+; CHECK:   [n, m, o, p, q, r] -> { Stmt_for_k[i0, i1, i2] -> MemRef_A[p + i0, q + i1, r + i2] };
 
 define void @foo(i64 %n, i64 %m, i64 %o, double* %A, i64 %p, i64 %q, i64 %r) {
 entry:
@@ -60,15 +72,3 @@ for.i.inc:
 end:
   ret void
 }
-
-; 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: MayWriteAccess
-; CHECK:   [n, m, o] -> { Stmt_for_k[i0, i1, i2] -> MemRef_A[o0] };

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=205799&r1=205798&r2=205799&view=diff
==============================================================================
--- polly/trunk/test/ScopInfo/multidim_nested_start_integer.ll (original)
+++ polly/trunk/test/ScopInfo/multidim_nested_start_integer.ll Tue Apr  8 16:20:44 2014
@@ -1,4 +1,4 @@
-; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s
+; RUN: opt %loadPolly -polly-scops -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"
 
@@ -14,11 +14,17 @@ target triple = "x86_64-unknown-linux-gn
 ;   {{{(56 + (8 * (-4 + (3 * %m)) * %o) + %A),+,(8 * %m * %o)}<%for.i>,+,
 ;      (8 * %o)}<%for.j>,+,8}<%for.k>
 ;
-; The nested 'start' should be splitted into three parameters:
-;   p1: {0,+,(8 * %o)}<%for.j>
-;   p2: {0,+,(8 * %m * %o)}<%for.i>
-;   p3: (8 * (-4 + (3 * %m)) * %o)
-;
+; 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: MustWriteAccess
+; CHECK:   [n, m, o] -> { Stmt_for_k[i0, i1, i2] -> MemRef_A[3 + i0, -4 + i1, 7 + i2] };
+
 
 define void @foo(i64 %n, i64 %m, i64 %o, double* %A) {
 entry:
@@ -63,16 +69,3 @@ for.i.inc:
 end:
   ret void
 }
-
-; CHECK: p0: %o
-; CHECK: p1: {0,+,(8 * %o)}<%for.j>
-; CHECK: p2: {0,+,(8 * %m * %o)}<%for.i>
-; CHECK: p3: (8 * (-4 + (3 * %m)) * %o)
-; CHECK-NOT: p4
-
-; CHECK: Domain
-; CHECK:   [o, p_1, p_2, p_3] -> { Stmt_for_k[i0] : i0 >= 0 and i0 <= -1 + o };
-; CHECK: Scattering
-; CHECK:   [o, p_1, p_2, p_3] -> { Stmt_for_k[i0] -> scattering[0, i0, 0] };
-; CHECK: MustWriteAccess
-; CHECK:   [o, p_1, p_2, p_3] -> { Stmt_for_k[i0] -> MemRef_A[o0] : 8o0 = 56 + p_1 + p_2 + p_3 + 8i0 };

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=205799&r1=205798&r2=205799&view=diff
==============================================================================
--- polly/trunk/test/ScopInfo/multidim_nested_start_share_parameter.ll (original)
+++ polly/trunk/test/ScopInfo/multidim_nested_start_share_parameter.ll Tue Apr  8 16:20:44 2014
@@ -1,4 +1,4 @@
-; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s
+; RUN: opt %loadPolly -polly-scops -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"
 
@@ -19,10 +19,14 @@ target triple = "x86_64-unknown-linux-gn
 ;   {{{(136 + (8 * (-14 + (13 * %m)) * %o) + %A),+,(8 * %m * %o)}<%for.i>,+,
 ;      (8 * %o)}<%for.j>,+,8}<%for.k>
 ;
-; They should share the following parameters:
-;     p1: {0,+,(8 * %o)}<%for.j>
-;     p2: {0,+,(8 * %m * %o)}<%for.i>
+; CHECK: p0: %n
+; CHECK: p1: %m
+; CHECK: p2: %o
+; CHECK-NOT: p3
 ;
+; CHECK:   [n, m, o] -> { Stmt_for_k[i0, i1, i2] -> MemRef_A[3 + i0, -4 + i1, 7 + i2] };
+; CHECK:   [n, m, o] -> { Stmt_for_k[i0, i1, i2] -> MemRef_A[13 + i0, -14 + i1, 17 + i2] };
+
 
 define void @foo(i64 %n, i64 %m, i64 %o, double* %A) {
 entry:
@@ -79,14 +83,3 @@ for.i.inc:
 end:
   ret void
 }
-
-; CHECK: p0: %o
-; CHECK: p1: {0,+,(8 * %o)}<%for.j>
-; CHECK: p2: {0,+,(8 * %m * %o)}<%for.i>
-; CHECK: p3: (8 * (-4 + (3 * %m)) * %o)
-; CHECK: p4: (8 * (-14 + (13 * %m)) * %o)
-; CHECK-NOT: p4
-
-; CHECK:   [o, p_1, p_2, p_3, p_4] -> { Stmt_for_k[i0] -> MemRef_A[o0] : 8o0 = 56 + p_1 + p_2 + p_3 + 8i0 };
-; CHECK:   [o, p_1, p_2, p_3, p_4] -> { Stmt_for_k[i0] -> MemRef_A[o0] : 8o0 = 136 + p_1 + p_2 + p_4 + 8i0 };
-

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=205799&r1=205798&r2=205799&view=diff
==============================================================================
--- polly/trunk/test/ScopInfo/multidim_only_ivs_2d.ll (original)
+++ polly/trunk/test/ScopInfo/multidim_only_ivs_2d.ll Tue Apr  8 16:20:44 2014
@@ -1,4 +1,4 @@
-; RUN: opt %loadPolly -polly-scops -analyze -polly-allow-nonaffine < %s | FileCheck %s
+; RUN: opt %loadPolly -polly-scops -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"
 
@@ -9,11 +9,17 @@ target triple = "x86_64-unknown-linux-gn
 ;     for (long j = 0; j < m; j++)
 ;       A[i][j] = 1.0;
 ; }
-;
-; Access function: {{0,+,%m}<%for.i>,+,1}<nw><%for.j>
-;
-; TODO: Recover the multi-dimensional array information to avoid the
-;       conservative approximation we are using today.
+
+; 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] };
 
 define void @foo(i64 %n, i64 %m, double* %A) {
 entry:
@@ -41,15 +47,3 @@ for.i.inc:
 end:
   ret void
 }
-
-; 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: MayWriteAccess :=
-; CHECK:   [n, m] -> { Stmt_for_j[i0, i1] -> MemRef_A[o0] };
-

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=205799&r1=205798&r2=205799&view=diff
==============================================================================
--- polly/trunk/test/ScopInfo/multidim_only_ivs_3d.ll (original)
+++ polly/trunk/test/ScopInfo/multidim_only_ivs_3d.ll Tue Apr  8 16:20:44 2014
@@ -1,4 +1,4 @@
-; RUN: opt %loadPolly -polly-scops -analyze -polly-allow-nonaffine < %s | FileCheck %s
+; RUN: opt %loadPolly -polly-scops -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"
 
@@ -9,11 +9,18 @@ target triple = "x86_64-unknown-linux-gn
 ;       for (long k = 0; k < o; k++)
 ;         A[i][j][k] = 1.0;
 ; }
+
+; CHECK: p0: %n
+; CHECK: p1: %m
+; CHECK: p2: %o
+; CHECK-NOT: p3
 ;
-; Access function: {{{0,+,(%m * %o)}<%for.i>,+,%o}<%for.j>,+,1}<nw><%for.k>
-;
-; TODO: Recover the multi-dimensional array information to avoid the
-;       conservative approximation we are using today.
+; 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] };
 
 define void @foo(i64 %n, i64 %m, i64 %o, double* %A) {
 entry:
@@ -55,16 +62,3 @@ for.i.inc:
 end:
   ret void
 }
-
-; 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[o0] };
-

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=205799&r1=205798&r2=205799&view=diff
==============================================================================
--- polly/trunk/test/ScopInfo/multidim_only_ivs_3d_cast.ll (original)
+++ polly/trunk/test/ScopInfo/multidim_only_ivs_3d_cast.ll Tue Apr  8 16:20:44 2014
@@ -1,4 +1,4 @@
-; RUN: opt %loadPolly -polly-scops -analyze -polly-allow-nonaffine < %s | FileCheck %s
+; RUN: opt %loadPolly -polly-scops -analyze -polly-delinearize < %s | FileCheck %s
 
 ; void foo(int n, int m, int o, double A[n][m][o]) {
 ;
@@ -7,13 +7,18 @@
 ;       for (int k = 0; k < o; k++)
 ;         A[i][j][k] = 1.0;
 ; }
-;
-; Access function:
-;   {{{%A,+,(8 * (zext i32 %m to i64) * (zext i32 %o to i64))}<%for.i>,+,
-;    (8 * (zext i32 %o to i64))}<%for.j>,+,8}<%for.k>
-;
-; TODO: Recover the multi-dimensional array information to avoid the
-;       conservative approximation we are using today.
+
+; 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] };
 
 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"
@@ -66,15 +71,3 @@ for.i.inc:
 end:
   ret void
 }
-
-; 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[o0]





More information about the llvm-commits mailing list