[polly] r246433 - ScopDetection: Correctly count the loops in a region

Johannes Doerfert via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 31 13:10:07 PDT 2015


On 08/31, Tobias Grosser via llvm-commits wrote:
> Author: grosser
> Date: Mon Aug 31 07:08:11 2015
> New Revision: 246433
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=246433&view=rev
> Log:
> ScopDetection: Correctly count the loops in a region
> 
> There is no reason the loops in a region need to touch either entry or exit
> block. Hence, we need to look through all loops that may touch the region as
> well as their children to understand if our region has at least two loops.
> 
> Added:
>     polly/trunk/test/ScopDetect/more-than-one-loop.ll
> Modified:
>     polly/trunk/lib/Analysis/ScopDetection.cpp
> 
> Modified: polly/trunk/lib/Analysis/ScopDetection.cpp
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopDetection.cpp?rev=246433&r1=246432&r2=246433&view=diff
> ==============================================================================
> --- polly/trunk/lib/Analysis/ScopDetection.cpp (original)
> +++ polly/trunk/lib/Analysis/ScopDetection.cpp Mon Aug 31 07:08:11 2015
> @@ -779,19 +779,24 @@ bool ScopDetection::isValidLoop(Loop *L,
>  }
>  
>  bool ScopDetection::hasMoreThanOneLoop(Region *R) const {
> -  Loop *EntryLoop = LI->getLoopFor(R->getEntry());
> -  if (!EntryLoop)
> -    return false;
> -
> -  if (!EntryLoop->getSubLoops().empty())
> -    return true;
> -
> -  for (pred_iterator PI = pred_begin(R->getExit()), PE = pred_end(R->getExit());
> -       PI != PE; ++PI)
> -    if (R->contains(*PI))
> -      if (EntryLoop != LI->getLoopFor(*PI))
> -        return true;
> +  auto LoopNum = 0;
> +
> +  auto L = LI->getLoopFor(R->getEntry());
> +  L = L ? R->outermostLoopInRegion(L) : nullptr;
> +  L = L ? L->getParentLoop() : nullptr;
> +
> +  auto SubLoops =
> +      L ? L->getSubLoopsVector() : std::vector<Loop *>(LI->begin(), LI->end());
>  
> +  for (auto &SubLoop : SubLoops)
> +    if (R->contains(SubLoop)) {
> +      LoopNum++;
> +      if (SubLoop > 0)
SubLoop : Loop *

-      if (SubLoop > 0)
+      if (SubLoop->getSubLoops().size())

See also:
  llvm/tools/polly/lib/Analysis/ScopDetection.cpp:794:21: warning:
  ordered comparison of pointer with integer zero [-Wextra]
    if (SubLoop > 0)

> +        LoopNum++;
> +
> +      if (LoopNum >= 2)
> +        return true;
> +    }
>    return false;
>  }
>  
> 
> Added: polly/trunk/test/ScopDetect/more-than-one-loop.ll
> URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopDetect/more-than-one-loop.ll?rev=246433&view=auto
> ==============================================================================
> --- polly/trunk/test/ScopDetect/more-than-one-loop.ll (added)
> +++ polly/trunk/test/ScopDetect/more-than-one-loop.ll Mon Aug 31 07:08:11 2015
> @@ -0,0 +1,75 @@
> +; RUN: opt %loadPolly -polly-detect-unprofitable=false \
> +; RUN: -polly-code-generator=isl \
> +; RUN: -polly-detect -analyze < %s | FileCheck %s
> +
> +; RUN: opt %loadPolly -polly-detect-unprofitable=true \
> +; RUN: -polly-code-generator=isl \
> +; RUN: -polly-detect -analyze < %s | FileCheck %s
> +
> +; CHECK: Valid Region for Scop:
> +
> +;    void foo(float *A, float *B, long N) {
> +;      if (N > 100)
> +;        for (long i = 0; i < 100; i++)
> +;          A[i] += i;
> +;      else
> +;        for (long i = 0; i < 100; i++)
> +;          B[i] += i;
> +;    }
> +;
> +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
> +
> +define void @foo(float* %A, float* %B, i64 %N) {
> +bb:
> +  %tmp = icmp sgt i64 %N, 100
> +  br i1 %tmp, label %bb2, label %bb12
> +
> +bb2:                                              ; preds = %bb
> +  br label %bb3
> +
> +bb3:                                              ; preds = %bb9, %bb2
> +  %i.0 = phi i64 [ 0, %bb2 ], [ %tmp10, %bb9 ]
> +  %exitcond = icmp ne i64 %i.0, 100
> +  br i1 %exitcond, label %bb4, label %bb11
> +
> +bb4:                                              ; preds = %bb3
> +  %tmp5 = sitofp i64 %i.0 to float
> +  %tmp6 = getelementptr inbounds float, float* %A, i64 %i.0
> +  %tmp7 = load float, float* %tmp6, align 4
> +  %tmp8 = fadd float %tmp7, %tmp5
> +  store float %tmp8, float* %tmp6, align 4
> +  br label %bb9
> +
> +bb9:                                              ; preds = %bb4
> +  %tmp10 = add nsw i64 %i.0, 1
> +  br label %bb3
> +
> +bb11:                                             ; preds = %bb3
> +  br label %bb22
> +
> +bb12:                                             ; preds = %bb
> +  br label %bb13
> +
> +bb13:                                             ; preds = %bb19, %bb12
> +  %i1.0 = phi i64 [ 0, %bb12 ], [ %tmp20, %bb19 ]
> +  %exitcond1 = icmp ne i64 %i1.0, 100
> +  br i1 %exitcond1, label %bb14, label %bb21
> +
> +bb14:                                             ; preds = %bb13
> +  %tmp15 = sitofp i64 %i1.0 to float
> +  %tmp16 = getelementptr inbounds float, float* %B, i64 %i1.0
> +  %tmp17 = load float, float* %tmp16, align 4
> +  %tmp18 = fadd float %tmp17, %tmp15
> +  store float %tmp18, float* %tmp16, align 4
> +  br label %bb19
> +
> +bb19:                                             ; preds = %bb14
> +  %tmp20 = add nsw i64 %i1.0, 1
> +  br label %bb13
> +
> +bb21:                                             ; preds = %bb13
> +  br label %bb22
> +
> +bb22:                                             ; preds = %bb21, %bb11
> +  ret void
> +}
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits

-- 

Johannes Doerfert
Researcher / PhD Student

Compiler Design Lab (Prof. Hack)
Saarland University, Computer Science
Building E1.3, Room 4.31

Tel. +49 (0)681 302-57521 : doerfert at cs.uni-saarland.de
Fax. +49 (0)681 302-3065  : http://www.cdl.uni-saarland.de/people/doerfert
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 213 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150831/eed53cc9/attachment.sig>


More information about the llvm-commits mailing list