93 lines · plain
1; RUN: opt %loadNPMPolly '-passes=polly-custom<detect>' -polly-print-detect -disable-output < %s 2>&1 | FileCheck %s2 3target 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"4 5; Two sequential loops right after each other.6;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; }14 15define void @f1(ptr %A, i64 %N) nounwind {16; CHECK-LABEL: Detected Scops in Function f1 17entry:18 fence seq_cst19 br label %for.i.120 21for.i.1:22 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %for.i.1 ]23 %scevgep = getelementptr i64, ptr %A, i64 %indvar24 store i64 %indvar, ptr %scevgep25 %indvar.next = add nsw i64 %indvar, 126 %exitcond = icmp eq i64 %indvar.next, %N27 br i1 %exitcond, label %for.i.2, label %for.i.128 29for.i.2:30 %indvar.2 = phi i64 [ 0, %for.i.1 ], [ %indvar.next.2, %for.i.2 ]31 %scevgep.2 = getelementptr i64, ptr %A, i64 %indvar.232 store i64 %indvar.2, ptr %scevgep.233 %indvar.next.2 = add nsw i64 %indvar.2, 134 %exitcond.2 = icmp eq i64 %indvar.next.2, %N35 br i1 %exitcond.2, label %return, label %for.i.236 37return:38 fence seq_cst39 ret void40}41 42; C-H-E-C-K: Valid Region for Scop: for.i.1 => return43; This one is currently not completely detected due to the PHI node in44; for.i.2 causing a 'PHI node in exit BB' error for the first loop. This should45; be fixed at some point. Such test cases do not really show up for us, as46; the -loop-simplify pass always inserts a preheader as in the test case below.47 48; Two sequential loops with a basic block in between.49;50; void f(long A[], long N) {51; long i;52;53; for (i = 0; i < N; ++i)54; A[i] = i;55; preheader:56; ;57;58; for (i = 0; i < N; ++i)59; A[i] = i;60; }61 62define void @f2(ptr %A, i64 %N) nounwind {63; CHECK-LABEL: Detected Scops in Function f264entry:65 fence seq_cst66 br label %for.i.167 68for.i.1:69 %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %for.i.1 ]70 %scevgep = getelementptr i64, ptr %A, i64 %indvar71 store i64 %indvar, ptr %scevgep72 %indvar.next = add nsw i64 %indvar, 173 %exitcond = icmp eq i64 %indvar.next, %N74 br i1 %exitcond, label %preheader, label %for.i.175 76preheader:77 br label %for.i.278 79for.i.2:80 %indvar.2 = phi i64 [ 0, %preheader ], [ %indvar.next.2, %for.i.2 ]81 %scevgep.2 = getelementptr i64, ptr %A, i64 %indvar.282 store i64 %indvar.2, ptr %scevgep.283 %indvar.next.2 = add nsw i64 %indvar.2, 184 %exitcond.2 = icmp eq i64 %indvar.next.2, %N85 br i1 %exitcond.2, label %return, label %for.i.286 87return:88 fence seq_cst89 ret void90}91 92; CHECK: Valid Region for Scop: for.i.1 => return93