[polly] r236395 - [FIX] Invalid recognition of multidimensional access
Johannes Doerfert
doerfert at cs.uni-saarland.de
Sun May 3 09:03:04 PDT 2015
Author: jdoerfert
Date: Sun May 3 11:03:01 2015
New Revision: 236395
URL: http://llvm.org/viewvc/llvm-project?rev=236395&view=rev
Log:
[FIX] Invalid recognition of multidimensional access
In the lnt benchmark MultiSource/Benchmarks/MallocBench/gs/gs with
scalar and PHI modeling we detected the multidimensional accesses
with sizes variant in the SCoP. This will check the sizes for validity.
Added:
polly/trunk/test/ScopDetect/multidim_indirect_access.ll
Modified:
polly/trunk/lib/Analysis/ScopDetection.cpp
polly/trunk/lib/Support/SCEVValidator.cpp
Modified: polly/trunk/lib/Analysis/ScopDetection.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopDetection.cpp?rev=236395&r1=236394&r2=236395&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopDetection.cpp (original)
+++ polly/trunk/lib/Analysis/ScopDetection.cpp Sun May 3 11:03:01 2015
@@ -488,6 +488,13 @@ bool ScopDetection::hasAffineMemoryAcces
SE->findArrayDimensions(Terms, Shape->DelinearizedSizes,
Context.ElementSize[BasePointer]);
+ if (!AllowNonAffine)
+ for (const SCEV *DelinearizedSize : Shape->DelinearizedSizes)
+ if (hasScalarDepsInsideRegion(DelinearizedSize, &CurRegion))
+ invalid<ReportNonAffineAccess>(
+ Context, /*Assert=*/true, DelinearizedSize,
+ Context.Accesses[BasePointer].front().first, BaseValue);
+
// No array shape derived.
if (Shape->DelinearizedSizes.empty()) {
if (AllowNonAffine)
Modified: polly/trunk/lib/Support/SCEVValidator.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Support/SCEVValidator.cpp?rev=236395&r1=236394&r2=236395&view=diff
==============================================================================
--- polly/trunk/lib/Support/SCEVValidator.cpp (original)
+++ polly/trunk/lib/Support/SCEVValidator.cpp Sun May 3 11:03:01 2015
@@ -559,6 +559,7 @@ std::vector<const SCEV *> getParamsInAff
SCEVValidator Validator(R, SE, BaseAddress);
ValidatorResult Result = Validator.visit(Expr);
+ assert(Result.isValid() && "Requested parameters for an invalid SCEV!");
return Result.getParameters();
}
Added: polly/trunk/test/ScopDetect/multidim_indirect_access.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopDetect/multidim_indirect_access.ll?rev=236395&view=auto
==============================================================================
--- polly/trunk/test/ScopDetect/multidim_indirect_access.ll (added)
+++ polly/trunk/test/ScopDetect/multidim_indirect_access.ll Sun May 3 11:03:01 2015
@@ -0,0 +1,58 @@
+; RUN: opt %loadPolly -polly-detect-unprofitable -polly-detect -analyze < %s | FileCheck %s --check-prefix=INDEPENDENT
+; RUN: opt %loadPolly -polly-detect-unprofitable -polly-detect -analyze -polly-model-phi-nodes -disable-polly-intra-scop-scalar-to-array < %s | FileCheck %s --check-prefix=NON_INDEPENDENT
+;
+; With the IndependentBlocks and PollyPrepare passes this will __correctly__
+; not be recognized as a SCoP and the debug states:
+;
+; SCEV of PHI node refers to SSA names in region
+;
+; Without IndependentBlocks and PollyPrepare the access A[x] is mistakenly
+; treated as a multidimensional access with dimension size x. This test will
+; check that we correctly invalidate the region and do not detect a outer SCoP.
+;
+; FIXME:
+; We should detect the inner region but the PHI node in the exit blocks that.
+;
+; void f(int *A, long N) {
+; int j = 0;
+; while (N > j) {
+; int x = A[0];
+; int i = 1;
+; do {
+; A[x] = 42;
+; A += x;
+; } while (i++ < N);
+; }
+; }
+;
+; INDEPENDENT-NOT: Valid
+; NON_INDEPENDENT-NOT: Valid
+;
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+define void @f(i32* %A, i64 %N) {
+bb:
+ br label %bb0
+
+bb0:
+ %j = phi i64 [ %j.next, %bb1 ], [ 1, %bb ]
+ %tmp = load i32, i32* %A, align 4
+ %exitcond0 = icmp sgt i64 %N, %j
+ %j.next = add nuw nsw i64 %j, 1
+ br i1 %exitcond0, label %bb1, label %bb13
+
+bb1: ; preds = %bb7, %bb0
+ %i = phi i64 [ %i.next, %bb1 ], [ 1, %bb0 ]
+ %.0 = phi i32* [ %A, %bb0 ], [ %tmp12, %bb1 ]
+ %tmp8 = sext i32 %tmp to i64
+ %tmp9 = getelementptr inbounds i32, i32* %.0, i64 %tmp8
+ store i32 42, i32* %tmp9, align 4
+ %tmp11 = sext i32 %tmp to i64
+ %tmp12 = getelementptr inbounds i32, i32* %.0, i64 %tmp11
+ %i.next = add nuw nsw i64 %i, 1
+ %exitcond = icmp ne i64 %i, %N
+ br i1 %exitcond, label %bb1, label %bb0
+
+bb13: ; preds = %bb1
+ ret void
+}
More information about the llvm-commits
mailing list