1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -loop-unroll -pragma-unroll-threshold=1024 -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -loop-unroll -loop-unroll -pragma-unroll-threshold=1024 -S | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker; 4*9880d681SAndroid Build Coastguard Worker; Run loop unrolling twice to verify that loop unrolling metadata is properly 5*9880d681SAndroid Build Coastguard Worker; removed and further unrolling is disabled after the pass is run once. 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 8*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-unknown-linux-gnu" 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker; loop4 contains a small loop which should be completely unrolled by 11*9880d681SAndroid Build Coastguard Worker; the default unrolling heuristics. It serves as a control for the 12*9880d681SAndroid Build Coastguard Worker; unroll(disable) pragma test loop4_with_disable. 13*9880d681SAndroid Build Coastguard Worker; 14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @loop4( 15*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: br i1 16*9880d681SAndroid Build Coastguard Workerdefine void @loop4(i32* nocapture %a) { 17*9880d681SAndroid Build Coastguard Workerentry: 18*9880d681SAndroid Build Coastguard Worker br label %for.body 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body, %entry 21*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 22*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 23*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 24*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %0, 1 25*9880d681SAndroid Build Coastguard Worker store i32 %inc, i32* %arrayidx, align 4 26*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 27*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %indvars.iv.next, 4 28*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 31*9880d681SAndroid Build Coastguard Worker ret void 32*9880d681SAndroid Build Coastguard Worker} 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; #pragma clang loop unroll(disable) 35*9880d681SAndroid Build Coastguard Worker; 36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @loop4_with_disable( 37*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 38*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store i32 39*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 40*9880d681SAndroid Build Coastguard Workerdefine void @loop4_with_disable(i32* nocapture %a) { 41*9880d681SAndroid Build Coastguard Workerentry: 42*9880d681SAndroid Build Coastguard Worker br label %for.body 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body, %entry 45*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 46*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 47*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 48*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %0, 1 49*9880d681SAndroid Build Coastguard Worker store i32 %inc, i32* %arrayidx, align 4 50*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 51*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %indvars.iv.next, 4 52*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !1 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 55*9880d681SAndroid Build Coastguard Worker ret void 56*9880d681SAndroid Build Coastguard Worker} 57*9880d681SAndroid Build Coastguard Worker!1 = !{!1, !2} 58*9880d681SAndroid Build Coastguard Worker!2 = !{!"llvm.loop.unroll.disable"} 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker; loop64 has a high enough count that it should *not* be unrolled by 61*9880d681SAndroid Build Coastguard Worker; the default unrolling heuristic. It serves as the control for the 62*9880d681SAndroid Build Coastguard Worker; unroll(full) pragma test loop64_with_.* tests below. 63*9880d681SAndroid Build Coastguard Worker; 64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @loop64( 65*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 66*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store i32 67*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 68*9880d681SAndroid Build Coastguard Workerdefine void @loop64(i32* nocapture %a) { 69*9880d681SAndroid Build Coastguard Workerentry: 70*9880d681SAndroid Build Coastguard Worker br label %for.body 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body, %entry 73*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 74*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 75*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 76*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %0, 1 77*9880d681SAndroid Build Coastguard Worker store i32 %inc, i32* %arrayidx, align 4 78*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 79*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %indvars.iv.next, 64 80*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 83*9880d681SAndroid Build Coastguard Worker ret void 84*9880d681SAndroid Build Coastguard Worker} 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker; #pragma clang loop unroll(full) 87*9880d681SAndroid Build Coastguard Worker; Loop should be fully unrolled. 88*9880d681SAndroid Build Coastguard Worker; 89*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @loop64_with_full( 90*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: br i1 91*9880d681SAndroid Build Coastguard Workerdefine void @loop64_with_full(i32* nocapture %a) { 92*9880d681SAndroid Build Coastguard Workerentry: 93*9880d681SAndroid Build Coastguard Worker br label %for.body 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body, %entry 96*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 97*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 98*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 99*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %0, 1 100*9880d681SAndroid Build Coastguard Worker store i32 %inc, i32* %arrayidx, align 4 101*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 102*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %indvars.iv.next, 64 103*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !3 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 106*9880d681SAndroid Build Coastguard Worker ret void 107*9880d681SAndroid Build Coastguard Worker} 108*9880d681SAndroid Build Coastguard Worker!3 = !{!3, !4} 109*9880d681SAndroid Build Coastguard Worker!4 = !{!"llvm.loop.unroll.full"} 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker; #pragma clang loop unroll(full) 112*9880d681SAndroid Build Coastguard Worker; Loop should be fully unrolled, even for optsize. 113*9880d681SAndroid Build Coastguard Worker; 114*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @loop64_with_full_optsize( 115*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: br i1 116*9880d681SAndroid Build Coastguard Workerdefine void @loop64_with_full_optsize(i32* nocapture %a) optsize { 117*9880d681SAndroid Build Coastguard Workerentry: 118*9880d681SAndroid Build Coastguard Worker br label %for.body 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body, %entry 121*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 122*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 123*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 124*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %0, 1 125*9880d681SAndroid Build Coastguard Worker store i32 %inc, i32* %arrayidx, align 4 126*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 127*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %indvars.iv.next, 64 128*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !3 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 131*9880d681SAndroid Build Coastguard Worker ret void 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker; #pragma clang loop unroll_count(4) 135*9880d681SAndroid Build Coastguard Worker; Loop should be unrolled 4 times. 136*9880d681SAndroid Build Coastguard Worker; 137*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @loop64_with_count4( 138*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 139*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 140*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 141*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 142*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store i32 143*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 144*9880d681SAndroid Build Coastguard Workerdefine void @loop64_with_count4(i32* nocapture %a) { 145*9880d681SAndroid Build Coastguard Workerentry: 146*9880d681SAndroid Build Coastguard Worker br label %for.body 147*9880d681SAndroid Build Coastguard Worker 148*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body, %entry 149*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 150*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 151*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 152*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %0, 1 153*9880d681SAndroid Build Coastguard Worker store i32 %inc, i32* %arrayidx, align 4 154*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 155*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %indvars.iv.next, 64 156*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !5 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 159*9880d681SAndroid Build Coastguard Worker ret void 160*9880d681SAndroid Build Coastguard Worker} 161*9880d681SAndroid Build Coastguard Worker!5 = !{!5, !6} 162*9880d681SAndroid Build Coastguard Worker!6 = !{!"llvm.loop.unroll.count", i32 4} 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Worker; #pragma clang loop unroll(full) 165*9880d681SAndroid Build Coastguard Worker; Full unrolling is requested, but loop has a runtime trip count so 166*9880d681SAndroid Build Coastguard Worker; no unrolling should occur. 167*9880d681SAndroid Build Coastguard Worker; 168*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @runtime_loop_with_full( 169*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 170*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store i32 171*9880d681SAndroid Build Coastguard Workerdefine void @runtime_loop_with_full(i32* nocapture %a, i32 %b) { 172*9880d681SAndroid Build Coastguard Workerentry: 173*9880d681SAndroid Build Coastguard Worker %cmp3 = icmp sgt i32 %b, 0 174*9880d681SAndroid Build Coastguard Worker br i1 %cmp3, label %for.body, label %for.end, !llvm.loop !8 175*9880d681SAndroid Build Coastguard Worker 176*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.body 177*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 178*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 179*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 180*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %0, 1 181*9880d681SAndroid Build Coastguard Worker store i32 %inc, i32* %arrayidx, align 4 182*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 183*9880d681SAndroid Build Coastguard Worker %lftr.wideiv = trunc i64 %indvars.iv.next to i32 184*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %lftr.wideiv, %b 185*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !8 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body, %entry 188*9880d681SAndroid Build Coastguard Worker ret void 189*9880d681SAndroid Build Coastguard Worker} 190*9880d681SAndroid Build Coastguard Worker!8 = !{!8, !4} 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Worker; #pragma clang loop unroll_count(4) 193*9880d681SAndroid Build Coastguard Worker; Loop has a runtime trip count. Runtime unrolling should occur and loop 194*9880d681SAndroid Build Coastguard Worker; should be duplicated (original and 4x unrolled). 195*9880d681SAndroid Build Coastguard Worker; 196*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @runtime_loop_with_count4( 197*9880d681SAndroid Build Coastguard Worker; CHECK: for.body 198*9880d681SAndroid Build Coastguard Worker; CHECK: store 199*9880d681SAndroid Build Coastguard Worker; CHECK: store 200*9880d681SAndroid Build Coastguard Worker; CHECK: store 201*9880d681SAndroid Build Coastguard Worker; CHECK: store 202*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store 203*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 204*9880d681SAndroid Build Coastguard Worker; CHECK: for.body.epil: 205*9880d681SAndroid Build Coastguard Worker; CHECK: store 206*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store 207*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 208*9880d681SAndroid Build Coastguard Workerdefine void @runtime_loop_with_count4(i32* nocapture %a, i32 %b) { 209*9880d681SAndroid Build Coastguard Workerentry: 210*9880d681SAndroid Build Coastguard Worker %cmp3 = icmp sgt i32 %b, 0 211*9880d681SAndroid Build Coastguard Worker br i1 %cmp3, label %for.body, label %for.end, !llvm.loop !9 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.body 214*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 215*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 216*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 217*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %0, 1 218*9880d681SAndroid Build Coastguard Worker store i32 %inc, i32* %arrayidx, align 4 219*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 220*9880d681SAndroid Build Coastguard Worker %lftr.wideiv = trunc i64 %indvars.iv.next to i32 221*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %lftr.wideiv, %b 222*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !9 223*9880d681SAndroid Build Coastguard Worker 224*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body, %entry 225*9880d681SAndroid Build Coastguard Worker ret void 226*9880d681SAndroid Build Coastguard Worker} 227*9880d681SAndroid Build Coastguard Worker!9 = !{!9, !6} 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Worker; #pragma clang loop unroll_count(1) 230*9880d681SAndroid Build Coastguard Worker; Loop should not be unrolled 231*9880d681SAndroid Build Coastguard Worker; 232*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @unroll_1( 233*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 234*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store i32 235*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 236*9880d681SAndroid Build Coastguard Workerdefine void @unroll_1(i32* nocapture %a, i32 %b) { 237*9880d681SAndroid Build Coastguard Workerentry: 238*9880d681SAndroid Build Coastguard Worker br label %for.body 239*9880d681SAndroid Build Coastguard Worker 240*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body, %entry 241*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 242*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 243*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 244*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %0, 1 245*9880d681SAndroid Build Coastguard Worker store i32 %inc, i32* %arrayidx, align 4 246*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 247*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %indvars.iv.next, 4 248*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !10 249*9880d681SAndroid Build Coastguard Worker 250*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 251*9880d681SAndroid Build Coastguard Worker ret void 252*9880d681SAndroid Build Coastguard Worker} 253*9880d681SAndroid Build Coastguard Worker!10 = !{!10, !11} 254*9880d681SAndroid Build Coastguard Worker!11 = !{!"llvm.loop.unroll.count", i32 1} 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Worker; #pragma clang loop unroll(full) 257*9880d681SAndroid Build Coastguard Worker; Loop has very high loop count (1 million) and full unrolling was requested. 258*9880d681SAndroid Build Coastguard Worker; Loop should unrolled up to the pragma threshold, but not completely. 259*9880d681SAndroid Build Coastguard Worker; 260*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @unroll_1M( 261*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 262*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 263*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 264*9880d681SAndroid Build Coastguard Workerdefine void @unroll_1M(i32* nocapture %a, i32 %b) { 265*9880d681SAndroid Build Coastguard Workerentry: 266*9880d681SAndroid Build Coastguard Worker br label %for.body 267*9880d681SAndroid Build Coastguard Worker 268*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body, %entry 269*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 270*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 271*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 272*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %0, 1 273*9880d681SAndroid Build Coastguard Worker store i32 %inc, i32* %arrayidx, align 4 274*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 275*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %indvars.iv.next, 1000000 276*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !12 277*9880d681SAndroid Build Coastguard Worker 278*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 279*9880d681SAndroid Build Coastguard Worker ret void 280*9880d681SAndroid Build Coastguard Worker} 281*9880d681SAndroid Build Coastguard Worker!12 = !{!12, !4} 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Worker; #pragma clang loop unroll(enable) 284*9880d681SAndroid Build Coastguard Worker; Loop should be fully unrolled. 285*9880d681SAndroid Build Coastguard Worker; 286*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @loop64_with_enable( 287*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: br i1 288*9880d681SAndroid Build Coastguard Workerdefine void @loop64_with_enable(i32* nocapture %a) { 289*9880d681SAndroid Build Coastguard Workerentry: 290*9880d681SAndroid Build Coastguard Worker br label %for.body 291*9880d681SAndroid Build Coastguard Worker 292*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %for.body, %entry 293*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 294*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 295*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 296*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %0, 1 297*9880d681SAndroid Build Coastguard Worker store i32 %inc, i32* %arrayidx, align 4 298*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 299*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %indvars.iv.next, 64 300*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !13 301*9880d681SAndroid Build Coastguard Worker 302*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body 303*9880d681SAndroid Build Coastguard Worker ret void 304*9880d681SAndroid Build Coastguard Worker} 305*9880d681SAndroid Build Coastguard Worker!13 = !{!13, !14} 306*9880d681SAndroid Build Coastguard Worker!14 = !{!"llvm.loop.unroll.enable"} 307*9880d681SAndroid Build Coastguard Worker 308*9880d681SAndroid Build Coastguard Worker; #pragma clang loop unroll(enable) 309*9880d681SAndroid Build Coastguard Worker; Loop has a runtime trip count and should be runtime unrolled and duplicated 310*9880d681SAndroid Build Coastguard Worker; (original and 8x). 311*9880d681SAndroid Build Coastguard Worker; 312*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @runtime_loop_with_enable( 313*9880d681SAndroid Build Coastguard Worker; CHECK: for.body: 314*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 315*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 316*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 317*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 318*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 319*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 320*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 321*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 322*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store i32 323*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 324*9880d681SAndroid Build Coastguard Worker; CHECK: for.body.epil: 325*9880d681SAndroid Build Coastguard Worker; CHECK: store 326*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store 327*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 328*9880d681SAndroid Build Coastguard Workerdefine void @runtime_loop_with_enable(i32* nocapture %a, i32 %b) { 329*9880d681SAndroid Build Coastguard Workerentry: 330*9880d681SAndroid Build Coastguard Worker %cmp3 = icmp sgt i32 %b, 0 331*9880d681SAndroid Build Coastguard Worker br i1 %cmp3, label %for.body, label %for.end, !llvm.loop !8 332*9880d681SAndroid Build Coastguard Worker 333*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.body 334*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 335*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 336*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 337*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %0, 1 338*9880d681SAndroid Build Coastguard Worker store i32 %inc, i32* %arrayidx, align 4 339*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 340*9880d681SAndroid Build Coastguard Worker %lftr.wideiv = trunc i64 %indvars.iv.next to i32 341*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %lftr.wideiv, %b 342*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !15 343*9880d681SAndroid Build Coastguard Worker 344*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body, %entry 345*9880d681SAndroid Build Coastguard Worker ret void 346*9880d681SAndroid Build Coastguard Worker} 347*9880d681SAndroid Build Coastguard Worker!15 = !{!15, !14} 348*9880d681SAndroid Build Coastguard Worker 349*9880d681SAndroid Build Coastguard Worker; #pragma clang loop unroll_count(3) 350*9880d681SAndroid Build Coastguard Worker; Loop has a runtime trip count. Runtime unrolling should occur and loop 351*9880d681SAndroid Build Coastguard Worker; should be duplicated (original and 3x unrolled). 352*9880d681SAndroid Build Coastguard Worker; 353*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @runtime_loop_with_count3( 354*9880d681SAndroid Build Coastguard Worker; CHECK: for.body 355*9880d681SAndroid Build Coastguard Worker; CHECK: store 356*9880d681SAndroid Build Coastguard Worker; CHECK: store 357*9880d681SAndroid Build Coastguard Worker; CHECK: store 358*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store 359*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 360*9880d681SAndroid Build Coastguard Worker; CHECK: for.body.epil: 361*9880d681SAndroid Build Coastguard Worker; CHECK: store 362*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store 363*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 364*9880d681SAndroid Build Coastguard Workerdefine void @runtime_loop_with_count3(i32* nocapture %a, i32 %b) { 365*9880d681SAndroid Build Coastguard Workerentry: 366*9880d681SAndroid Build Coastguard Worker %cmp3 = icmp sgt i32 %b, 0 367*9880d681SAndroid Build Coastguard Worker br i1 %cmp3, label %for.body, label %for.end, !llvm.loop !16 368*9880d681SAndroid Build Coastguard Worker 369*9880d681SAndroid Build Coastguard Workerfor.body: ; preds = %entry, %for.body 370*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] 371*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv 372*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx, align 4 373*9880d681SAndroid Build Coastguard Worker %inc = add nsw i32 %0, 1 374*9880d681SAndroid Build Coastguard Worker store i32 %inc, i32* %arrayidx, align 4 375*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 376*9880d681SAndroid Build Coastguard Worker %lftr.wideiv = trunc i64 %indvars.iv.next to i32 377*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %lftr.wideiv, %b 378*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !16 379*9880d681SAndroid Build Coastguard Worker 380*9880d681SAndroid Build Coastguard Workerfor.end: ; preds = %for.body, %entry 381*9880d681SAndroid Build Coastguard Worker ret void 382*9880d681SAndroid Build Coastguard Worker} 383*9880d681SAndroid Build Coastguard Worker!16 = !{!16, !17} 384*9880d681SAndroid Build Coastguard Worker!17 = !{!"llvm.loop.unroll.count", i32 3} 385