diff options
-rw-r--r-- | polly/include/polly/ScopInfo.h | 11 | ||||
-rw-r--r-- | polly/lib/Analysis/ScopInfo.cpp | 19 | ||||
-rw-r--r-- | polly/test/Isl/CodeGen/non-affine-update.ll | 69 | ||||
-rw-r--r-- | polly/test/Isl/CodeGen/non-affine-update___%bb1---%bb15.jscop | 33 |
4 files changed, 115 insertions, 17 deletions
diff --git a/polly/include/polly/ScopInfo.h b/polly/include/polly/ScopInfo.h index 94a8355e66a..b37c7889018 100644 --- a/polly/include/polly/ScopInfo.h +++ b/polly/include/polly/ScopInfo.h @@ -514,8 +514,6 @@ public: /// /// @param Stmt The parent statement. /// @param AccessInst The instruction doing the access. - /// @param Id Identifier that is guranteed to be unique within the - /// same ScopStmt. /// @param BaseAddr The accessed array's address. /// @param ElemBytes Number of accessed bytes. /// @param AccType Whether read or write access. @@ -524,11 +522,10 @@ public: /// @param Subscripts Subscipt expressions /// @param Sizes Dimension lengths of the accessed array. /// @param BaseName Name of the acessed array. - MemoryAccess(ScopStmt *Stmt, Instruction *AccessInst, __isl_take isl_id *Id, - AccessType Type, Value *BaseAddress, unsigned ElemBytes, - bool Affine, ArrayRef<const SCEV *> Subscripts, - ArrayRef<const SCEV *> Sizes, Value *AccessValue, - AccessOrigin Origin, StringRef BaseName); + MemoryAccess(ScopStmt *Stmt, Instruction *AccessInst, AccessType Type, + Value *BaseAddress, unsigned ElemBytes, bool Affine, + ArrayRef<const SCEV *> Subscripts, ArrayRef<const SCEV *> Sizes, + Value *AccessValue, AccessOrigin Origin, StringRef BaseName); ~MemoryAccess(); /// @brief Get the type of a memory access. diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index c889a098dc8..16ada559c8c 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -641,17 +641,21 @@ void MemoryAccess::buildAccessRelation(const ScopArrayInfo *SAI) { } MemoryAccess::MemoryAccess(ScopStmt *Stmt, Instruction *AccessInst, - __isl_take isl_id *Id, AccessType Type, - Value *BaseAddress, unsigned ElemBytes, bool Affine, + AccessType Type, Value *BaseAddress, + unsigned ElemBytes, bool Affine, ArrayRef<const SCEV *> Subscripts, ArrayRef<const SCEV *> Sizes, Value *AccessValue, AccessOrigin Origin, StringRef BaseName) - : Id(Id), Origin(Origin), AccType(Type), RedType(RT_NONE), Statement(Stmt), + : Origin(Origin), AccType(Type), RedType(RT_NONE), Statement(Stmt), BaseAddr(BaseAddress), BaseName(BaseName), ElemBytes(ElemBytes), Sizes(Sizes.begin(), Sizes.end()), AccessInstruction(AccessInst), AccessValue(AccessValue), IsAffine(Affine), Subscripts(Subscripts.begin(), Subscripts.end()), AccessRelation(nullptr), - NewAccessRelation(nullptr) {} + NewAccessRelation(nullptr) { + + std::string IdName = "__polly_array_ref"; + Id = isl_id_alloc(Stmt->getParent()->getIslCtx(), IdName.c_str(), this); +} void MemoryAccess::realignParams() { isl_space *ParamSpace = Statement->getParent()->getParamSpace(); @@ -3636,20 +3640,15 @@ void ScopInfo::addMemoryAccess(BasicBlock *BB, Instruction *Inst, return; AccFuncSetType &AccList = AccFuncMap[BB]; - size_t Identifier = AccList.size(); - Value *BaseAddr = BaseAddress; std::string BaseName = getIslCompatibleName("MemRef_", BaseAddr, ""); - std::string IdName = "__polly_array_ref_" + std::to_string(Identifier); - isl_id *Id = isl_id_alloc(ctx, IdName.c_str(), nullptr); - bool isApproximated = Stmt->isRegionStmt() && (Stmt->getRegion()->getEntry() != BB); if (isApproximated && Type == MemoryAccess::MUST_WRITE) Type = MemoryAccess::MAY_WRITE; - AccList.emplace_back(Stmt, Inst, Id, Type, BaseAddress, ElemBytes, Affine, + AccList.emplace_back(Stmt, Inst, Type, BaseAddress, ElemBytes, Affine, Subscripts, Sizes, AccessValue, Origin, BaseName); Stmt->addAccess(&AccList.back()); } diff --git a/polly/test/Isl/CodeGen/non-affine-update.ll b/polly/test/Isl/CodeGen/non-affine-update.ll new file mode 100644 index 00000000000..54c02f04f46 --- /dev/null +++ b/polly/test/Isl/CodeGen/non-affine-update.ll @@ -0,0 +1,69 @@ +; RUN: opt %loadPolly -polly-import-jscop -polly-import-jscop-dir=%S \ +; RUN: -polly-codegen -S < %s | FileCheck %s +; +; void non-affine-update(double A[], double C[], double B[]) { +; for (int i = 0; i < 10; i++) { +; if (A[i] >= 6) +; B[i] += 42; +; else +; C[i] += 3; +; } +; } + +; Verify that all changed memory access functions are corectly code generated. +; At some point this did not work due to memory access identifiers not being +; unique within non-affine scop statements. + +; CHECK: polly.stmt.bb2: +; CHECK: %scevgep = getelementptr double, double* %A, i64 %polly.indvar + +; CHECK: polly.stmt.bb9: +; CHECK: %polly.access.C{{.*}} = getelementptr double, double* %C, i64 42 +; CHECK: %polly.access.C{{.*}} = getelementptr double, double* %C, i64 42 + +; CHECK: polly.stmt.bb5: +; CHECK: %polly.access.B{{.*}} = getelementptr double, double* %B, i64 113 +; CHECK: %polly.access.B{{.*}} = getelementptr double, double* %B, i64 113 + + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" + +define void @non-affine-update(double* %A, double* %C, double* %B) { +bb: + br label %bb1 + +bb1: ; preds = %bb14, %bb + %indvars.iv = phi i64 [ %indvars.iv.next, %bb14 ], [ 0, %bb ] + %exitcond = icmp ne i64 %indvars.iv, 10 + br i1 %exitcond, label %bb2, label %bb15 + +bb2: ; preds = %bb1 + %tmp = getelementptr inbounds double, double* %A, i64 %indvars.iv + %tmp3 = load double, double* %tmp, align 8 + %tmp4 = fcmp ult double %tmp3, 6.000000e+00 + br i1 %tmp4, label %bb9, label %bb5 + +bb5: ; preds = %bb2 + %tmp6 = getelementptr inbounds double, double* %B, i64 %indvars.iv + %tmp7 = load double, double* %tmp6, align 8 + %tmp8 = fadd double %tmp7, 4.200000e+01 + store double %tmp8, double* %tmp6, align 8 + br label %bb13 + +bb9: ; preds = %bb2 + %tmp10 = getelementptr inbounds double, double* %C, i64 %indvars.iv + %tmp11 = load double, double* %tmp10, align 8 + %tmp12 = fadd double %tmp11, 3.000000e+00 + store double %tmp12, double* %tmp10, align 8 + br label %bb13 + +bb13: ; preds = %bb9, %bb5 + br label %bb14 + +bb14: ; preds = %bb13 + %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 + br label %bb1 + +bb15: ; preds = %bb1 + ret void +} diff --git a/polly/test/Isl/CodeGen/non-affine-update___%bb1---%bb15.jscop b/polly/test/Isl/CodeGen/non-affine-update___%bb1---%bb15.jscop new file mode 100644 index 00000000000..72a24adb456 --- /dev/null +++ b/polly/test/Isl/CodeGen/non-affine-update___%bb1---%bb15.jscop @@ -0,0 +1,33 @@ +{ + "context" : "{ : }", + "name" : "bb1 => bb15", + "statements" : [ + { + "accesses" : [ + { + "kind" : "read", + "relation" : "{ Stmt_bb2__TO__bb13[i0] -> MemRef_A[i0] }" + }, + { + "kind" : "read", + "relation" : "{ Stmt_bb2__TO__bb13[i0] -> MemRef_C[42] }" + }, + { + "kind" : "write", + "relation" : "{ Stmt_bb2__TO__bb13[i0] -> MemRef_C[42] }" + }, + { + "kind" : "read", + "relation" : "{ Stmt_bb2__TO__bb13[i0] -> MemRef_B[113] }" + }, + { + "kind" : "write", + "relation" : "{ Stmt_bb2__TO__bb13[i0] -> MemRef_B[113] }" + } + ], + "domain" : "{ Stmt_bb2__TO__bb13[i0] : i0 <= 9 and i0 >= 0 }", + "name" : "Stmt_bb2__TO__bb13", + "schedule" : "{ Stmt_bb2__TO__bb13[i0] -> [i0] }" + } + ] +} |