1; RUN: opt %loadPolly %defaultOpts -polly-cloog -analyze %s | FileCheck %s 2; RUN: opt %loadPolly %defaultOpts -polly-codegen %s | lli 3; ModuleID = 'loop_with_condition_nested.s' 4target 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-n8:16:32:64" 5target triple = "x86_64-pc-linux-gnu" 6 7@A = common global [1024 x i32] zeroinitializer, align 16 ; <[1024 x i32]*> [#uses=4] 8@B = common global [1024 x i32] zeroinitializer, align 16 ; <[1024 x i32]*> [#uses=4] 9 10define void @loop_with_condition() nounwind { 11; <label>:0 12 fence seq_cst 13 br label %1 14 15; <label>:1 ; preds = %10, %0 16 %indvar = phi i64 [ %indvar.next, %10 ], [ 0, %0 ] ; <i64> [#uses=5] 17 %scevgep = getelementptr [1024 x i32]* @A, i64 0, i64 %indvar ; <i32*> [#uses=2] 18 %scevgep1 = getelementptr [1024 x i32]* @B, i64 0, i64 %indvar ; <i32*> [#uses=1] 19 %i.0 = trunc i64 %indvar to i32 ; <i32> [#uses=2] 20 %exitcond = icmp ne i64 %indvar, 1024 ; <i1> [#uses=1] 21 br i1 %exitcond, label %2, label %11 22 23; <label>:2 ; preds = %1 24 %3 = icmp sle i32 %i.0, 512 ; <i1> [#uses=1] 25 br i1 %3, label %4, label %9 26 27; <label>:4 ; preds = %2 28 %5 = icmp sgt i32 %i.0, 20 ; <i1> [#uses=1] 29 br i1 %5, label %6, label %7 30 31; <label>:6 ; preds = %4 32 store i32 1, i32* %scevgep 33 br label %8 34 35; <label>:7 ; preds = %4 36 store i32 2, i32* %scevgep 37 br label %8 38 39; <label>:8 ; preds = %7, %6 40 br label %9 41 42; <label>:9 ; preds = %8, %2 43 store i32 3, i32* %scevgep1 44 br label %10 45 46; <label>:10 ; preds = %9 47 %indvar.next = add i64 %indvar, 1 ; <i64> [#uses=1] 48 br label %1 49 50; <label>:11 ; preds = %1 51 fence seq_cst 52 ret void 53} 54 55define i32 @main() nounwind { 56; <label>:0 57 call void @llvm.memset.p0i8.i64(i8* bitcast ([1024 x i32]* @A to i8*), i8 0, i64 4096, i32 1, i1 false) 58 call void @llvm.memset.p0i8.i64(i8* bitcast ([1024 x i32]* @B to i8*), i8 0, i64 4096, i32 1, i1 false) 59 call void @loop_with_condition() 60 br label %1 61 62; <label>:1 ; preds = %8, %0 63 %indvar1 = phi i64 [ %indvar.next2, %8 ], [ 0, %0 ] ; <i64> [#uses=3] 64 %scevgep3 = getelementptr [1024 x i32]* @B, i64 0, i64 %indvar1 ; <i32*> [#uses=1] 65 %i.0 = trunc i64 %indvar1 to i32 ; <i32> [#uses=1] 66 %2 = icmp slt i32 %i.0, 1024 ; <i1> [#uses=1] 67 br i1 %2, label %3, label %9 68 69; <label>:3 ; preds = %1 70 %4 = load i32* %scevgep3 ; <i32> [#uses=1] 71 %5 = icmp ne i32 %4, 3 ; <i1> [#uses=1] 72 br i1 %5, label %6, label %7 73 74; <label>:6 ; preds = %3 75 br label %39 76 77; <label>:7 ; preds = %3 78 br label %8 79 80; <label>:8 ; preds = %7 81 %indvar.next2 = add i64 %indvar1, 1 ; <i64> [#uses=1] 82 br label %1 83 84; <label>:9 ; preds = %1 85 br label %10 86 87; <label>:10 ; preds = %37, %9 88 %indvar = phi i64 [ %indvar.next, %37 ], [ 0, %9 ] ; <i64> [#uses=3] 89 %scevgep = getelementptr [1024 x i32]* @A, i64 0, i64 %indvar ; <i32*> [#uses=3] 90 %i.1 = trunc i64 %indvar to i32 ; <i32> [#uses=6] 91 %11 = icmp slt i32 %i.1, 1024 ; <i1> [#uses=1] 92 br i1 %11, label %12, label %38 93 94; <label>:12 ; preds = %10 95 %13 = icmp sle i32 %i.1, 512 ; <i1> [#uses=1] 96 br i1 %13, label %14, label %20 97 98; <label>:14 ; preds = %12 99 %15 = icmp sgt i32 %i.1, 20 ; <i1> [#uses=1] 100 br i1 %15, label %16, label %20 101 102; <label>:16 ; preds = %14 103 %17 = load i32* %scevgep ; <i32> [#uses=1] 104 %18 = icmp ne i32 %17, 1 ; <i1> [#uses=1] 105 br i1 %18, label %19, label %20 106 107; <label>:19 ; preds = %16 108 br label %39 109 110; <label>:20 ; preds = %16, %14, %12 111 %21 = icmp sgt i32 %i.1, 512 ; <i1> [#uses=1] 112 br i1 %21, label %22, label %35 113 114; <label>:22 ; preds = %20 115 %23 = icmp sle i32 %i.1, 20 ; <i1> [#uses=1] 116 br i1 %23, label %24, label %28 117 118; <label>:24 ; preds = %22 119 %25 = load i32* %scevgep ; <i32> [#uses=1] 120 %26 = icmp ne i32 %25, 2 ; <i1> [#uses=1] 121 br i1 %26, label %27, label %28 122 123; <label>:27 ; preds = %24 124 br label %39 125 126; <label>:28 ; preds = %24, %22 127 %29 = icmp sgt i32 %i.1, 20 ; <i1> [#uses=1] 128 br i1 %29, label %30, label %34 129 130; <label>:30 ; preds = %28 131 %31 = load i32* %scevgep ; <i32> [#uses=1] 132 %32 = icmp ne i32 %31, 0 ; <i1> [#uses=1] 133 br i1 %32, label %33, label %34 134 135; <label>:33 ; preds = %30 136 br label %39 137 138; <label>:34 ; preds = %30, %28 139 br label %35 140 141; <label>:35 ; preds = %34, %20 142 br label %36 143 144; <label>:36 ; preds = %35 145 br label %37 146 147; <label>:37 ; preds = %36 148 %indvar.next = add i64 %indvar, 1 ; <i64> [#uses=1] 149 br label %10 150 151; <label>:38 ; preds = %10 152 br label %39 153 154; <label>:39 ; preds = %38, %33, %27, %19, %6 155 %.0 = phi i32 [ 1, %6 ], [ 1, %19 ], [ 1, %27 ], [ 1, %33 ], [ 0, %38 ] ; <i32> [#uses=1] 156 ret i32 %.0 157} 158 159declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind 160 161; CHECK: for (c2=0;c2<=20;c2++) { 162; CHECK: Stmt_7(c2); 163; CHECK: Stmt_9(c2); 164; CHECK: } 165; CHECK: for (c2=21;c2<=512;c2++) { 166; CHECK: Stmt_6(c2); 167; CHECK: Stmt_9(c2); 168; CHECK: } 169; CHECK: for (c2=513;c2<=1023;c2++) { 170; CHECK: Stmt_9(c2); 171; CHECK: } 172 173