[polly] r307907 - [Invariant Loads] Do not consider invariant loads to have dependences.
Michael Kruse via llvm-commits
llvm-commits at lists.llvm.org
Thu Jul 13 10:08:11 PDT 2017
This breaks Polly's regression tests:
********************
Testing Time: 28.77s
********************
Failing Tests (10):
Polly :: DeLICM/reduction_looprotate_hoisted.ll
Polly :: GPGPU/invariant-load-hoisting-with-variable-bounds.ll
Polly :: GPGPU/invariant-load-hoisting-with-variable-lower-bound.ll
Polly :: GPGPU/invariant-load-hoisting.ll
Polly :: Isl/CodeGen/invariant_load_base_pointer.ll
Polly :: Isl/CodeGen/invariant_load_base_pointer_conditional.ll
Polly :: Isl/CodeGen/invariant_load_ptr_ptr_noalias.ll
Polly :: Isl/CodeGen/invariant_load_scalar_escape_alloca_sharing.ll
Polly :: ScopInfo/complex-successor-structure-3.ll
Polly :: ScopInfo/invariant-loads-leave-read-only-statements.ll
Please fix or revert.
Michael
2017-07-13 14:18 GMT+02:00 Siddharth Bhat via llvm-commits
<llvm-commits at lists.llvm.org>:
> Author: bollu
> Date: Thu Jul 13 05:18:56 2017
> New Revision: 307907
>
> URL: http://llvm.org/viewvc/llvm-project?rev=307907&view=rev
> Log:
> [Invariant Loads] Do not consider invariant loads to have dependences.
>
> We need to relax constraints on invariant loads so that they do not
> create fake RAW dependences. So, we do not consider invariant loads as
> scalar dependences in a region.
>
> During these changes, it turned out that we do not consider `llvm::Value`
> replacements correctly within `PPCGCodeGeneration` and `ISLNodeBuilder`.
> The replacements dictated by `ValueMap` were not being followed in all
> places. This was fixed in this commit. There is no clean way to decouple
> this change because this bug only seems to arise when the relaxed
> version of invariant load hoisting was enabled.
>
> Differential Revision: https://reviews.llvm.org/D35120
>
> Added:
> polly/trunk/test/GPGPU/invariant-load-hoisting-with-variable-bounds.ll
> polly/trunk/test/GPGPU/invariant-load-hoisting-with-variable-lower-bound.ll
> Modified:
> polly/trunk/include/polly/Support/SCEVValidator.h
> polly/trunk/include/polly/Support/ScopHelper.h
> polly/trunk/lib/Analysis/ScopDetection.cpp
> polly/trunk/lib/CodeGen/IslNodeBuilder.cpp
> polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp
> polly/trunk/lib/Support/SCEVValidator.cpp
> polly/trunk/lib/Support/ScopHelper.cpp
> polly/trunk/test/DeLICM/reduction_looprotate_hoisted.ll
> polly/trunk/test/GPGPU/invariant-load-hoisting.ll
> polly/trunk/test/Isl/CodeGen/invariant_load_base_pointer.ll
> polly/trunk/test/Isl/CodeGen/invariant_load_base_pointer_conditional.ll
> polly/trunk/test/Isl/CodeGen/invariant_load_ptr_ptr_noalias.ll
> polly/trunk/test/Isl/CodeGen/invariant_load_scalar_escape_alloca_sharing.ll
> polly/trunk/test/ScopInfo/complex-successor-structure-3.ll
> polly/trunk/test/ScopInfo/invariant-loads-leave-read-only-statements.ll
>
> Modified: polly/trunk/include/polly/Support/SCEVValidator.h
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/Support/SCEVValidator.h?rev=307907&r1=307906&r2=307907&view=diff
> ==============================================================================
> --- polly/trunk/include/polly/Support/SCEVValidator.h (original)
> +++ polly/trunk/include/polly/Support/SCEVValidator.h Thu Jul 13 05:18:56 2017
> @@ -71,7 +71,8 @@ void findValues(const llvm::SCEV *Expr,
> /// @param AllowLoops Whether loop recurrences outside the loop that are in the
> /// region count as dependence.
> bool hasScalarDepsInsideRegion(const llvm::SCEV *Expr, const llvm::Region *R,
> - llvm::Loop *Scope, bool AllowLoops);
> + llvm::Loop *Scope, bool AllowLoops,
> + const InvariantLoadsSetTy &ILS);
> bool isAffineExpr(const llvm::Region *R, llvm::Loop *Scope,
> const llvm::SCEV *Expression, llvm::ScalarEvolution &SE,
> InvariantLoadsSetTy *ILS = nullptr);
>
> Modified: polly/trunk/include/polly/Support/ScopHelper.h
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/Support/ScopHelper.h?rev=307907&r1=307906&r2=307907&view=diff
> ==============================================================================
> --- polly/trunk/include/polly/Support/ScopHelper.h (original)
> +++ polly/trunk/include/polly/Support/ScopHelper.h Thu Jul 13 05:18:56 2017
> @@ -446,4 +446,4 @@ llvm::Loop *getFirstNonBoxedLoopFor(llvm
> llvm::Loop *getFirstNonBoxedLoopFor(llvm::BasicBlock *BB, llvm::LoopInfo &LI,
> const BoxedLoopsSetTy &BoxedLoops);
> } // namespace polly
> -#endif
> \ No newline at end of file
> +#endif
>
> Modified: polly/trunk/lib/Analysis/ScopDetection.cpp
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopDetection.cpp?rev=307907&r1=307906&r2=307907&view=diff
> ==============================================================================
> --- polly/trunk/lib/Analysis/ScopDetection.cpp (original)
> +++ polly/trunk/lib/Analysis/ScopDetection.cpp Thu Jul 13 05:18:56 2017
> @@ -856,7 +856,8 @@ bool ScopDetection::hasValidArraySizes(D
> continue;
> }
> }
> - if (hasScalarDepsInsideRegion(DelinearizedSize, &CurRegion, Scope, false))
> + if (hasScalarDepsInsideRegion(DelinearizedSize, &CurRegion, Scope, false,
> + Context.RequiredILS))
> return invalid<ReportNonAffineAccess>(
> Context, /*Assert=*/true, DelinearizedSize,
> Context.Accesses[BasePointer].front().first, BaseValue);
>
> Modified: polly/trunk/lib/CodeGen/IslNodeBuilder.cpp
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGen/IslNodeBuilder.cpp?rev=307907&r1=307906&r2=307907&view=diff
> ==============================================================================
> --- polly/trunk/lib/CodeGen/IslNodeBuilder.cpp (original)
> +++ polly/trunk/lib/CodeGen/IslNodeBuilder.cpp Thu Jul 13 05:18:56 2017
> @@ -322,6 +322,22 @@ void IslNodeBuilder::getReferencesInSubt
> Loops.remove_if([this](const Loop *L) {
> return S.contains(L) || L->contains(S.getEntry());
> });
> +
> + // Contains Values that may need to be replaced with other values
> + // due to replacements from the ValueMap. We should make sure
> + // that we return correctly remapped values.
> + // NOTE: this code path is tested by:
> + // 1. test/Isl/CodeGen/OpenMP/single_loop_with_loop_invariant_baseptr.ll
> + // 2. test/Isl/CodeGen/OpenMP/loop-body-references-outer-values-3.ll
> + SetVector<Value *> ReplacedValues;
> + for (Value *V : Values) {
> + auto It = ValueMap.find(V);
> + if (It == ValueMap.end())
> + ReplacedValues.insert(V);
> + else
> + ReplacedValues.insert(It->second);
> + }
> + Values = ReplacedValues;
> }
>
> void IslNodeBuilder::updateValues(ValueMapT &NewValues) {
>
> Modified: polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp?rev=307907&r1=307906&r2=307907&view=diff
> ==============================================================================
> --- polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp (original)
> +++ polly/trunk/lib/CodeGen/PPCGCodeGeneration.cpp Thu Jul 13 05:18:56 2017
> @@ -1358,7 +1358,16 @@ GPUNodeBuilder::getReferencesInKernel(pp
> SetVector<Function *> ValidSubtreeFunctions(
> getFunctionsFromRawSubtreeValues(SubtreeValues));
>
> - return std::make_pair(ValidSubtreeValues, ValidSubtreeFunctions);
> + // @see IslNodeBuilder::getReferencesInSubtree
> + SetVector<Value *> ReplacedValues;
> + for (Value *V : ValidSubtreeValues) {
> + auto It = ValueMap.find(V);
> + if (It == ValueMap.end())
> + ReplacedValues.insert(V);
> + else
> + ReplacedValues.insert(It->second);
> + }
> + return std::make_pair(ReplacedValues, ValidSubtreeFunctions);
> }
>
> void GPUNodeBuilder::clearDominators(Function *F) {
> @@ -1524,6 +1533,8 @@ GPUNodeBuilder::createLaunchParameters(p
> for (long i = 0; i < NumVars; i++) {
> isl_id *Id = isl_space_get_dim_id(Kernel->space, isl_dim_param, i);
> Value *Val = IDToValue[Id];
> + if (ValueMap.count(Val))
> + Val = ValueMap[Val];
> isl_id_free(Id);
>
> ArgSizes[Index] = computeSizeInBytes(Val->getType());
>
> Modified: polly/trunk/lib/Support/SCEVValidator.cpp
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Support/SCEVValidator.cpp?rev=307907&r1=307906&r2=307907&view=diff
> ==============================================================================
> --- polly/trunk/lib/Support/SCEVValidator.cpp (original)
> +++ polly/trunk/lib/Support/SCEVValidator.cpp Thu Jul 13 05:18:56 2017
> @@ -462,12 +462,14 @@ public:
> class SCEVInRegionDependences {
> const Region *R;
> Loop *Scope;
> + const InvariantLoadsSetTy &ILS;
> bool AllowLoops;
> bool HasInRegionDeps = false;
>
> public:
> - SCEVInRegionDependences(const Region *R, Loop *Scope, bool AllowLoops)
> - : R(R), Scope(Scope), AllowLoops(AllowLoops) {}
> + SCEVInRegionDependences(const Region *R, Loop *Scope, bool AllowLoops,
> + const InvariantLoadsSetTy &ILS)
> + : R(R), Scope(Scope), ILS(ILS), AllowLoops(AllowLoops) {}
>
> bool follow(const SCEV *S) {
> if (auto Unknown = dyn_cast<SCEVUnknown>(S)) {
> @@ -478,6 +480,20 @@ public:
> if (Call && isConstCall(Call))
> return false;
>
> + if (Inst) {
> + // When we invariant load hoist a load, we first make sure that there
> + // can be no dependences created by it in the Scop region. So, we should
> + // not consider scalar dependences to `LoadInst`s that are invariant
> + // load hoisted.
> + //
> + // If this check is not present, then we create data dependences which
> + // are strictly not necessary by tracking the invariant load as a
> + // scalar.
> + LoadInst *LI = dyn_cast<LoadInst>(Inst);
> + if (LI && ILS.count(LI) > 0)
> + return false;
> + }
> +
> // Return true when Inst is defined inside the region R.
> if (!Inst || !R->contains(Inst))
> return true;
> @@ -579,8 +595,9 @@ bool hasIVParams(const SCEV *Expr) {
> }
>
> bool hasScalarDepsInsideRegion(const SCEV *Expr, const Region *R,
> - llvm::Loop *Scope, bool AllowLoops) {
> - SCEVInRegionDependences InRegionDeps(R, Scope, AllowLoops);
> + llvm::Loop *Scope, bool AllowLoops,
> + const InvariantLoadsSetTy &ILS) {
> + SCEVInRegionDependences InRegionDeps(R, Scope, AllowLoops, ILS);
> SCEVTraversal<SCEVInRegionDependences> ST(InRegionDeps);
> ST.visitAll(Expr);
> return InRegionDeps.hasDependences();
>
> Modified: polly/trunk/lib/Support/ScopHelper.cpp
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Support/ScopHelper.cpp?rev=307907&r1=307906&r2=307907&view=diff
> ==============================================================================
> --- polly/trunk/lib/Support/ScopHelper.cpp (original)
> +++ polly/trunk/lib/Support/ScopHelper.cpp Thu Jul 13 05:18:56 2017
> @@ -499,9 +499,10 @@ bool polly::canSynthesize(const Value *V
> if (!V || !SE->isSCEVable(V->getType()))
> return false;
>
> + const InvariantLoadsSetTy &ILS = S.getRequiredInvariantLoads();
> if (const SCEV *Scev = SE->getSCEVAtScope(const_cast<Value *>(V), Scope))
> if (!isa<SCEVCouldNotCompute>(Scev))
> - if (!hasScalarDepsInsideRegion(Scev, &S.getRegion(), Scope, false))
> + if (!hasScalarDepsInsideRegion(Scev, &S.getRegion(), Scope, false, ILS))
> return true;
>
> return false;
>
> Modified: polly/trunk/test/DeLICM/reduction_looprotate_hoisted.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/DeLICM/reduction_looprotate_hoisted.ll?rev=307907&r1=307906&r2=307907&view=diff
> ==============================================================================
> --- polly/trunk/test/DeLICM/reduction_looprotate_hoisted.ll (original)
> +++ polly/trunk/test/DeLICM/reduction_looprotate_hoisted.ll Thu Jul 13 05:18:56 2017
> @@ -69,43 +69,33 @@ return:
> ; CHECK: After accesses {
> ; CHECK-NEXT: Stmt_reduction_preheader
> ; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
> -; CHECK-NEXT: [Start] -> { Stmt_reduction_preheader[i0] -> MemRef_i__phi[] };
> -; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
> ; CHECK-NEXT: [Start] -> { Stmt_reduction_preheader[i0] -> MemRef_phi__phi[] };
> ; CHECK-NEXT: new: [Start] -> { Stmt_reduction_preheader[i0] -> MemRef_A[i0] : 0 <= i0 <= 1 };
> ; CHECK-NEXT: Stmt_reduction_for
> -; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
> -; CHECK-NEXT: [Start] -> { Stmt_reduction_for[i0, i1] -> MemRef_i__phi[] };
> -; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
> +; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
> ; CHECK-NEXT: [Start] -> { Stmt_reduction_for[i0, i1] -> MemRef_phi__phi[] };
> ; CHECK-NEXT: new: [Start] -> { Stmt_reduction_for[i0, i1] -> MemRef_A[i0] : 0 <= i0 <= 1 and -i0 < i1 <= 3 - Start; Stmt_reduction_for[1, 0] -> MemRef_A[1] : Start >= 4; Stmt_reduction_for[0, 0] -> MemRef_A[0] };
> ; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
> ; CHECK-NEXT: [Start] -> { Stmt_reduction_for[i0, i1] -> MemRef_phi[] };
> ; CHECK-NEXT: new: [Start] -> { Stmt_reduction_for[i0, i1] -> MemRef_A[i0] : 0 <= i0 <= 1 and i0 <= i1 <= 3 - Start; Stmt_reduction_for[i0, 0] -> MemRef_A[i0] : 0 <= i0 <= 1 and i0 <= -4 + Start; Stmt_reduction_for[1, 0] -> MemRef_A[1] : Start <= 4 };
> -; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
> -; CHECK-NEXT: [Start] -> { Stmt_reduction_for[i0, i1] -> MemRef_i[] };
> ; CHECK-NEXT: Stmt_body
> ; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
> ; CHECK-NEXT: [Start] -> { Stmt_body[i0, i1] -> MemRef_mul[] };
> ; CHECK-NEXT: new: [Start] -> { Stmt_body[i0, i1] -> MemRef_A[i0] : 0 <= i0 <= 1 and i0 <= i1 <= 3 - Start; Stmt_body[i0, 0] -> MemRef_A[i0] : 0 <= i0 <= 1 and i0 <= -4 + Start; Stmt_body[1, 0] -> MemRef_A[1] : Start <= 4 };
> -; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
> +; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
> ; CHECK-NEXT: [Start] -> { Stmt_body[i0, i1] -> MemRef_phi[] };
> ; CHECK-NEXT: new: [Start] -> { Stmt_body[i0, i1] -> MemRef_A[i0] : Start <= 3 and 0 <= i0 <= 1 and i0 <= i1 <= 3 - Start; Stmt_body[1, 0] -> MemRef_A[1]; Stmt_body[0, 0] -> MemRef_A[0] : Start >= 4 };
> ; CHECK-NEXT: Stmt_reduction_inc
> -; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
> -; CHECK-NEXT: [Start] -> { Stmt_reduction_inc[i0, i1] -> MemRef_i__phi[] };
> -; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
> +; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
> ; CHECK-NEXT: [Start] -> { Stmt_reduction_inc[i0, i1] -> MemRef_mul[] };
> ; CHECK-NEXT: new: [Start] -> { Stmt_reduction_inc[i0, i1] -> MemRef_A[i0] : Start <= 3 and 0 <= i0 <= 1 and i0 <= i1 <= 3 - Start; Stmt_reduction_inc[1, 0] -> MemRef_A[1]; Stmt_reduction_inc[0, 0] -> MemRef_A[0] : Start >= 4 };
> ; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
> ; CHECK-NEXT: [Start] -> { Stmt_reduction_inc[i0, i1] -> MemRef_phi__phi[] };
> ; CHECK-NEXT: new: [Start] -> { Stmt_reduction_inc[i0, i1] -> MemRef_A[i0] : 0 <= i0 <= 1 and 0 < i1 <= 3 - Start; Stmt_reduction_inc[i0, 0] -> MemRef_A[i0] : 0 <= i0 <= 1 };
> -; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
> -; CHECK-NEXT: [Start] -> { Stmt_reduction_inc[i0, i1] -> MemRef_i[] };
> ; CHECK-NEXT: Stmt_reduction_exit
> ; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
> ; CHECK-NEXT: [Start] -> { Stmt_reduction_exit[i0] -> MemRef_A[i0] };
> -; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
> +; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
> ; CHECK-NEXT: [Start] -> { Stmt_reduction_exit[i0] -> MemRef_mul[] };
> ; CHECK-NEXT: new: [Start] -> { Stmt_reduction_exit[i0] -> MemRef_A[i0] : 0 <= i0 <= 1 };
> ; CHECK-NEXT: }
>
> Added: polly/trunk/test/GPGPU/invariant-load-hoisting-with-variable-bounds.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/GPGPU/invariant-load-hoisting-with-variable-bounds.ll?rev=307907&view=auto
> ==============================================================================
> --- polly/trunk/test/GPGPU/invariant-load-hoisting-with-variable-bounds.ll (added)
> +++ polly/trunk/test/GPGPU/invariant-load-hoisting-with-variable-bounds.ll Thu Jul 13 05:18:56 2017
> @@ -0,0 +1,63 @@
> +; RUN: opt %loadPolly -analyze -polly-use-llvm-names -polly-scops \
> +; RUN: -polly-invariant-load-hoisting < %s | FileCheck %s -check-prefix=SCOP
> +
> +
> +; RUN: opt %loadPolly -S -polly-use-llvm-names -polly-codegen-ppcg \
> +; RUN: -polly-invariant-load-hoisting < %s | FileCheck %s -check-prefix=HOST-IR
> +
> +; REQUIRES: pollyacc
> +
> +; SCOP: Function: f
> +; SCOP-NEXT: Region: %entry.split---%for.end
> +; SCOP-NEXT: Max Loop Depth: 1
> +; SCOP-NEXT: Invariant Accesses: {
> +; SCOP-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
> +; SCOP-NEXT: [tmp1, tmp4] -> { Stmt_entry_split[] -> MemRef_begin[0] };
> +; SCOP-NEXT: Execution Context: [tmp1, tmp4] -> { : }
> +; SCOP-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
> +; SCOP-NEXT: [tmp1, tmp4] -> { Stmt_for_body[i0] -> MemRef_end[0] };
> +; SCOP-NEXT: Execution Context: [tmp1, tmp4] -> { : }
> +; SCOP-NEXT: }
> +
> +
> +; Check that the kernel launch is generated in the host IR.
> +; This declaration would not have been generated unless a kernel launch exists.
> +; HOST-IR: declare void @polly_launchKernel(i8*, i32, i32, i32, i32, i32, i8*)
> +
> +; void f(int *begin, int *end, int *arr) {
> +; for (int i = *begin; i < *end; i++) {
> +; arr[i] = 0;
> +; }
> +; }
> +;
> +
> +target datalayout = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128"
> +
> +define void @f(i32* %begin, i32* %end, i32* %arr) {
> +entry:
> + br label %entry.split
> +
> +entry.split: ; preds = %entry
> + %tmp1 = load i32, i32* %begin, align 4
> + %tmp41 = load i32, i32* %end, align 4
> + %cmp2 = icmp slt i32 %tmp1, %tmp41
> + br i1 %cmp2, label %for.body.lr.ph, label %for.end
> +
> +for.body.lr.ph: ; preds = %entry.split
> + br label %for.body
> +
> +for.body: ; preds = %for.body.lr.ph, %for.body
> + %i.03 = phi i32 [ %tmp1, %for.body.lr.ph ], [ %inc, %for.body ]
> + %arrayidx = getelementptr inbounds i32, i32* %arr, i32 %i.03
> + store i32 0, i32* %arrayidx, align 4
> + %inc = add nsw i32 %i.03, 1
> + %tmp4 = load i32, i32* %end, align 4
> + %cmp = icmp slt i32 %inc, %tmp4
> + br i1 %cmp, label %for.body, label %for.cond.for.end_crit_edge
> +
> +for.cond.for.end_crit_edge: ; preds = %for.body
> + br label %for.end
> +
> +for.end: ; preds = %for.cond.for.end_crit_edge, %entry.split
> + ret void
> +}
>
> Added: polly/trunk/test/GPGPU/invariant-load-hoisting-with-variable-lower-bound.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/GPGPU/invariant-load-hoisting-with-variable-lower-bound.ll?rev=307907&view=auto
> ==============================================================================
> --- polly/trunk/test/GPGPU/invariant-load-hoisting-with-variable-lower-bound.ll (added)
> +++ polly/trunk/test/GPGPU/invariant-load-hoisting-with-variable-lower-bound.ll Thu Jul 13 05:18:56 2017
> @@ -0,0 +1,57 @@
> +; RUN: opt %loadPolly -analyze -polly-use-llvm-names -polly-scops \
> +; RUN: -polly-invariant-load-hoisting < %s | FileCheck %s -check-prefix=SCOP
> +
> +
> +; RUN: opt %loadPolly -S -polly-use-llvm-names -polly-codegen-ppcg \
> +; RUN: -polly-invariant-load-hoisting < %s | FileCheck %s -check-prefix=HOST-IR
> +
> +; REQUIRES: pollyacc
> +
> +; Check that we detect a scop with invariant accesses.
> +; SCOP: Function: f
> +; SCOP-NEXT: Region: %entry.split---%for.end
> +; SCOP-NEXT: Max Loop Depth: 1
> +; SCOP-NEXT: Invariant Accesses: {
> +; SCOP-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
> +; SCOP-NEXT: [beginval] -> { Stmt_entry_split[] -> MemRef_begin[0] };
> +; SCOP-NEXT: Execution Context: [beginval] -> { : }
> +; SCOP-NEXT: }
> +
> +; Check that the kernel launch is generated in the host IR.
> +; This declaration would not have been generated unless a kernel launch exists.
> +; HOST-IR: declare void @polly_launchKernel(i8*, i32, i32, i32, i32, i32, i8*)
> +
> +;
> +; void f(int *begin, int *arr) {
> +; for (int i = *begin; i < 100; i++) {
> +; arr[i] = 0;
> +; }
> +; }
> +
> +target datalayout = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128"
> +
> +define void @f(i32* %begin, i32* %arr) {
> +entry:
> + br label %entry.split
> +
> +entry.split: ; preds = %entry
> + %beginval = load i32, i32* %begin, align 4
> + %cmp1 = icmp slt i32 %beginval, 100
> + br i1 %cmp1, label %for.body, label %for.end
> +
> +
> +
> +for.body: ; preds = %for.body.lr.ph, %for.body
> + %ival = phi i32 [ %beginval, %entry.split ], [ %inc, %for.body ]
> + %arrayidx = getelementptr inbounds i32, i32* %arr, i32 %ival
> + store i32 0, i32* %arrayidx, align 4
> + %inc = add nsw i32 %ival, 1
> + %cmp = icmp slt i32 %ival, 99
> + br i1 %cmp, label %for.body, label %for.cond.for.end_crit_edge
> +
> +for.cond.for.end_crit_edge: ; preds = %for.body
> + br label %for.end
> +
> +for.end: ; preds = %for.cond.for.end_crit_edge, %entry.split
> + ret void
> +}
>
> Modified: polly/trunk/test/GPGPU/invariant-load-hoisting.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/GPGPU/invariant-load-hoisting.ll?rev=307907&r1=307906&r2=307907&view=diff
> ==============================================================================
> --- polly/trunk/test/GPGPU/invariant-load-hoisting.ll (original)
> +++ polly/trunk/test/GPGPU/invariant-load-hoisting.ll Thu Jul 13 05:18:56 2017
> @@ -17,12 +17,12 @@
> ; SCOP-NEXT: [n, tmp12] -> { Stmt_for_body6[i0, i1, i2] -> MemRef_invariant[0] };
> ; SCOP-NEXT: Execution Context: [n, tmp12] -> { : n > 0 }
> ; SCOP-NEXT: }
> -;
> -; HOST-IR: call void @polly_launchKernel(i8* %215, i32 %221, i32 1, i32 32, i32 1, i32 1, i8* %polly_launch_0_params_i8ptr)
> -; HOST-IR-NEXT: call void @polly_freeKernel(i8* %215)
> -;
> -; KERNEL-IR: define ptx_kernel void @FUNC_f_SCOP_0_KERNEL_0(i8 addrspace(1)* %MemRef_B, i8 addrspace(1)* %MemRef_A, i32 %n, i32 %tmp12) #0 {
> -;
> +; HOST-IR: call void @polly_launchKernel(i8* %219, i32 %225, i32 1, i32 32, i32 1, i32 1, i8* %polly_launch_0_params_i8ptr)
> +; HOST-IR-NEXT: call void @polly_freeKernel(i8* %219)
> +
> +; KERNEL-IR: define ptx_kernel void @FUNC_f_SCOP_0_KERNEL_0(i8 addrspace(1)* %MemRef_B, i8 addrspace(1)* %MemRef_A, i32 %n, i32 %tmp12, i32 %polly.preload.tmp21.merge)
> +
> +
> ; Check that we generate correct GPU code in case of invariant load hoisting.
> ;
> ;
>
> Modified: polly/trunk/test/Isl/CodeGen/invariant_load_base_pointer.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Isl/CodeGen/invariant_load_base_pointer.ll?rev=307907&r1=307906&r2=307907&view=diff
> ==============================================================================
> --- polly/trunk/test/Isl/CodeGen/invariant_load_base_pointer.ll (original)
> +++ polly/trunk/test/Isl/CodeGen/invariant_load_base_pointer.ll Thu Jul 13 05:18:56 2017
> @@ -5,7 +5,7 @@
> ; CHECK-NEXT: %polly.access.BPLoc.load = load i32*, i32** %polly.access.BPLoc
> ;
> ; CHECK-LABEL: polly.stmt.bb2:
> -; CHECK-NEXT: %p_tmp3 = getelementptr inbounds i32, i32* %polly.access.BPLoc.load, i64 %polly.indvar
> +; CHECK-NEXT: %scevgep = getelementptr i32, i32* %polly.access.BPLoc.load, i64 %polly.indvar
> ;
> ; void f(int **BPLoc) {
> ; for (int i = 0; i < 1024; i++)
>
> Modified: polly/trunk/test/Isl/CodeGen/invariant_load_base_pointer_conditional.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Isl/CodeGen/invariant_load_base_pointer_conditional.ll?rev=307907&r1=307906&r2=307907&view=diff
> ==============================================================================
> --- polly/trunk/test/Isl/CodeGen/invariant_load_base_pointer_conditional.ll (original)
> +++ polly/trunk/test/Isl/CodeGen/invariant_load_base_pointer_conditional.ll Thu Jul 13 05:18:56 2017
> @@ -12,7 +12,7 @@
> ; CHECK-NEXT: %polly.preload.tmp6.merge = phi i32* [ %polly.access.BPLoc.load, %polly.preload.exec ], [ null, %polly.preload.cond ]
> ;
> ; CHECK-LABEL: polly.stmt.bb5:
> -; CHECK-NEXT: %p_tmp7 = getelementptr inbounds i32, i32* %polly.preload.tmp6.merge, i64 %polly.indvar6
> +; CHECK-NEXT: %scevgep9 = getelementptr i32, i32* %polly.preload.tmp6.merge, i64 %polly.indvar6
> ;
> ; void f(int **BPLoc, int *A, int N) {
> ; for (int i = 0; i < N; i++)
>
> Modified: polly/trunk/test/Isl/CodeGen/invariant_load_ptr_ptr_noalias.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Isl/CodeGen/invariant_load_ptr_ptr_noalias.ll?rev=307907&r1=307906&r2=307907&view=diff
> ==============================================================================
> --- polly/trunk/test/Isl/CodeGen/invariant_load_ptr_ptr_noalias.ll (original)
> +++ polly/trunk/test/Isl/CodeGen/invariant_load_ptr_ptr_noalias.ll Thu Jul 13 05:18:56 2017
> @@ -7,8 +7,8 @@
> ; CHECK: %polly.access.polly.access.A.load.load = load i32*, i32** %polly.access.polly.access.A.load
> ;
> ; CHECK: polly.stmt.bb2:
> -; CHECK: %p_tmp6 = getelementptr inbounds i32, i32* %polly.access.polly.access.A.load.load, i64 %polly.indvar
> -; CHECK: store i32 0, i32* %p_tmp6, align 4
> +; CHECK: %scevgep = getelementptr i32, i32* %polly.access.polly.access.A.load.load, i64 %polly.indvar
> +; CHECK: store i32 0, i32* %scevgep, align 4
> ;
> ; void f(int ***A) {
> ; for (int i = 0; i < 1024; i++)
>
> Modified: polly/trunk/test/Isl/CodeGen/invariant_load_scalar_escape_alloca_sharing.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Isl/CodeGen/invariant_load_scalar_escape_alloca_sharing.ll?rev=307907&r1=307906&r2=307907&view=diff
> ==============================================================================
> --- polly/trunk/test/Isl/CodeGen/invariant_load_scalar_escape_alloca_sharing.ll (original)
> +++ polly/trunk/test/Isl/CodeGen/invariant_load_scalar_escape_alloca_sharing.ll Thu Jul 13 05:18:56 2017
> @@ -5,19 +5,12 @@
> ; instead use directly the preloaded value stored in GlobalMap.
> ;
> ; CHECK-NOT: alloca
> -; CHECK: %dec3.s2a = alloca i32
> -; CHECK-NOT: alloca
> -; CHECK: %dec3.in.phiops = alloca i32
> -; CHECK-NOT: alloca
> ; CHECK: %tmp0.preload.s2a = alloca i32
> ; CHECK-NOT: alloca
> ;
> ; CHECK: %ncol.load = load i32, i32* @ncol
> ; CHECK-NEXT: store i32 %ncol.load, i32* %tmp0.preload.s2a
> ;
> -; CHECK: polly.stmt.while.body.lr.ph:
> -; CHECK-NEXT: store i32 %ncol.load, i32* %dec3.in.phiops
> -;
> target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
>
> @ncol = external global i32, align 4
>
> Modified: polly/trunk/test/ScopInfo/complex-successor-structure-3.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/complex-successor-structure-3.ll?rev=307907&r1=307906&r2=307907&view=diff
> ==============================================================================
> --- polly/trunk/test/ScopInfo/complex-successor-structure-3.ll (original)
> +++ polly/trunk/test/ScopInfo/complex-successor-structure-3.ll Thu Jul 13 05:18:56 2017
> @@ -13,7 +13,7 @@
> ; CHECK-NEXT: Domain :=
> ; CHECK-NEXT: [tmp5, tmp, tmp8, tmp11, tmp14, tmp17, tmp20, tmp23, tmp26] -> { Stmt_FINAL[] };
> ; CHECK-NEXT: Schedule :=
> -; CHECK-NEXT: [tmp5, tmp, tmp8, tmp11, tmp14, tmp17, tmp20, tmp23, tmp26] -> { Stmt_FINAL[] -> [22] };
> +; CHECK-NEXT: [tmp5, tmp, tmp8, tmp11, tmp14, tmp17, tmp20, tmp23, tmp26] -> { Stmt_FINAL[] -> [16] };
> ;
> ;
> ; void f(short *restrict In, int *restrict Out) {
>
> Modified: polly/trunk/test/ScopInfo/invariant-loads-leave-read-only-statements.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/invariant-loads-leave-read-only-statements.ll?rev=307907&r1=307906&r2=307907&view=diff
> ==============================================================================
> --- polly/trunk/test/ScopInfo/invariant-loads-leave-read-only-statements.ll (original)
> +++ polly/trunk/test/ScopInfo/invariant-loads-leave-read-only-statements.ll Thu Jul 13 05:18:56 2017
> @@ -2,28 +2,19 @@
> ; RUN: opt %loadPolly -polly-codegen -polly-invariant-load-hoisting=true -analyze < %s
>
> ; CHECK: Statements {
> -; CHECK-NEXT: Stmt_top_split
> -; CHECK-NEXT: Domain :=
> -; CHECK-NEXT: [tmp8, tmp22, tmp15] -> { Stmt_top_split[] };
> -; CHECK-NEXT: Schedule :=
> -; CHECK-NEXT: [tmp8, tmp22, tmp15] -> { Stmt_top_split[] -> [0, 0, 0, 0] };
> -; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
> -; CHECK-NEXT: [tmp8, tmp22, tmp15] -> { Stmt_top_split[] -> MemRef_tmp25[] };
> -; CHECK-NEXT: Stmt_L_4
> +; CHECK-NEXT: Stmt_L_4
> ; CHECK-NEXT: Domain :=
> ; CHECK-NEXT: [tmp8, tmp22, tmp15] -> { Stmt_L_4[i0, i1, i2] : 0 <= i0 < tmp8 and 0 <= i1 < tmp8 and 0 <= i2 < tmp8 };
> ; CHECK-NEXT: Schedule :=
> -; CHECK-NEXT: [tmp8, tmp22, tmp15] -> { Stmt_L_4[i0, i1, i2] -> [1, i0, i1, i2] };
> -; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
> +; CHECK-NEXT: [tmp8, tmp22, tmp15] -> { Stmt_L_4[i0, i1, i2] -> [i0, i1, i2] };
> +; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
> ; CHECK-NEXT: [tmp8, tmp22, tmp15] -> { Stmt_L_4[i0, i1, i2] -> MemRef_tmp19[i1, i0] };
> -; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
> +; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
> ; CHECK-NEXT: [tmp8, tmp22, tmp15] -> { Stmt_L_4[i0, i1, i2] -> MemRef_tmp5[i2, i0] };
> -; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
> +; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
> ; CHECK-NEXT: [tmp8, tmp22, tmp15] -> { Stmt_L_4[i0, i1, i2] -> MemRef_tmp12[i2, i1] };
> -; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
> +; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
> ; CHECK-NEXT: [tmp8, tmp22, tmp15] -> { Stmt_L_4[i0, i1, i2] -> MemRef_tmp19[i1, i0] };
> -; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
> -; CHECK-NEXT: [tmp8, tmp22, tmp15] -> { Stmt_L_4[i0, i1, i2] -> MemRef_tmp25[] };
> ; CHECK-NEXT: }
>
> target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list