[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