[Polly][NewPM] Reenable ScopPassManager unittest
[polly-mirror.git] / test / ScopDetect / sequential_loops.ll
blob83629792a8243b1d9f33a7d0ccb5c081911b288f
1 ; RUN: opt %loadPolly -polly-detect -analyze < %s | FileCheck %s
3 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
5 ; Two sequential loops right after each other.
7 ; void f(long A[], long N) {
8 ;   long i;
9 ;   for (i = 0; i < N; ++i)
10 ;     A[i] = i;
11 ;   for (i = 0; i < N; ++i)
12 ;     A[i] = i;
13 ; }
15 define void @f1(i64* %A, i64 %N) nounwind {
16 ; CHECK-LABEL: 'Polly - Detect static control parts (SCoPs)' for function 'f1'
17 entry:
18   fence seq_cst
19   br label %for.i.1
21 for.i.1:
22   %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %for.i.1 ]
23   %scevgep = getelementptr i64, i64* %A, i64 %indvar
24   store i64 %indvar, i64* %scevgep
25   %indvar.next = add nsw i64 %indvar, 1
26   %exitcond = icmp eq i64 %indvar.next, %N
27   br i1 %exitcond, label %for.i.2, label %for.i.1
29 for.i.2:
30   %indvar.2 = phi i64 [ 0, %for.i.1 ], [ %indvar.next.2, %for.i.2 ]
31   %scevgep.2 = getelementptr i64, i64* %A, i64 %indvar.2
32   store i64 %indvar.2, i64* %scevgep.2
33   %indvar.next.2 = add nsw i64 %indvar.2, 1
34   %exitcond.2 = icmp eq i64 %indvar.next.2, %N
35   br i1 %exitcond.2, label %return, label %for.i.2
37 return:
38   fence seq_cst
39   ret void
42 ; C-H-E-C-K: Valid Region for Scop: for.i.1 => return
43 ; This one is currently not completely detected due to the PHI node in
44 ; for.i.2 causing a 'PHI node in exit BB' error for the first loop. This should
45 ; be fixed at some point. Such test cases do not really show up for us, as
46 ; the -loop-simplify pass always inserts a preheader as in the test case below.
48 ; Two sequential loops with a basic block in between.
50 ;     void f(long A[], long N) {
51 ;       long i;
53 ;       for (i = 0; i < N; ++i)
54 ;         A[i] = i;
55 ; preheader:
56 ;       ;
58 ;       for (i = 0; i < N; ++i)
59 ;         A[i] = i;
60 ;     }
62 define void @f2(i64* %A, i64 %N) nounwind {
63 ; CHECK-LABEL: 'Polly - Detect static control parts (SCoPs)' for function 'f2'
64 entry:
65   fence seq_cst
66   br label %for.i.1
68 for.i.1:
69   %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %for.i.1 ]
70   %scevgep = getelementptr i64, i64* %A, i64 %indvar
71   store i64 %indvar, i64* %scevgep
72   %indvar.next = add nsw i64 %indvar, 1
73   %exitcond = icmp eq i64 %indvar.next, %N
74   br i1 %exitcond, label %preheader, label %for.i.1
76 preheader:
77   br label %for.i.2
79 for.i.2:
80   %indvar.2 = phi i64 [ 0, %preheader ], [ %indvar.next.2, %for.i.2 ]
81   %scevgep.2 = getelementptr i64, i64* %A, i64 %indvar.2
82   store i64 %indvar.2, i64* %scevgep.2
83   %indvar.next.2 = add nsw i64 %indvar.2, 1
84   %exitcond.2 = icmp eq i64 %indvar.next.2, %N
85   br i1 %exitcond.2, label %return, label %for.i.2
87 return:
88   fence seq_cst
89   ret void
92 ; CHECK: Valid Region for Scop: for.i.1 => return