1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 03:33:20 +01:00
llvm-mirror/test/Analysis/LoopNestAnalysis/infinite.ll
Whitney Tsang 509d3200f9 [LoopNest]: Analysis to discover properties of a loop nest.
Summary: This patch adds an analysis pass to collect loop nests and
summarize properties of the nest (e.g the nest depth, whether the nest
is perfect, what's the innermost loop, etc...).

The motivation for this patch was discussed at the latest meeting of the
LLVM loop group (https://ibm.box.com/v/llvm-loop-nest-analysis) where we
discussed
the unimodular loop transformation framework ( “A Loop Transformation
Theory and an Algorithm to Maximize Parallelism”, Michael E. Wolf and
Monica S. Lam, IEEE TPDS, October 1991). The unimodular framework
provides a convenient way to unify legality checking and code generation
for several loop nest transformations (e.g. loop reversal, loop
interchange, loop skewing) and their compositions. Given that the
unimodular framework is applicable to perfect loop nests this is one
property of interest we expose in this analysis. Several other utility
functions are also provided. In the future other properties of interest
can be added in a centralized place.
Authored By: etiotto
Reviewer: Meinersbur, bmahjour, kbarton, Whitney, dmgreen, fhahn,
reames, hfinkel, jdoerfert, ppc-slack
Reviewed By: Meinersbur
Subscribers: bryanpkc, ppc-slack, mgorny, hiraditya, llvm-commits
Tag: LLVM
Differential Revision: https://reviews.llvm.org/D68789
2020-03-03 18:25:19 +00:00

36 lines
1.2 KiB
LLVM

; RUN: opt < %s -passes='print<loopnest>' -disable-output 2>&1 | FileCheck %s
; Test that the loop nest analysis is able to analyze an infinite loop in a loop nest.
define void @test1(i32** %A, i1 %cond) {
; CHECK-LABEL: IsPerfect=true, Depth=1, OutermostLoop: for.inner, Loops: ( for.inner )
; CHECK-LABEL: IsPerfect=false, Depth=2, OutermostLoop: for.outer, Loops: ( for.outer for.inner )
; CHECK-LABEL: IsPerfect=true, Depth=1, OutermostLoop: for.infinite, Loops: ( for.infinite )
entry:
br label %for.outer
for.outer:
%i = phi i64 [ 0, %entry ], [ %inc_i, %for.outer.latch ]
br i1 %cond, label %for.inner, label %for.infinite
for.inner:
%j = phi i64 [ 0, %for.outer ], [ %inc_j, %for.inner ]
%arrayidx_i = getelementptr inbounds i32*, i32** %A, i64 %i
%0 = load i32*, i32** %arrayidx_i, align 8
%arrayidx_j = getelementptr inbounds i32, i32* %0, i64 %j
store i32 0, i32* %arrayidx_j, align 4
%inc_j = add nsw i64 %j, 1
%cmp_j = icmp slt i64 %inc_j, 100
br i1 %cmp_j, label %for.inner, label %for.outer.latch
for.infinite:
br label %for.infinite
for.outer.latch:
%inc_i = add nsw i64 %i, 1
%cmp_i = icmp slt i64 %inc_i, 100
br i1 %cmp_i, label %for.outer, label %for.end
for.end:
ret void
}