144c1a568SDavid Green; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*2a58be42SSamuel Parker; RUN: opt -passes='hardware-loops<force-hardware-loops;hardware-loop-decrement=1;hardware-loop-counter-bitwidth=32>' -S %s -o - | FileCheck %s --check-prefix=CHECK-DEC 3*2a58be42SSamuel Parker; RUN: opt -passes='hardware-loops<force-hardware-loops;hardware-loop-decrement=1;hardware-loop-counter-bitwidth=32;force-hardware-loop-phi>' -S %s -o - | FileCheck %s --check-prefix=CHECK-PHI 4*2a58be42SSamuel Parker; RUN: opt -passes='hardware-loops<force-hardware-loops;hardware-loop-decrement=1;hardware-loop-counter-bitwidth=32;force-nested-hardware-loop>' -S %s -o - | FileCheck %s --check-prefix=CHECK-NESTED 5*2a58be42SSamuel Parker; RUN: opt -passes='hardware-loops<force-hardware-loops;hardware-loop-decrement=1;hardware-loop-counter-bitwidth=32;force-hardware-loop-guard>' -S %s -o - | FileCheck %s --check-prefix=CHECK-GUARD 6*2a58be42SSamuel Parker; RUN: opt -passes='hardware-loops<force-hardware-loops;hardware-loop-decrement=1;hardware-loop-counter-bitwidth=32;force-hardware-loop-phi;force-hardware-loop-guard>' -S %s -o - | FileCheck %s --check-prefix=CHECK-PHIGUARD 7c5ef502eSSam Parker 8d17f4f26SMatt Arsenaultdefine void @while_lt(i32 %i, i32 %N, ptr nocapture %A) { 944c1a568SDavid Green; CHECK-DEC-LABEL: @while_lt( 1044c1a568SDavid Green; CHECK-DEC-NEXT: entry: 1144c1a568SDavid Green; CHECK-DEC-NEXT: [[CMP4:%.*]] = icmp ult i32 [[I:%.*]], [[N:%.*]] 1244c1a568SDavid Green; CHECK-DEC-NEXT: br i1 [[CMP4]], label [[WHILE_BODY_PREHEADER:%.*]], label [[WHILE_END:%.*]] 1344c1a568SDavid Green; CHECK-DEC: while.body.preheader: 1444c1a568SDavid Green; CHECK-DEC-NEXT: [[TMP0:%.*]] = sub i32 [[N]], [[I]] 1544c1a568SDavid Green; CHECK-DEC-NEXT: call void @llvm.set.loop.iterations.i32(i32 [[TMP0]]) 1644c1a568SDavid Green; CHECK-DEC-NEXT: br label [[WHILE_BODY:%.*]] 1744c1a568SDavid Green; CHECK-DEC: while.body: 1844c1a568SDavid Green; CHECK-DEC-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ [[I]], [[WHILE_BODY_PREHEADER]] ] 19d17f4f26SMatt Arsenault; CHECK-DEC-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 20d17f4f26SMatt Arsenault; CHECK-DEC-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 2144c1a568SDavid Green; CHECK-DEC-NEXT: [[INC]] = add nuw i32 [[I_ADDR_05]], 1 2244c1a568SDavid Green; CHECK-DEC-NEXT: [[TMP1:%.*]] = call i1 @llvm.loop.decrement.i32(i32 1) 2344c1a568SDavid Green; CHECK-DEC-NEXT: br i1 [[TMP1]], label [[WHILE_BODY]], label [[WHILE_END]] 2444c1a568SDavid Green; CHECK-DEC: while.end: 2544c1a568SDavid Green; CHECK-DEC-NEXT: ret void 2644c1a568SDavid Green; 2744c1a568SDavid Green; CHECK-PHI-LABEL: @while_lt( 2844c1a568SDavid Green; CHECK-PHI-NEXT: entry: 2944c1a568SDavid Green; CHECK-PHI-NEXT: [[CMP4:%.*]] = icmp ult i32 [[I:%.*]], [[N:%.*]] 3044c1a568SDavid Green; CHECK-PHI-NEXT: br i1 [[CMP4]], label [[WHILE_BODY_PREHEADER:%.*]], label [[WHILE_END:%.*]] 3144c1a568SDavid Green; CHECK-PHI: while.body.preheader: 3244c1a568SDavid Green; CHECK-PHI-NEXT: [[TMP0:%.*]] = sub i32 [[N]], [[I]] 33b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP1:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[TMP0]]) 3444c1a568SDavid Green; CHECK-PHI-NEXT: br label [[WHILE_BODY:%.*]] 3544c1a568SDavid Green; CHECK-PHI: while.body: 3644c1a568SDavid Green; CHECK-PHI-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ [[I]], [[WHILE_BODY_PREHEADER]] ] 37b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP2:%.*]] = phi i32 [ [[TMP1]], [[WHILE_BODY_PREHEADER]] ], [ [[TMP3:%.*]], [[WHILE_BODY]] ] 38d17f4f26SMatt Arsenault; CHECK-PHI-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 39d17f4f26SMatt Arsenault; CHECK-PHI-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 4044c1a568SDavid Green; CHECK-PHI-NEXT: [[INC]] = add nuw i32 [[I_ADDR_05]], 1 41b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP3]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[TMP2]], i32 1) 42b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0 43b2ac9681SDavid Green; CHECK-PHI-NEXT: br i1 [[TMP4]], label [[WHILE_BODY]], label [[WHILE_END]] 4444c1a568SDavid Green; CHECK-PHI: while.end: 4544c1a568SDavid Green; CHECK-PHI-NEXT: ret void 4644c1a568SDavid Green; 4744c1a568SDavid Green; CHECK-NESTED-LABEL: @while_lt( 4844c1a568SDavid Green; CHECK-NESTED-NEXT: entry: 4944c1a568SDavid Green; CHECK-NESTED-NEXT: [[CMP4:%.*]] = icmp ult i32 [[I:%.*]], [[N:%.*]] 5044c1a568SDavid Green; CHECK-NESTED-NEXT: br i1 [[CMP4]], label [[WHILE_BODY_PREHEADER:%.*]], label [[WHILE_END:%.*]] 5144c1a568SDavid Green; CHECK-NESTED: while.body.preheader: 5244c1a568SDavid Green; CHECK-NESTED-NEXT: [[TMP0:%.*]] = sub i32 [[N]], [[I]] 5344c1a568SDavid Green; CHECK-NESTED-NEXT: call void @llvm.set.loop.iterations.i32(i32 [[TMP0]]) 5444c1a568SDavid Green; CHECK-NESTED-NEXT: br label [[WHILE_BODY:%.*]] 5544c1a568SDavid Green; CHECK-NESTED: while.body: 5644c1a568SDavid Green; CHECK-NESTED-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ [[I]], [[WHILE_BODY_PREHEADER]] ] 57d17f4f26SMatt Arsenault; CHECK-NESTED-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 58d17f4f26SMatt Arsenault; CHECK-NESTED-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 5944c1a568SDavid Green; CHECK-NESTED-NEXT: [[INC]] = add nuw i32 [[I_ADDR_05]], 1 6044c1a568SDavid Green; CHECK-NESTED-NEXT: [[TMP1:%.*]] = call i1 @llvm.loop.decrement.i32(i32 1) 6144c1a568SDavid Green; CHECK-NESTED-NEXT: br i1 [[TMP1]], label [[WHILE_BODY]], label [[WHILE_END]] 6244c1a568SDavid Green; CHECK-NESTED: while.end: 6344c1a568SDavid Green; CHECK-NESTED-NEXT: ret void 6444c1a568SDavid Green; 6544c1a568SDavid Green; CHECK-GUARD-LABEL: @while_lt( 6644c1a568SDavid Green; CHECK-GUARD-NEXT: entry: 6744c1a568SDavid Green; CHECK-GUARD-NEXT: [[CMP4:%.*]] = icmp ult i32 [[I:%.*]], [[N:%.*]] 6844c1a568SDavid Green; CHECK-GUARD-NEXT: [[TMP0:%.*]] = sub i32 [[N]], [[I]] 6944c1a568SDavid Green; CHECK-GUARD-NEXT: br i1 [[CMP4]], label [[WHILE_BODY_PREHEADER:%.*]], label [[WHILE_END:%.*]] 7044c1a568SDavid Green; CHECK-GUARD: while.body.preheader: 7144c1a568SDavid Green; CHECK-GUARD-NEXT: call void @llvm.set.loop.iterations.i32(i32 [[TMP0]]) 7244c1a568SDavid Green; CHECK-GUARD-NEXT: br label [[WHILE_BODY:%.*]] 7344c1a568SDavid Green; CHECK-GUARD: while.body: 7444c1a568SDavid Green; CHECK-GUARD-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ [[I]], [[WHILE_BODY_PREHEADER]] ] 75d17f4f26SMatt Arsenault; CHECK-GUARD-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 76d17f4f26SMatt Arsenault; CHECK-GUARD-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 7744c1a568SDavid Green; CHECK-GUARD-NEXT: [[INC]] = add nuw i32 [[I_ADDR_05]], 1 7844c1a568SDavid Green; CHECK-GUARD-NEXT: [[TMP1:%.*]] = call i1 @llvm.loop.decrement.i32(i32 1) 7944c1a568SDavid Green; CHECK-GUARD-NEXT: br i1 [[TMP1]], label [[WHILE_BODY]], label [[WHILE_END]] 8044c1a568SDavid Green; CHECK-GUARD: while.end: 8144c1a568SDavid Green; CHECK-GUARD-NEXT: ret void 8244c1a568SDavid Green; 8344c1a568SDavid Green; CHECK-PHIGUARD-LABEL: @while_lt( 8444c1a568SDavid Green; CHECK-PHIGUARD-NEXT: entry: 8544c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[CMP4:%.*]] = icmp ult i32 [[I:%.*]], [[N:%.*]] 8644c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP0:%.*]] = sub i32 [[N]], [[I]] 8744c1a568SDavid Green; CHECK-PHIGUARD-NEXT: br i1 [[CMP4]], label [[WHILE_BODY_PREHEADER:%.*]], label [[WHILE_END:%.*]] 8844c1a568SDavid Green; CHECK-PHIGUARD: while.body.preheader: 89b2ac9681SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP1:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[TMP0]]) 9044c1a568SDavid Green; CHECK-PHIGUARD-NEXT: br label [[WHILE_BODY:%.*]] 9144c1a568SDavid Green; CHECK-PHIGUARD: while.body: 9244c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ [[I]], [[WHILE_BODY_PREHEADER]] ] 93b2ac9681SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP2:%.*]] = phi i32 [ [[TMP1]], [[WHILE_BODY_PREHEADER]] ], [ [[TMP3:%.*]], [[WHILE_BODY]] ] 94d17f4f26SMatt Arsenault; CHECK-PHIGUARD-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 95d17f4f26SMatt Arsenault; CHECK-PHIGUARD-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 9644c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[INC]] = add nuw i32 [[I_ADDR_05]], 1 97b2ac9681SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP3]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[TMP2]], i32 1) 98b2ac9681SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0 99b2ac9681SDavid Green; CHECK-PHIGUARD-NEXT: br i1 [[TMP4]], label [[WHILE_BODY]], label [[WHILE_END]] 10044c1a568SDavid Green; CHECK-PHIGUARD: while.end: 10144c1a568SDavid Green; CHECK-PHIGUARD-NEXT: ret void 10244c1a568SDavid Green; 103c5ef502eSSam Parkerentry: 104c5ef502eSSam Parker %cmp4 = icmp ult i32 %i, %N 105c5ef502eSSam Parker br i1 %cmp4, label %while.body, label %while.end 106c5ef502eSSam Parker 107c5ef502eSSam Parkerwhile.body: 108c5ef502eSSam Parker %i.addr.05 = phi i32 [ %inc, %while.body ], [ %i, %entry ] 109d17f4f26SMatt Arsenault %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.addr.05 110d17f4f26SMatt Arsenault store i32 %i.addr.05, ptr %arrayidx, align 4 111c5ef502eSSam Parker %inc = add nuw i32 %i.addr.05, 1 112c5ef502eSSam Parker %exitcond = icmp eq i32 %inc, %N 113c5ef502eSSam Parker br i1 %exitcond, label %while.end, label %while.body 114c5ef502eSSam Parker 115c5ef502eSSam Parkerwhile.end: 116c5ef502eSSam Parker ret void 117c5ef502eSSam Parker} 118c5ef502eSSam Parker 119d17f4f26SMatt Arsenaultdefine void @while_gt(i32 %i, i32 %N, ptr nocapture %A) { 12044c1a568SDavid Green; CHECK-DEC-LABEL: @while_gt( 12144c1a568SDavid Green; CHECK-DEC-NEXT: entry: 12244c1a568SDavid Green; CHECK-DEC-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[I:%.*]], [[N:%.*]] 12344c1a568SDavid Green; CHECK-DEC-NEXT: br i1 [[CMP4]], label [[WHILE_BODY_PREHEADER:%.*]], label [[WHILE_END:%.*]] 12444c1a568SDavid Green; CHECK-DEC: while.body.preheader: 12544c1a568SDavid Green; CHECK-DEC-NEXT: [[TMP0:%.*]] = sub i32 [[I]], [[N]] 12644c1a568SDavid Green; CHECK-DEC-NEXT: call void @llvm.set.loop.iterations.i32(i32 [[TMP0]]) 12744c1a568SDavid Green; CHECK-DEC-NEXT: br label [[WHILE_BODY:%.*]] 12844c1a568SDavid Green; CHECK-DEC: while.body: 12944c1a568SDavid Green; CHECK-DEC-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[DEC:%.*]], [[WHILE_BODY]] ], [ [[I]], [[WHILE_BODY_PREHEADER]] ] 130d17f4f26SMatt Arsenault; CHECK-DEC-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 131d17f4f26SMatt Arsenault; CHECK-DEC-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 13244c1a568SDavid Green; CHECK-DEC-NEXT: [[DEC]] = add nsw i32 [[I_ADDR_05]], -1 13344c1a568SDavid Green; CHECK-DEC-NEXT: [[TMP1:%.*]] = call i1 @llvm.loop.decrement.i32(i32 1) 13444c1a568SDavid Green; CHECK-DEC-NEXT: br i1 [[TMP1]], label [[WHILE_BODY]], label [[WHILE_END]] 13544c1a568SDavid Green; CHECK-DEC: while.end: 13644c1a568SDavid Green; CHECK-DEC-NEXT: ret void 13744c1a568SDavid Green; 13844c1a568SDavid Green; CHECK-PHI-LABEL: @while_gt( 13944c1a568SDavid Green; CHECK-PHI-NEXT: entry: 14044c1a568SDavid Green; CHECK-PHI-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[I:%.*]], [[N:%.*]] 14144c1a568SDavid Green; CHECK-PHI-NEXT: br i1 [[CMP4]], label [[WHILE_BODY_PREHEADER:%.*]], label [[WHILE_END:%.*]] 14244c1a568SDavid Green; CHECK-PHI: while.body.preheader: 14344c1a568SDavid Green; CHECK-PHI-NEXT: [[TMP0:%.*]] = sub i32 [[I]], [[N]] 144b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP1:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[TMP0]]) 14544c1a568SDavid Green; CHECK-PHI-NEXT: br label [[WHILE_BODY:%.*]] 14644c1a568SDavid Green; CHECK-PHI: while.body: 14744c1a568SDavid Green; CHECK-PHI-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[DEC:%.*]], [[WHILE_BODY]] ], [ [[I]], [[WHILE_BODY_PREHEADER]] ] 148b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP2:%.*]] = phi i32 [ [[TMP1]], [[WHILE_BODY_PREHEADER]] ], [ [[TMP3:%.*]], [[WHILE_BODY]] ] 149d17f4f26SMatt Arsenault; CHECK-PHI-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 150d17f4f26SMatt Arsenault; CHECK-PHI-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 15144c1a568SDavid Green; CHECK-PHI-NEXT: [[DEC]] = add nsw i32 [[I_ADDR_05]], -1 152b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP3]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[TMP2]], i32 1) 153b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0 154b2ac9681SDavid Green; CHECK-PHI-NEXT: br i1 [[TMP4]], label [[WHILE_BODY]], label [[WHILE_END]] 15544c1a568SDavid Green; CHECK-PHI: while.end: 15644c1a568SDavid Green; CHECK-PHI-NEXT: ret void 15744c1a568SDavid Green; 15844c1a568SDavid Green; CHECK-NESTED-LABEL: @while_gt( 15944c1a568SDavid Green; CHECK-NESTED-NEXT: entry: 16044c1a568SDavid Green; CHECK-NESTED-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[I:%.*]], [[N:%.*]] 16144c1a568SDavid Green; CHECK-NESTED-NEXT: br i1 [[CMP4]], label [[WHILE_BODY_PREHEADER:%.*]], label [[WHILE_END:%.*]] 16244c1a568SDavid Green; CHECK-NESTED: while.body.preheader: 16344c1a568SDavid Green; CHECK-NESTED-NEXT: [[TMP0:%.*]] = sub i32 [[I]], [[N]] 16444c1a568SDavid Green; CHECK-NESTED-NEXT: call void @llvm.set.loop.iterations.i32(i32 [[TMP0]]) 16544c1a568SDavid Green; CHECK-NESTED-NEXT: br label [[WHILE_BODY:%.*]] 16644c1a568SDavid Green; CHECK-NESTED: while.body: 16744c1a568SDavid Green; CHECK-NESTED-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[DEC:%.*]], [[WHILE_BODY]] ], [ [[I]], [[WHILE_BODY_PREHEADER]] ] 168d17f4f26SMatt Arsenault; CHECK-NESTED-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 169d17f4f26SMatt Arsenault; CHECK-NESTED-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 17044c1a568SDavid Green; CHECK-NESTED-NEXT: [[DEC]] = add nsw i32 [[I_ADDR_05]], -1 17144c1a568SDavid Green; CHECK-NESTED-NEXT: [[TMP1:%.*]] = call i1 @llvm.loop.decrement.i32(i32 1) 17244c1a568SDavid Green; CHECK-NESTED-NEXT: br i1 [[TMP1]], label [[WHILE_BODY]], label [[WHILE_END]] 17344c1a568SDavid Green; CHECK-NESTED: while.end: 17444c1a568SDavid Green; CHECK-NESTED-NEXT: ret void 17544c1a568SDavid Green; 17644c1a568SDavid Green; CHECK-GUARD-LABEL: @while_gt( 17744c1a568SDavid Green; CHECK-GUARD-NEXT: entry: 17844c1a568SDavid Green; CHECK-GUARD-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[I:%.*]], [[N:%.*]] 17944c1a568SDavid Green; CHECK-GUARD-NEXT: [[TMP0:%.*]] = sub i32 [[I]], [[N]] 18044c1a568SDavid Green; CHECK-GUARD-NEXT: br i1 [[CMP4]], label [[WHILE_BODY_PREHEADER:%.*]], label [[WHILE_END:%.*]] 18144c1a568SDavid Green; CHECK-GUARD: while.body.preheader: 18244c1a568SDavid Green; CHECK-GUARD-NEXT: call void @llvm.set.loop.iterations.i32(i32 [[TMP0]]) 18344c1a568SDavid Green; CHECK-GUARD-NEXT: br label [[WHILE_BODY:%.*]] 18444c1a568SDavid Green; CHECK-GUARD: while.body: 18544c1a568SDavid Green; CHECK-GUARD-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[DEC:%.*]], [[WHILE_BODY]] ], [ [[I]], [[WHILE_BODY_PREHEADER]] ] 186d17f4f26SMatt Arsenault; CHECK-GUARD-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 187d17f4f26SMatt Arsenault; CHECK-GUARD-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 18844c1a568SDavid Green; CHECK-GUARD-NEXT: [[DEC]] = add nsw i32 [[I_ADDR_05]], -1 18944c1a568SDavid Green; CHECK-GUARD-NEXT: [[TMP1:%.*]] = call i1 @llvm.loop.decrement.i32(i32 1) 19044c1a568SDavid Green; CHECK-GUARD-NEXT: br i1 [[TMP1]], label [[WHILE_BODY]], label [[WHILE_END]] 19144c1a568SDavid Green; CHECK-GUARD: while.end: 19244c1a568SDavid Green; CHECK-GUARD-NEXT: ret void 19344c1a568SDavid Green; 19444c1a568SDavid Green; CHECK-PHIGUARD-LABEL: @while_gt( 19544c1a568SDavid Green; CHECK-PHIGUARD-NEXT: entry: 19644c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[CMP4:%.*]] = icmp sgt i32 [[I:%.*]], [[N:%.*]] 19744c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP0:%.*]] = sub i32 [[I]], [[N]] 19844c1a568SDavid Green; CHECK-PHIGUARD-NEXT: br i1 [[CMP4]], label [[WHILE_BODY_PREHEADER:%.*]], label [[WHILE_END:%.*]] 19944c1a568SDavid Green; CHECK-PHIGUARD: while.body.preheader: 200b2ac9681SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP1:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[TMP0]]) 20144c1a568SDavid Green; CHECK-PHIGUARD-NEXT: br label [[WHILE_BODY:%.*]] 20244c1a568SDavid Green; CHECK-PHIGUARD: while.body: 20344c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[DEC:%.*]], [[WHILE_BODY]] ], [ [[I]], [[WHILE_BODY_PREHEADER]] ] 204b2ac9681SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP2:%.*]] = phi i32 [ [[TMP1]], [[WHILE_BODY_PREHEADER]] ], [ [[TMP3:%.*]], [[WHILE_BODY]] ] 205d17f4f26SMatt Arsenault; CHECK-PHIGUARD-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 206d17f4f26SMatt Arsenault; CHECK-PHIGUARD-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 20744c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[DEC]] = add nsw i32 [[I_ADDR_05]], -1 208b2ac9681SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP3]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[TMP2]], i32 1) 209b2ac9681SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP3]], 0 210b2ac9681SDavid Green; CHECK-PHIGUARD-NEXT: br i1 [[TMP4]], label [[WHILE_BODY]], label [[WHILE_END]] 21144c1a568SDavid Green; CHECK-PHIGUARD: while.end: 21244c1a568SDavid Green; CHECK-PHIGUARD-NEXT: ret void 21344c1a568SDavid Green; 214c5ef502eSSam Parkerentry: 215c5ef502eSSam Parker %cmp4 = icmp sgt i32 %i, %N 216c5ef502eSSam Parker br i1 %cmp4, label %while.body, label %while.end 217c5ef502eSSam Parker 218c5ef502eSSam Parkerwhile.body: 219c5ef502eSSam Parker %i.addr.05 = phi i32 [ %dec, %while.body ], [ %i, %entry ] 220d17f4f26SMatt Arsenault %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.addr.05 221d17f4f26SMatt Arsenault store i32 %i.addr.05, ptr %arrayidx, align 4 222c5ef502eSSam Parker %dec = add nsw i32 %i.addr.05, -1 223c5ef502eSSam Parker %cmp = icmp sgt i32 %dec, %N 224c5ef502eSSam Parker br i1 %cmp, label %while.body, label %while.end 225c5ef502eSSam Parker 226c5ef502eSSam Parkerwhile.end: 227c5ef502eSSam Parker ret void 228c5ef502eSSam Parker} 229c5ef502eSSam Parker 230d17f4f26SMatt Arsenaultdefine void @while_gte(i32 %i, i32 %N, ptr nocapture %A) { 23144c1a568SDavid Green; CHECK-DEC-LABEL: @while_gte( 23244c1a568SDavid Green; CHECK-DEC-NEXT: entry: 23344c1a568SDavid Green; CHECK-DEC-NEXT: [[CMP4:%.*]] = icmp slt i32 [[I:%.*]], [[N:%.*]] 23444c1a568SDavid Green; CHECK-DEC-NEXT: br i1 [[CMP4]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]] 23544c1a568SDavid Green; CHECK-DEC: while.body.preheader: 23644c1a568SDavid Green; CHECK-DEC-NEXT: [[TMP0:%.*]] = add i32 [[I]], 1 23744c1a568SDavid Green; CHECK-DEC-NEXT: [[TMP1:%.*]] = sub i32 [[TMP0]], [[N]] 23844c1a568SDavid Green; CHECK-DEC-NEXT: call void @llvm.set.loop.iterations.i32(i32 [[TMP1]]) 23944c1a568SDavid Green; CHECK-DEC-NEXT: br label [[WHILE_BODY:%.*]] 24044c1a568SDavid Green; CHECK-DEC: while.body: 24144c1a568SDavid Green; CHECK-DEC-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[DEC:%.*]], [[WHILE_BODY]] ], [ [[I]], [[WHILE_BODY_PREHEADER]] ] 242d17f4f26SMatt Arsenault; CHECK-DEC-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 243d17f4f26SMatt Arsenault; CHECK-DEC-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 24444c1a568SDavid Green; CHECK-DEC-NEXT: [[DEC]] = add nsw i32 [[I_ADDR_05]], -1 24544c1a568SDavid Green; CHECK-DEC-NEXT: [[TMP2:%.*]] = call i1 @llvm.loop.decrement.i32(i32 1) 24644c1a568SDavid Green; CHECK-DEC-NEXT: br i1 [[TMP2]], label [[WHILE_BODY]], label [[WHILE_END]] 24744c1a568SDavid Green; CHECK-DEC: while.end: 24844c1a568SDavid Green; CHECK-DEC-NEXT: ret void 24944c1a568SDavid Green; 25044c1a568SDavid Green; CHECK-PHI-LABEL: @while_gte( 25144c1a568SDavid Green; CHECK-PHI-NEXT: entry: 25244c1a568SDavid Green; CHECK-PHI-NEXT: [[CMP4:%.*]] = icmp slt i32 [[I:%.*]], [[N:%.*]] 25344c1a568SDavid Green; CHECK-PHI-NEXT: br i1 [[CMP4]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]] 25444c1a568SDavid Green; CHECK-PHI: while.body.preheader: 25544c1a568SDavid Green; CHECK-PHI-NEXT: [[TMP0:%.*]] = add i32 [[I]], 1 25644c1a568SDavid Green; CHECK-PHI-NEXT: [[TMP1:%.*]] = sub i32 [[TMP0]], [[N]] 257b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP2:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[TMP1]]) 25844c1a568SDavid Green; CHECK-PHI-NEXT: br label [[WHILE_BODY:%.*]] 25944c1a568SDavid Green; CHECK-PHI: while.body: 26044c1a568SDavid Green; CHECK-PHI-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[DEC:%.*]], [[WHILE_BODY]] ], [ [[I]], [[WHILE_BODY_PREHEADER]] ] 261b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP3:%.*]] = phi i32 [ [[TMP2]], [[WHILE_BODY_PREHEADER]] ], [ [[TMP4:%.*]], [[WHILE_BODY]] ] 262d17f4f26SMatt Arsenault; CHECK-PHI-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 263d17f4f26SMatt Arsenault; CHECK-PHI-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 26444c1a568SDavid Green; CHECK-PHI-NEXT: [[DEC]] = add nsw i32 [[I_ADDR_05]], -1 265b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP4]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[TMP3]], i32 1) 266b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 0 267b2ac9681SDavid Green; CHECK-PHI-NEXT: br i1 [[TMP5]], label [[WHILE_BODY]], label [[WHILE_END]] 26844c1a568SDavid Green; CHECK-PHI: while.end: 26944c1a568SDavid Green; CHECK-PHI-NEXT: ret void 27044c1a568SDavid Green; 27144c1a568SDavid Green; CHECK-NESTED-LABEL: @while_gte( 27244c1a568SDavid Green; CHECK-NESTED-NEXT: entry: 27344c1a568SDavid Green; CHECK-NESTED-NEXT: [[CMP4:%.*]] = icmp slt i32 [[I:%.*]], [[N:%.*]] 27444c1a568SDavid Green; CHECK-NESTED-NEXT: br i1 [[CMP4]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]] 27544c1a568SDavid Green; CHECK-NESTED: while.body.preheader: 27644c1a568SDavid Green; CHECK-NESTED-NEXT: [[TMP0:%.*]] = add i32 [[I]], 1 27744c1a568SDavid Green; CHECK-NESTED-NEXT: [[TMP1:%.*]] = sub i32 [[TMP0]], [[N]] 27844c1a568SDavid Green; CHECK-NESTED-NEXT: call void @llvm.set.loop.iterations.i32(i32 [[TMP1]]) 27944c1a568SDavid Green; CHECK-NESTED-NEXT: br label [[WHILE_BODY:%.*]] 28044c1a568SDavid Green; CHECK-NESTED: while.body: 28144c1a568SDavid Green; CHECK-NESTED-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[DEC:%.*]], [[WHILE_BODY]] ], [ [[I]], [[WHILE_BODY_PREHEADER]] ] 282d17f4f26SMatt Arsenault; CHECK-NESTED-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 283d17f4f26SMatt Arsenault; CHECK-NESTED-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 28444c1a568SDavid Green; CHECK-NESTED-NEXT: [[DEC]] = add nsw i32 [[I_ADDR_05]], -1 28544c1a568SDavid Green; CHECK-NESTED-NEXT: [[TMP2:%.*]] = call i1 @llvm.loop.decrement.i32(i32 1) 28644c1a568SDavid Green; CHECK-NESTED-NEXT: br i1 [[TMP2]], label [[WHILE_BODY]], label [[WHILE_END]] 28744c1a568SDavid Green; CHECK-NESTED: while.end: 28844c1a568SDavid Green; CHECK-NESTED-NEXT: ret void 28944c1a568SDavid Green; 29044c1a568SDavid Green; CHECK-GUARD-LABEL: @while_gte( 29144c1a568SDavid Green; CHECK-GUARD-NEXT: entry: 29244c1a568SDavid Green; CHECK-GUARD-NEXT: [[CMP4:%.*]] = icmp slt i32 [[I:%.*]], [[N:%.*]] 29344c1a568SDavid Green; CHECK-GUARD-NEXT: br i1 [[CMP4]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]] 29444c1a568SDavid Green; CHECK-GUARD: while.body.preheader: 29544c1a568SDavid Green; CHECK-GUARD-NEXT: [[TMP0:%.*]] = add i32 [[I]], 1 29644c1a568SDavid Green; CHECK-GUARD-NEXT: [[TMP1:%.*]] = sub i32 [[TMP0]], [[N]] 29744c1a568SDavid Green; CHECK-GUARD-NEXT: call void @llvm.set.loop.iterations.i32(i32 [[TMP1]]) 29844c1a568SDavid Green; CHECK-GUARD-NEXT: br label [[WHILE_BODY:%.*]] 29944c1a568SDavid Green; CHECK-GUARD: while.body: 30044c1a568SDavid Green; CHECK-GUARD-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[DEC:%.*]], [[WHILE_BODY]] ], [ [[I]], [[WHILE_BODY_PREHEADER]] ] 301d17f4f26SMatt Arsenault; CHECK-GUARD-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 302d17f4f26SMatt Arsenault; CHECK-GUARD-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 30344c1a568SDavid Green; CHECK-GUARD-NEXT: [[DEC]] = add nsw i32 [[I_ADDR_05]], -1 30444c1a568SDavid Green; CHECK-GUARD-NEXT: [[TMP2:%.*]] = call i1 @llvm.loop.decrement.i32(i32 1) 30544c1a568SDavid Green; CHECK-GUARD-NEXT: br i1 [[TMP2]], label [[WHILE_BODY]], label [[WHILE_END]] 30644c1a568SDavid Green; CHECK-GUARD: while.end: 30744c1a568SDavid Green; CHECK-GUARD-NEXT: ret void 30844c1a568SDavid Green; 30944c1a568SDavid Green; CHECK-PHIGUARD-LABEL: @while_gte( 31044c1a568SDavid Green; CHECK-PHIGUARD-NEXT: entry: 31144c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[CMP4:%.*]] = icmp slt i32 [[I:%.*]], [[N:%.*]] 31244c1a568SDavid Green; CHECK-PHIGUARD-NEXT: br i1 [[CMP4]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]] 31344c1a568SDavid Green; CHECK-PHIGUARD: while.body.preheader: 31444c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP0:%.*]] = add i32 [[I]], 1 31544c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP1:%.*]] = sub i32 [[TMP0]], [[N]] 316b2ac9681SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP2:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[TMP1]]) 31744c1a568SDavid Green; CHECK-PHIGUARD-NEXT: br label [[WHILE_BODY:%.*]] 31844c1a568SDavid Green; CHECK-PHIGUARD: while.body: 31944c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[DEC:%.*]], [[WHILE_BODY]] ], [ [[I]], [[WHILE_BODY_PREHEADER]] ] 320b2ac9681SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP3:%.*]] = phi i32 [ [[TMP2]], [[WHILE_BODY_PREHEADER]] ], [ [[TMP4:%.*]], [[WHILE_BODY]] ] 321d17f4f26SMatt Arsenault; CHECK-PHIGUARD-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 322d17f4f26SMatt Arsenault; CHECK-PHIGUARD-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 32344c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[DEC]] = add nsw i32 [[I_ADDR_05]], -1 324b2ac9681SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP4]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[TMP3]], i32 1) 325b2ac9681SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 0 326b2ac9681SDavid Green; CHECK-PHIGUARD-NEXT: br i1 [[TMP5]], label [[WHILE_BODY]], label [[WHILE_END]] 32744c1a568SDavid Green; CHECK-PHIGUARD: while.end: 32844c1a568SDavid Green; CHECK-PHIGUARD-NEXT: ret void 32944c1a568SDavid Green; 330c5ef502eSSam Parkerentry: 331c5ef502eSSam Parker %cmp4 = icmp slt i32 %i, %N 332c5ef502eSSam Parker br i1 %cmp4, label %while.end, label %while.body 333c5ef502eSSam Parker 334c5ef502eSSam Parkerwhile.body: 335c5ef502eSSam Parker %i.addr.05 = phi i32 [ %dec, %while.body ], [ %i, %entry ] 336d17f4f26SMatt Arsenault %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.addr.05 337d17f4f26SMatt Arsenault store i32 %i.addr.05, ptr %arrayidx, align 4 338c5ef502eSSam Parker %dec = add nsw i32 %i.addr.05, -1 339c5ef502eSSam Parker %cmp = icmp sgt i32 %i.addr.05, %N 340c5ef502eSSam Parker br i1 %cmp, label %while.body, label %while.end 341c5ef502eSSam Parker 342c5ef502eSSam Parkerwhile.end: 343c5ef502eSSam Parker ret void 344c5ef502eSSam Parker} 345c5ef502eSSam Parker 346d17f4f26SMatt Arsenaultdefine void @while_ne(i32 %N, ptr nocapture %A) { 34744c1a568SDavid Green; CHECK-DEC-LABEL: @while_ne( 34844c1a568SDavid Green; CHECK-DEC-NEXT: entry: 34944c1a568SDavid Green; CHECK-DEC-NEXT: [[CMP:%.*]] = icmp ne i32 [[N:%.*]], 0 35044c1a568SDavid Green; CHECK-DEC-NEXT: br i1 [[CMP]], label [[WHILE_BODY_PREHEADER:%.*]], label [[WHILE_END:%.*]] 35144c1a568SDavid Green; CHECK-DEC: while.body.preheader: 35244c1a568SDavid Green; CHECK-DEC-NEXT: call void @llvm.set.loop.iterations.i32(i32 [[N]]) 35344c1a568SDavid Green; CHECK-DEC-NEXT: br label [[WHILE_BODY:%.*]] 35444c1a568SDavid Green; CHECK-DEC: while.body: 35544c1a568SDavid Green; CHECK-DEC-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ] 356d17f4f26SMatt Arsenault; CHECK-DEC-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 357d17f4f26SMatt Arsenault; CHECK-DEC-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 35844c1a568SDavid Green; CHECK-DEC-NEXT: [[INC]] = add nuw i32 [[I_ADDR_05]], 1 35944c1a568SDavid Green; CHECK-DEC-NEXT: [[TMP0:%.*]] = call i1 @llvm.loop.decrement.i32(i32 1) 36044c1a568SDavid Green; CHECK-DEC-NEXT: br i1 [[TMP0]], label [[WHILE_BODY]], label [[WHILE_END]] 36144c1a568SDavid Green; CHECK-DEC: while.end: 36244c1a568SDavid Green; CHECK-DEC-NEXT: ret void 36344c1a568SDavid Green; 36444c1a568SDavid Green; CHECK-PHI-LABEL: @while_ne( 36544c1a568SDavid Green; CHECK-PHI-NEXT: entry: 36644c1a568SDavid Green; CHECK-PHI-NEXT: [[CMP:%.*]] = icmp ne i32 [[N:%.*]], 0 36744c1a568SDavid Green; CHECK-PHI-NEXT: br i1 [[CMP]], label [[WHILE_BODY_PREHEADER:%.*]], label [[WHILE_END:%.*]] 36844c1a568SDavid Green; CHECK-PHI: while.body.preheader: 369b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP0:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[N]]) 37044c1a568SDavid Green; CHECK-PHI-NEXT: br label [[WHILE_BODY:%.*]] 37144c1a568SDavid Green; CHECK-PHI: while.body: 37244c1a568SDavid Green; CHECK-PHI-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ] 373b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP1:%.*]] = phi i32 [ [[TMP0]], [[WHILE_BODY_PREHEADER]] ], [ [[TMP2:%.*]], [[WHILE_BODY]] ] 374d17f4f26SMatt Arsenault; CHECK-PHI-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 375d17f4f26SMatt Arsenault; CHECK-PHI-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 37644c1a568SDavid Green; CHECK-PHI-NEXT: [[INC]] = add nuw i32 [[I_ADDR_05]], 1 377b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP2]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[TMP1]], i32 1) 378b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0 379b2ac9681SDavid Green; CHECK-PHI-NEXT: br i1 [[TMP3]], label [[WHILE_BODY]], label [[WHILE_END]] 38044c1a568SDavid Green; CHECK-PHI: while.end: 38144c1a568SDavid Green; CHECK-PHI-NEXT: ret void 38244c1a568SDavid Green; 38344c1a568SDavid Green; CHECK-NESTED-LABEL: @while_ne( 38444c1a568SDavid Green; CHECK-NESTED-NEXT: entry: 38544c1a568SDavid Green; CHECK-NESTED-NEXT: [[CMP:%.*]] = icmp ne i32 [[N:%.*]], 0 38644c1a568SDavid Green; CHECK-NESTED-NEXT: br i1 [[CMP]], label [[WHILE_BODY_PREHEADER:%.*]], label [[WHILE_END:%.*]] 38744c1a568SDavid Green; CHECK-NESTED: while.body.preheader: 38844c1a568SDavid Green; CHECK-NESTED-NEXT: call void @llvm.set.loop.iterations.i32(i32 [[N]]) 38944c1a568SDavid Green; CHECK-NESTED-NEXT: br label [[WHILE_BODY:%.*]] 39044c1a568SDavid Green; CHECK-NESTED: while.body: 39144c1a568SDavid Green; CHECK-NESTED-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ] 392d17f4f26SMatt Arsenault; CHECK-NESTED-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 393d17f4f26SMatt Arsenault; CHECK-NESTED-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 39444c1a568SDavid Green; CHECK-NESTED-NEXT: [[INC]] = add nuw i32 [[I_ADDR_05]], 1 39544c1a568SDavid Green; CHECK-NESTED-NEXT: [[TMP0:%.*]] = call i1 @llvm.loop.decrement.i32(i32 1) 39644c1a568SDavid Green; CHECK-NESTED-NEXT: br i1 [[TMP0]], label [[WHILE_BODY]], label [[WHILE_END]] 39744c1a568SDavid Green; CHECK-NESTED: while.end: 39844c1a568SDavid Green; CHECK-NESTED-NEXT: ret void 39944c1a568SDavid Green; 40044c1a568SDavid Green; CHECK-GUARD-LABEL: @while_ne( 40144c1a568SDavid Green; CHECK-GUARD-NEXT: entry: 40244c1a568SDavid Green; CHECK-GUARD-NEXT: [[CMP:%.*]] = icmp ne i32 [[N:%.*]], 0 40344c1a568SDavid Green; CHECK-GUARD-NEXT: [[TMP0:%.*]] = call i1 @llvm.test.set.loop.iterations.i32(i32 [[N]]) 40444c1a568SDavid Green; CHECK-GUARD-NEXT: br i1 [[TMP0]], label [[WHILE_BODY_PREHEADER:%.*]], label [[WHILE_END:%.*]] 40544c1a568SDavid Green; CHECK-GUARD: while.body.preheader: 40644c1a568SDavid Green; CHECK-GUARD-NEXT: br label [[WHILE_BODY:%.*]] 40744c1a568SDavid Green; CHECK-GUARD: while.body: 40844c1a568SDavid Green; CHECK-GUARD-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ] 409d17f4f26SMatt Arsenault; CHECK-GUARD-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 410d17f4f26SMatt Arsenault; CHECK-GUARD-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 41144c1a568SDavid Green; CHECK-GUARD-NEXT: [[INC]] = add nuw i32 [[I_ADDR_05]], 1 41244c1a568SDavid Green; CHECK-GUARD-NEXT: [[TMP1:%.*]] = call i1 @llvm.loop.decrement.i32(i32 1) 41344c1a568SDavid Green; CHECK-GUARD-NEXT: br i1 [[TMP1]], label [[WHILE_BODY]], label [[WHILE_END]] 41444c1a568SDavid Green; CHECK-GUARD: while.end: 41544c1a568SDavid Green; CHECK-GUARD-NEXT: ret void 41644c1a568SDavid Green; 41744c1a568SDavid Green; CHECK-PHIGUARD-LABEL: @while_ne( 41844c1a568SDavid Green; CHECK-PHIGUARD-NEXT: entry: 41944c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[CMP:%.*]] = icmp ne i32 [[N:%.*]], 0 420fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP0:%.*]] = call { i32, i1 } @llvm.test.start.loop.iterations.i32(i32 [[N]]) 421fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1 422fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP2:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0 423fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: br i1 [[TMP1]], label [[WHILE_BODY_PREHEADER:%.*]], label [[WHILE_END:%.*]] 42444c1a568SDavid Green; CHECK-PHIGUARD: while.body.preheader: 42544c1a568SDavid Green; CHECK-PHIGUARD-NEXT: br label [[WHILE_BODY:%.*]] 42644c1a568SDavid Green; CHECK-PHIGUARD: while.body: 42744c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ] 428fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP3:%.*]] = phi i32 [ [[TMP2]], [[WHILE_BODY_PREHEADER]] ], [ [[TMP4:%.*]], [[WHILE_BODY]] ] 429d17f4f26SMatt Arsenault; CHECK-PHIGUARD-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 430d17f4f26SMatt Arsenault; CHECK-PHIGUARD-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 43144c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[INC]] = add nuw i32 [[I_ADDR_05]], 1 432fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP4]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[TMP3]], i32 1) 433fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 0 434fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: br i1 [[TMP5]], label [[WHILE_BODY]], label [[WHILE_END]] 43544c1a568SDavid Green; CHECK-PHIGUARD: while.end: 43644c1a568SDavid Green; CHECK-PHIGUARD-NEXT: ret void 43744c1a568SDavid Green; 4389a92be1bSSam Parkerentry: 4399a92be1bSSam Parker %cmp = icmp ne i32 %N, 0 4409a92be1bSSam Parker br i1 %cmp, label %while.body, label %while.end 4419a92be1bSSam Parker 4429a92be1bSSam Parkerwhile.body: 4439a92be1bSSam Parker %i.addr.05 = phi i32 [ %inc, %while.body ], [ 0, %entry ] 444d17f4f26SMatt Arsenault %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.addr.05 445d17f4f26SMatt Arsenault store i32 %i.addr.05, ptr %arrayidx, align 4 4469a92be1bSSam Parker %inc = add nuw i32 %i.addr.05, 1 4479a92be1bSSam Parker %exitcond = icmp eq i32 %inc, %N 4489a92be1bSSam Parker br i1 %exitcond, label %while.end, label %while.body 4499a92be1bSSam Parker 4509a92be1bSSam Parkerwhile.end: 4519a92be1bSSam Parker ret void 4529a92be1bSSam Parker} 4539a92be1bSSam Parker 454d17f4f26SMatt Arsenaultdefine void @while_eq(i32 %N, ptr nocapture %A) { 45544c1a568SDavid Green; CHECK-DEC-LABEL: @while_eq( 45644c1a568SDavid Green; CHECK-DEC-NEXT: entry: 45744c1a568SDavid Green; CHECK-DEC-NEXT: [[CMP:%.*]] = icmp eq i32 [[N:%.*]], 0 45844c1a568SDavid Green; CHECK-DEC-NEXT: br i1 [[CMP]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]] 45944c1a568SDavid Green; CHECK-DEC: while.body.preheader: 46044c1a568SDavid Green; CHECK-DEC-NEXT: call void @llvm.set.loop.iterations.i32(i32 [[N]]) 46144c1a568SDavid Green; CHECK-DEC-NEXT: br label [[WHILE_BODY:%.*]] 46244c1a568SDavid Green; CHECK-DEC: while.body: 46344c1a568SDavid Green; CHECK-DEC-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ] 464d17f4f26SMatt Arsenault; CHECK-DEC-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 465d17f4f26SMatt Arsenault; CHECK-DEC-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 46644c1a568SDavid Green; CHECK-DEC-NEXT: [[INC]] = add nuw i32 [[I_ADDR_05]], 1 46744c1a568SDavid Green; CHECK-DEC-NEXT: [[TMP0:%.*]] = call i1 @llvm.loop.decrement.i32(i32 1) 46844c1a568SDavid Green; CHECK-DEC-NEXT: br i1 [[TMP0]], label [[WHILE_BODY]], label [[WHILE_END]] 46944c1a568SDavid Green; CHECK-DEC: while.end: 47044c1a568SDavid Green; CHECK-DEC-NEXT: ret void 47144c1a568SDavid Green; 47244c1a568SDavid Green; CHECK-PHI-LABEL: @while_eq( 47344c1a568SDavid Green; CHECK-PHI-NEXT: entry: 47444c1a568SDavid Green; CHECK-PHI-NEXT: [[CMP:%.*]] = icmp eq i32 [[N:%.*]], 0 47544c1a568SDavid Green; CHECK-PHI-NEXT: br i1 [[CMP]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]] 47644c1a568SDavid Green; CHECK-PHI: while.body.preheader: 477b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP0:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[N]]) 47844c1a568SDavid Green; CHECK-PHI-NEXT: br label [[WHILE_BODY:%.*]] 47944c1a568SDavid Green; CHECK-PHI: while.body: 48044c1a568SDavid Green; CHECK-PHI-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ] 481b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP1:%.*]] = phi i32 [ [[TMP0]], [[WHILE_BODY_PREHEADER]] ], [ [[TMP2:%.*]], [[WHILE_BODY]] ] 482d17f4f26SMatt Arsenault; CHECK-PHI-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 483d17f4f26SMatt Arsenault; CHECK-PHI-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 48444c1a568SDavid Green; CHECK-PHI-NEXT: [[INC]] = add nuw i32 [[I_ADDR_05]], 1 485b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP2]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[TMP1]], i32 1) 486b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0 487b2ac9681SDavid Green; CHECK-PHI-NEXT: br i1 [[TMP3]], label [[WHILE_BODY]], label [[WHILE_END]] 48844c1a568SDavid Green; CHECK-PHI: while.end: 48944c1a568SDavid Green; CHECK-PHI-NEXT: ret void 49044c1a568SDavid Green; 49144c1a568SDavid Green; CHECK-NESTED-LABEL: @while_eq( 49244c1a568SDavid Green; CHECK-NESTED-NEXT: entry: 49344c1a568SDavid Green; CHECK-NESTED-NEXT: [[CMP:%.*]] = icmp eq i32 [[N:%.*]], 0 49444c1a568SDavid Green; CHECK-NESTED-NEXT: br i1 [[CMP]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]] 49544c1a568SDavid Green; CHECK-NESTED: while.body.preheader: 49644c1a568SDavid Green; CHECK-NESTED-NEXT: call void @llvm.set.loop.iterations.i32(i32 [[N]]) 49744c1a568SDavid Green; CHECK-NESTED-NEXT: br label [[WHILE_BODY:%.*]] 49844c1a568SDavid Green; CHECK-NESTED: while.body: 49944c1a568SDavid Green; CHECK-NESTED-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ] 500d17f4f26SMatt Arsenault; CHECK-NESTED-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 501d17f4f26SMatt Arsenault; CHECK-NESTED-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 50244c1a568SDavid Green; CHECK-NESTED-NEXT: [[INC]] = add nuw i32 [[I_ADDR_05]], 1 50344c1a568SDavid Green; CHECK-NESTED-NEXT: [[TMP0:%.*]] = call i1 @llvm.loop.decrement.i32(i32 1) 50444c1a568SDavid Green; CHECK-NESTED-NEXT: br i1 [[TMP0]], label [[WHILE_BODY]], label [[WHILE_END]] 50544c1a568SDavid Green; CHECK-NESTED: while.end: 50644c1a568SDavid Green; CHECK-NESTED-NEXT: ret void 50744c1a568SDavid Green; 50844c1a568SDavid Green; CHECK-GUARD-LABEL: @while_eq( 50944c1a568SDavid Green; CHECK-GUARD-NEXT: entry: 51044c1a568SDavid Green; CHECK-GUARD-NEXT: [[CMP:%.*]] = icmp eq i32 [[N:%.*]], 0 51144c1a568SDavid Green; CHECK-GUARD-NEXT: [[TMP0:%.*]] = call i1 @llvm.test.set.loop.iterations.i32(i32 [[N]]) 51244c1a568SDavid Green; CHECK-GUARD-NEXT: br i1 [[TMP0]], label [[WHILE_BODY_PREHEADER:%.*]], label [[WHILE_END:%.*]] 51344c1a568SDavid Green; CHECK-GUARD: while.body.preheader: 51444c1a568SDavid Green; CHECK-GUARD-NEXT: br label [[WHILE_BODY:%.*]] 51544c1a568SDavid Green; CHECK-GUARD: while.body: 51644c1a568SDavid Green; CHECK-GUARD-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ] 517d17f4f26SMatt Arsenault; CHECK-GUARD-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 518d17f4f26SMatt Arsenault; CHECK-GUARD-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 51944c1a568SDavid Green; CHECK-GUARD-NEXT: [[INC]] = add nuw i32 [[I_ADDR_05]], 1 52044c1a568SDavid Green; CHECK-GUARD-NEXT: [[TMP1:%.*]] = call i1 @llvm.loop.decrement.i32(i32 1) 52144c1a568SDavid Green; CHECK-GUARD-NEXT: br i1 [[TMP1]], label [[WHILE_BODY]], label [[WHILE_END]] 52244c1a568SDavid Green; CHECK-GUARD: while.end: 52344c1a568SDavid Green; CHECK-GUARD-NEXT: ret void 52444c1a568SDavid Green; 52544c1a568SDavid Green; CHECK-PHIGUARD-LABEL: @while_eq( 52644c1a568SDavid Green; CHECK-PHIGUARD-NEXT: entry: 52744c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[CMP:%.*]] = icmp eq i32 [[N:%.*]], 0 528fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP0:%.*]] = call { i32, i1 } @llvm.test.start.loop.iterations.i32(i32 [[N]]) 529fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1 530fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP2:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0 531fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: br i1 [[TMP1]], label [[WHILE_BODY_PREHEADER:%.*]], label [[WHILE_END:%.*]] 53244c1a568SDavid Green; CHECK-PHIGUARD: while.body.preheader: 53344c1a568SDavid Green; CHECK-PHIGUARD-NEXT: br label [[WHILE_BODY:%.*]] 53444c1a568SDavid Green; CHECK-PHIGUARD: while.body: 53544c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ] 536fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP3:%.*]] = phi i32 [ [[TMP2]], [[WHILE_BODY_PREHEADER]] ], [ [[TMP4:%.*]], [[WHILE_BODY]] ] 537d17f4f26SMatt Arsenault; CHECK-PHIGUARD-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 538d17f4f26SMatt Arsenault; CHECK-PHIGUARD-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 53944c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[INC]] = add nuw i32 [[I_ADDR_05]], 1 540fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP4]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[TMP3]], i32 1) 541fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 0 542fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: br i1 [[TMP5]], label [[WHILE_BODY]], label [[WHILE_END]] 54344c1a568SDavid Green; CHECK-PHIGUARD: while.end: 54444c1a568SDavid Green; CHECK-PHIGUARD-NEXT: ret void 54544c1a568SDavid Green; 5469a92be1bSSam Parkerentry: 5479a92be1bSSam Parker %cmp = icmp eq i32 %N, 0 5489a92be1bSSam Parker br i1 %cmp, label %while.end, label %while.body 5499a92be1bSSam Parker 5509a92be1bSSam Parkerwhile.body: 5519a92be1bSSam Parker %i.addr.05 = phi i32 [ %inc, %while.body ], [ 0, %entry ] 552d17f4f26SMatt Arsenault %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.addr.05 553d17f4f26SMatt Arsenault store i32 %i.addr.05, ptr %arrayidx, align 4 5549a92be1bSSam Parker %inc = add nuw i32 %i.addr.05, 1 5559a92be1bSSam Parker %exitcond = icmp eq i32 %inc, %N 5569a92be1bSSam Parker br i1 %exitcond, label %while.end, label %while.body 5579a92be1bSSam Parker 5589a92be1bSSam Parkerwhile.end: 5599a92be1bSSam Parker ret void 5609a92be1bSSam Parker} 5619a92be1bSSam Parker 562d17f4f26SMatt Arsenaultdefine void @while_preheader_eq(i32 %N, ptr nocapture %A) { 56344c1a568SDavid Green; CHECK-DEC-LABEL: @while_preheader_eq( 56444c1a568SDavid Green; CHECK-DEC-NEXT: entry: 56544c1a568SDavid Green; CHECK-DEC-NEXT: br label [[PREHEADER:%.*]] 56644c1a568SDavid Green; CHECK-DEC: preheader: 56744c1a568SDavid Green; CHECK-DEC-NEXT: [[CMP:%.*]] = icmp eq i32 [[N:%.*]], 0 56844c1a568SDavid Green; CHECK-DEC-NEXT: br i1 [[CMP]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]] 56944c1a568SDavid Green; CHECK-DEC: while.body.preheader: 57044c1a568SDavid Green; CHECK-DEC-NEXT: call void @llvm.set.loop.iterations.i32(i32 [[N]]) 57144c1a568SDavid Green; CHECK-DEC-NEXT: br label [[WHILE_BODY:%.*]] 57244c1a568SDavid Green; CHECK-DEC: while.body: 57344c1a568SDavid Green; CHECK-DEC-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ] 574d17f4f26SMatt Arsenault; CHECK-DEC-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 575d17f4f26SMatt Arsenault; CHECK-DEC-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 57644c1a568SDavid Green; CHECK-DEC-NEXT: [[INC]] = add nuw i32 [[I_ADDR_05]], 1 57744c1a568SDavid Green; CHECK-DEC-NEXT: [[TMP0:%.*]] = call i1 @llvm.loop.decrement.i32(i32 1) 57844c1a568SDavid Green; CHECK-DEC-NEXT: br i1 [[TMP0]], label [[WHILE_BODY]], label [[WHILE_END]] 57944c1a568SDavid Green; CHECK-DEC: while.end: 58044c1a568SDavid Green; CHECK-DEC-NEXT: ret void 58144c1a568SDavid Green; 58244c1a568SDavid Green; CHECK-PHI-LABEL: @while_preheader_eq( 58344c1a568SDavid Green; CHECK-PHI-NEXT: entry: 58444c1a568SDavid Green; CHECK-PHI-NEXT: br label [[PREHEADER:%.*]] 58544c1a568SDavid Green; CHECK-PHI: preheader: 58644c1a568SDavid Green; CHECK-PHI-NEXT: [[CMP:%.*]] = icmp eq i32 [[N:%.*]], 0 58744c1a568SDavid Green; CHECK-PHI-NEXT: br i1 [[CMP]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]] 58844c1a568SDavid Green; CHECK-PHI: while.body.preheader: 589b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP0:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[N]]) 59044c1a568SDavid Green; CHECK-PHI-NEXT: br label [[WHILE_BODY:%.*]] 59144c1a568SDavid Green; CHECK-PHI: while.body: 59244c1a568SDavid Green; CHECK-PHI-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ] 593b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP1:%.*]] = phi i32 [ [[TMP0]], [[WHILE_BODY_PREHEADER]] ], [ [[TMP2:%.*]], [[WHILE_BODY]] ] 594d17f4f26SMatt Arsenault; CHECK-PHI-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 595d17f4f26SMatt Arsenault; CHECK-PHI-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 59644c1a568SDavid Green; CHECK-PHI-NEXT: [[INC]] = add nuw i32 [[I_ADDR_05]], 1 597b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP2]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[TMP1]], i32 1) 598b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0 599b2ac9681SDavid Green; CHECK-PHI-NEXT: br i1 [[TMP3]], label [[WHILE_BODY]], label [[WHILE_END]] 60044c1a568SDavid Green; CHECK-PHI: while.end: 60144c1a568SDavid Green; CHECK-PHI-NEXT: ret void 60244c1a568SDavid Green; 60344c1a568SDavid Green; CHECK-NESTED-LABEL: @while_preheader_eq( 60444c1a568SDavid Green; CHECK-NESTED-NEXT: entry: 60544c1a568SDavid Green; CHECK-NESTED-NEXT: br label [[PREHEADER:%.*]] 60644c1a568SDavid Green; CHECK-NESTED: preheader: 60744c1a568SDavid Green; CHECK-NESTED-NEXT: [[CMP:%.*]] = icmp eq i32 [[N:%.*]], 0 60844c1a568SDavid Green; CHECK-NESTED-NEXT: br i1 [[CMP]], label [[WHILE_END:%.*]], label [[WHILE_BODY_PREHEADER:%.*]] 60944c1a568SDavid Green; CHECK-NESTED: while.body.preheader: 61044c1a568SDavid Green; CHECK-NESTED-NEXT: call void @llvm.set.loop.iterations.i32(i32 [[N]]) 61144c1a568SDavid Green; CHECK-NESTED-NEXT: br label [[WHILE_BODY:%.*]] 61244c1a568SDavid Green; CHECK-NESTED: while.body: 61344c1a568SDavid Green; CHECK-NESTED-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ] 614d17f4f26SMatt Arsenault; CHECK-NESTED-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 615d17f4f26SMatt Arsenault; CHECK-NESTED-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 61644c1a568SDavid Green; CHECK-NESTED-NEXT: [[INC]] = add nuw i32 [[I_ADDR_05]], 1 61744c1a568SDavid Green; CHECK-NESTED-NEXT: [[TMP0:%.*]] = call i1 @llvm.loop.decrement.i32(i32 1) 61844c1a568SDavid Green; CHECK-NESTED-NEXT: br i1 [[TMP0]], label [[WHILE_BODY]], label [[WHILE_END]] 61944c1a568SDavid Green; CHECK-NESTED: while.end: 62044c1a568SDavid Green; CHECK-NESTED-NEXT: ret void 62144c1a568SDavid Green; 62244c1a568SDavid Green; CHECK-GUARD-LABEL: @while_preheader_eq( 62344c1a568SDavid Green; CHECK-GUARD-NEXT: entry: 62444c1a568SDavid Green; CHECK-GUARD-NEXT: br label [[PREHEADER:%.*]] 62544c1a568SDavid Green; CHECK-GUARD: preheader: 62644c1a568SDavid Green; CHECK-GUARD-NEXT: [[CMP:%.*]] = icmp eq i32 [[N:%.*]], 0 62744c1a568SDavid Green; CHECK-GUARD-NEXT: [[TMP0:%.*]] = call i1 @llvm.test.set.loop.iterations.i32(i32 [[N]]) 62844c1a568SDavid Green; CHECK-GUARD-NEXT: br i1 [[TMP0]], label [[WHILE_BODY_PREHEADER:%.*]], label [[WHILE_END:%.*]] 62944c1a568SDavid Green; CHECK-GUARD: while.body.preheader: 63044c1a568SDavid Green; CHECK-GUARD-NEXT: br label [[WHILE_BODY:%.*]] 63144c1a568SDavid Green; CHECK-GUARD: while.body: 63244c1a568SDavid Green; CHECK-GUARD-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ] 633d17f4f26SMatt Arsenault; CHECK-GUARD-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 634d17f4f26SMatt Arsenault; CHECK-GUARD-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 63544c1a568SDavid Green; CHECK-GUARD-NEXT: [[INC]] = add nuw i32 [[I_ADDR_05]], 1 63644c1a568SDavid Green; CHECK-GUARD-NEXT: [[TMP1:%.*]] = call i1 @llvm.loop.decrement.i32(i32 1) 63744c1a568SDavid Green; CHECK-GUARD-NEXT: br i1 [[TMP1]], label [[WHILE_BODY]], label [[WHILE_END]] 63844c1a568SDavid Green; CHECK-GUARD: while.end: 63944c1a568SDavid Green; CHECK-GUARD-NEXT: ret void 64044c1a568SDavid Green; 64144c1a568SDavid Green; CHECK-PHIGUARD-LABEL: @while_preheader_eq( 64244c1a568SDavid Green; CHECK-PHIGUARD-NEXT: entry: 64344c1a568SDavid Green; CHECK-PHIGUARD-NEXT: br label [[PREHEADER:%.*]] 64444c1a568SDavid Green; CHECK-PHIGUARD: preheader: 64544c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[CMP:%.*]] = icmp eq i32 [[N:%.*]], 0 646fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP0:%.*]] = call { i32, i1 } @llvm.test.start.loop.iterations.i32(i32 [[N]]) 647fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1 648fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP2:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0 649fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: br i1 [[TMP1]], label [[WHILE_BODY_PREHEADER:%.*]], label [[WHILE_END:%.*]] 65044c1a568SDavid Green; CHECK-PHIGUARD: while.body.preheader: 65144c1a568SDavid Green; CHECK-PHIGUARD-NEXT: br label [[WHILE_BODY:%.*]] 65244c1a568SDavid Green; CHECK-PHIGUARD: while.body: 65344c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[I_ADDR_05:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY]] ], [ 0, [[WHILE_BODY_PREHEADER]] ] 654fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP3:%.*]] = phi i32 [ [[TMP2]], [[WHILE_BODY_PREHEADER]] ], [ [[TMP4:%.*]], [[WHILE_BODY]] ] 655d17f4f26SMatt Arsenault; CHECK-PHIGUARD-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[I_ADDR_05]] 656d17f4f26SMatt Arsenault; CHECK-PHIGUARD-NEXT: store i32 [[I_ADDR_05]], ptr [[ARRAYIDX]], align 4 65744c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[INC]] = add nuw i32 [[I_ADDR_05]], 1 658fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP4]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[TMP3]], i32 1) 659fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP5:%.*]] = icmp ne i32 [[TMP4]], 0 660fad70c30SDavid Green; CHECK-PHIGUARD-NEXT: br i1 [[TMP5]], label [[WHILE_BODY]], label [[WHILE_END]] 66144c1a568SDavid Green; CHECK-PHIGUARD: while.end: 66244c1a568SDavid Green; CHECK-PHIGUARD-NEXT: ret void 66344c1a568SDavid Green; 6649a92be1bSSam Parkerentry: 6659a92be1bSSam Parker br label %preheader 6669a92be1bSSam Parker 6679a92be1bSSam Parkerpreheader: 6689a92be1bSSam Parker %cmp = icmp eq i32 %N, 0 6699a92be1bSSam Parker br i1 %cmp, label %while.end, label %while.body 6709a92be1bSSam Parker 6719a92be1bSSam Parkerwhile.body: 6729a92be1bSSam Parker %i.addr.05 = phi i32 [ %inc, %while.body ], [ 0, %preheader ] 673d17f4f26SMatt Arsenault %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.addr.05 674d17f4f26SMatt Arsenault store i32 %i.addr.05, ptr %arrayidx, align 4 6759a92be1bSSam Parker %inc = add nuw i32 %i.addr.05, 1 6769a92be1bSSam Parker %exitcond = icmp eq i32 %inc, %N 6779a92be1bSSam Parker br i1 %exitcond, label %while.end, label %while.body 6789a92be1bSSam Parker 6799a92be1bSSam Parkerwhile.end: 6809a92be1bSSam Parker ret void 6819a92be1bSSam Parker} 6829a92be1bSSam Parker 683d17f4f26SMatt Arsenaultdefine void @nested(ptr nocapture %A, i32 %N) { 68444c1a568SDavid Green; CHECK-DEC-LABEL: @nested( 68544c1a568SDavid Green; CHECK-DEC-NEXT: entry: 68644c1a568SDavid Green; CHECK-DEC-NEXT: [[CMP20:%.*]] = icmp eq i32 [[N:%.*]], 0 68744c1a568SDavid Green; CHECK-DEC-NEXT: br i1 [[CMP20]], label [[WHILE_END7:%.*]], label [[WHILE_COND1_PREHEADER_US:%.*]] 68844c1a568SDavid Green; CHECK-DEC: while.cond1.preheader.us: 68944c1a568SDavid Green; CHECK-DEC-NEXT: [[I_021_US:%.*]] = phi i32 [ [[INC6_US:%.*]], [[WHILE_COND1_WHILE_END_CRIT_EDGE_US:%.*]] ], [ 0, [[ENTRY:%.*]] ] 69044c1a568SDavid Green; CHECK-DEC-NEXT: [[MUL_US:%.*]] = mul i32 [[I_021_US]], [[N]] 69144c1a568SDavid Green; CHECK-DEC-NEXT: call void @llvm.set.loop.iterations.i32(i32 [[N]]) 69244c1a568SDavid Green; CHECK-DEC-NEXT: br label [[WHILE_BODY3_US:%.*]] 69344c1a568SDavid Green; CHECK-DEC: while.body3.us: 69444c1a568SDavid Green; CHECK-DEC-NEXT: [[J_019_US:%.*]] = phi i32 [ 0, [[WHILE_COND1_PREHEADER_US]] ], [ [[INC_US:%.*]], [[WHILE_BODY3_US]] ] 69544c1a568SDavid Green; CHECK-DEC-NEXT: [[ADD_US:%.*]] = add i32 [[J_019_US]], [[MUL_US]] 696d17f4f26SMatt Arsenault; CHECK-DEC-NEXT: [[ARRAYIDX_US:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[ADD_US]] 697d17f4f26SMatt Arsenault; CHECK-DEC-NEXT: store i32 [[ADD_US]], ptr [[ARRAYIDX_US]], align 4 69844c1a568SDavid Green; CHECK-DEC-NEXT: [[INC_US]] = add nuw i32 [[J_019_US]], 1 69944c1a568SDavid Green; CHECK-DEC-NEXT: [[TMP0:%.*]] = call i1 @llvm.loop.decrement.i32(i32 1) 70044c1a568SDavid Green; CHECK-DEC-NEXT: br i1 [[TMP0]], label [[WHILE_BODY3_US]], label [[WHILE_COND1_WHILE_END_CRIT_EDGE_US]] 70144c1a568SDavid Green; CHECK-DEC: while.cond1.while.end_crit_edge.us: 70244c1a568SDavid Green; CHECK-DEC-NEXT: [[INC6_US]] = add nuw i32 [[I_021_US]], 1 70344c1a568SDavid Green; CHECK-DEC-NEXT: [[EXITCOND23:%.*]] = icmp eq i32 [[INC6_US]], [[N]] 70444c1a568SDavid Green; CHECK-DEC-NEXT: br i1 [[EXITCOND23]], label [[WHILE_END7]], label [[WHILE_COND1_PREHEADER_US]] 70544c1a568SDavid Green; CHECK-DEC: while.end7: 70644c1a568SDavid Green; CHECK-DEC-NEXT: ret void 70744c1a568SDavid Green; 70844c1a568SDavid Green; CHECK-PHI-LABEL: @nested( 70944c1a568SDavid Green; CHECK-PHI-NEXT: entry: 71044c1a568SDavid Green; CHECK-PHI-NEXT: [[CMP20:%.*]] = icmp eq i32 [[N:%.*]], 0 71144c1a568SDavid Green; CHECK-PHI-NEXT: br i1 [[CMP20]], label [[WHILE_END7:%.*]], label [[WHILE_COND1_PREHEADER_US:%.*]] 71244c1a568SDavid Green; CHECK-PHI: while.cond1.preheader.us: 71344c1a568SDavid Green; CHECK-PHI-NEXT: [[I_021_US:%.*]] = phi i32 [ [[INC6_US:%.*]], [[WHILE_COND1_WHILE_END_CRIT_EDGE_US:%.*]] ], [ 0, [[ENTRY:%.*]] ] 71444c1a568SDavid Green; CHECK-PHI-NEXT: [[MUL_US:%.*]] = mul i32 [[I_021_US]], [[N]] 715b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP0:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[N]]) 71644c1a568SDavid Green; CHECK-PHI-NEXT: br label [[WHILE_BODY3_US:%.*]] 71744c1a568SDavid Green; CHECK-PHI: while.body3.us: 71844c1a568SDavid Green; CHECK-PHI-NEXT: [[J_019_US:%.*]] = phi i32 [ 0, [[WHILE_COND1_PREHEADER_US]] ], [ [[INC_US:%.*]], [[WHILE_BODY3_US]] ] 719b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP1:%.*]] = phi i32 [ [[TMP0]], [[WHILE_COND1_PREHEADER_US]] ], [ [[TMP2:%.*]], [[WHILE_BODY3_US]] ] 72044c1a568SDavid Green; CHECK-PHI-NEXT: [[ADD_US:%.*]] = add i32 [[J_019_US]], [[MUL_US]] 721d17f4f26SMatt Arsenault; CHECK-PHI-NEXT: [[ARRAYIDX_US:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[ADD_US]] 722d17f4f26SMatt Arsenault; CHECK-PHI-NEXT: store i32 [[ADD_US]], ptr [[ARRAYIDX_US]], align 4 72344c1a568SDavid Green; CHECK-PHI-NEXT: [[INC_US]] = add nuw i32 [[J_019_US]], 1 724b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP2]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[TMP1]], i32 1) 725b2ac9681SDavid Green; CHECK-PHI-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0 726b2ac9681SDavid Green; CHECK-PHI-NEXT: br i1 [[TMP3]], label [[WHILE_BODY3_US]], label [[WHILE_COND1_WHILE_END_CRIT_EDGE_US]] 72744c1a568SDavid Green; CHECK-PHI: while.cond1.while.end_crit_edge.us: 72844c1a568SDavid Green; CHECK-PHI-NEXT: [[INC6_US]] = add nuw i32 [[I_021_US]], 1 72944c1a568SDavid Green; CHECK-PHI-NEXT: [[EXITCOND23:%.*]] = icmp eq i32 [[INC6_US]], [[N]] 73044c1a568SDavid Green; CHECK-PHI-NEXT: br i1 [[EXITCOND23]], label [[WHILE_END7]], label [[WHILE_COND1_PREHEADER_US]] 73144c1a568SDavid Green; CHECK-PHI: while.end7: 73244c1a568SDavid Green; CHECK-PHI-NEXT: ret void 73344c1a568SDavid Green; 73444c1a568SDavid Green; CHECK-NESTED-LABEL: @nested( 73544c1a568SDavid Green; CHECK-NESTED-NEXT: entry: 73644c1a568SDavid Green; CHECK-NESTED-NEXT: [[CMP20:%.*]] = icmp eq i32 [[N:%.*]], 0 73744c1a568SDavid Green; CHECK-NESTED-NEXT: br i1 [[CMP20]], label [[WHILE_END7:%.*]], label [[WHILE_COND1_PREHEADER_US_PREHEADER:%.*]] 73844c1a568SDavid Green; CHECK-NESTED: while.cond1.preheader.us.preheader: 73944c1a568SDavid Green; CHECK-NESTED-NEXT: call void @llvm.set.loop.iterations.i32(i32 [[N]]) 74044c1a568SDavid Green; CHECK-NESTED-NEXT: br label [[WHILE_COND1_PREHEADER_US:%.*]] 74144c1a568SDavid Green; CHECK-NESTED: while.cond1.preheader.us: 74244c1a568SDavid Green; CHECK-NESTED-NEXT: [[I_021_US:%.*]] = phi i32 [ [[INC6_US:%.*]], [[WHILE_COND1_WHILE_END_CRIT_EDGE_US:%.*]] ], [ 0, [[WHILE_COND1_PREHEADER_US_PREHEADER]] ] 74344c1a568SDavid Green; CHECK-NESTED-NEXT: [[MUL_US:%.*]] = mul i32 [[I_021_US]], [[N]] 74444c1a568SDavid Green; CHECK-NESTED-NEXT: call void @llvm.set.loop.iterations.i32(i32 [[N]]) 74544c1a568SDavid Green; CHECK-NESTED-NEXT: br label [[WHILE_BODY3_US:%.*]] 74644c1a568SDavid Green; CHECK-NESTED: while.body3.us: 74744c1a568SDavid Green; CHECK-NESTED-NEXT: [[J_019_US:%.*]] = phi i32 [ 0, [[WHILE_COND1_PREHEADER_US]] ], [ [[INC_US:%.*]], [[WHILE_BODY3_US]] ] 74844c1a568SDavid Green; CHECK-NESTED-NEXT: [[ADD_US:%.*]] = add i32 [[J_019_US]], [[MUL_US]] 749d17f4f26SMatt Arsenault; CHECK-NESTED-NEXT: [[ARRAYIDX_US:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[ADD_US]] 750d17f4f26SMatt Arsenault; CHECK-NESTED-NEXT: store i32 [[ADD_US]], ptr [[ARRAYIDX_US]], align 4 75144c1a568SDavid Green; CHECK-NESTED-NEXT: [[INC_US]] = add nuw i32 [[J_019_US]], 1 75244c1a568SDavid Green; CHECK-NESTED-NEXT: [[TMP0:%.*]] = call i1 @llvm.loop.decrement.i32(i32 1) 75344c1a568SDavid Green; CHECK-NESTED-NEXT: br i1 [[TMP0]], label [[WHILE_BODY3_US]], label [[WHILE_COND1_WHILE_END_CRIT_EDGE_US]] 75444c1a568SDavid Green; CHECK-NESTED: while.cond1.while.end_crit_edge.us: 75544c1a568SDavid Green; CHECK-NESTED-NEXT: [[INC6_US]] = add nuw i32 [[I_021_US]], 1 75644c1a568SDavid Green; CHECK-NESTED-NEXT: [[TMP1:%.*]] = call i1 @llvm.loop.decrement.i32(i32 1) 75744c1a568SDavid Green; CHECK-NESTED-NEXT: br i1 [[TMP1]], label [[WHILE_COND1_PREHEADER_US]], label [[WHILE_END7]] 75844c1a568SDavid Green; CHECK-NESTED: while.end7: 75944c1a568SDavid Green; CHECK-NESTED-NEXT: ret void 76044c1a568SDavid Green; 76144c1a568SDavid Green; CHECK-GUARD-LABEL: @nested( 76244c1a568SDavid Green; CHECK-GUARD-NEXT: entry: 76344c1a568SDavid Green; CHECK-GUARD-NEXT: [[CMP20:%.*]] = icmp eq i32 [[N:%.*]], 0 76444c1a568SDavid Green; CHECK-GUARD-NEXT: br i1 [[CMP20]], label [[WHILE_END7:%.*]], label [[WHILE_COND1_PREHEADER_US:%.*]] 76544c1a568SDavid Green; CHECK-GUARD: while.cond1.preheader.us: 76644c1a568SDavid Green; CHECK-GUARD-NEXT: [[I_021_US:%.*]] = phi i32 [ [[INC6_US:%.*]], [[WHILE_COND1_WHILE_END_CRIT_EDGE_US:%.*]] ], [ 0, [[ENTRY:%.*]] ] 76744c1a568SDavid Green; CHECK-GUARD-NEXT: [[MUL_US:%.*]] = mul i32 [[I_021_US]], [[N]] 76844c1a568SDavid Green; CHECK-GUARD-NEXT: call void @llvm.set.loop.iterations.i32(i32 [[N]]) 76944c1a568SDavid Green; CHECK-GUARD-NEXT: br label [[WHILE_BODY3_US:%.*]] 77044c1a568SDavid Green; CHECK-GUARD: while.body3.us: 77144c1a568SDavid Green; CHECK-GUARD-NEXT: [[J_019_US:%.*]] = phi i32 [ 0, [[WHILE_COND1_PREHEADER_US]] ], [ [[INC_US:%.*]], [[WHILE_BODY3_US]] ] 77244c1a568SDavid Green; CHECK-GUARD-NEXT: [[ADD_US:%.*]] = add i32 [[J_019_US]], [[MUL_US]] 773d17f4f26SMatt Arsenault; CHECK-GUARD-NEXT: [[ARRAYIDX_US:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[ADD_US]] 774d17f4f26SMatt Arsenault; CHECK-GUARD-NEXT: store i32 [[ADD_US]], ptr [[ARRAYIDX_US]], align 4 77544c1a568SDavid Green; CHECK-GUARD-NEXT: [[INC_US]] = add nuw i32 [[J_019_US]], 1 77644c1a568SDavid Green; CHECK-GUARD-NEXT: [[TMP0:%.*]] = call i1 @llvm.loop.decrement.i32(i32 1) 77744c1a568SDavid Green; CHECK-GUARD-NEXT: br i1 [[TMP0]], label [[WHILE_BODY3_US]], label [[WHILE_COND1_WHILE_END_CRIT_EDGE_US]] 77844c1a568SDavid Green; CHECK-GUARD: while.cond1.while.end_crit_edge.us: 77944c1a568SDavid Green; CHECK-GUARD-NEXT: [[INC6_US]] = add nuw i32 [[I_021_US]], 1 78044c1a568SDavid Green; CHECK-GUARD-NEXT: [[EXITCOND23:%.*]] = icmp eq i32 [[INC6_US]], [[N]] 78144c1a568SDavid Green; CHECK-GUARD-NEXT: br i1 [[EXITCOND23]], label [[WHILE_END7]], label [[WHILE_COND1_PREHEADER_US]] 78244c1a568SDavid Green; CHECK-GUARD: while.end7: 78344c1a568SDavid Green; CHECK-GUARD-NEXT: ret void 78444c1a568SDavid Green; 78544c1a568SDavid Green; CHECK-PHIGUARD-LABEL: @nested( 78644c1a568SDavid Green; CHECK-PHIGUARD-NEXT: entry: 78744c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[CMP20:%.*]] = icmp eq i32 [[N:%.*]], 0 78844c1a568SDavid Green; CHECK-PHIGUARD-NEXT: br i1 [[CMP20]], label [[WHILE_END7:%.*]], label [[WHILE_COND1_PREHEADER_US:%.*]] 78944c1a568SDavid Green; CHECK-PHIGUARD: while.cond1.preheader.us: 79044c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[I_021_US:%.*]] = phi i32 [ [[INC6_US:%.*]], [[WHILE_COND1_WHILE_END_CRIT_EDGE_US:%.*]] ], [ 0, [[ENTRY:%.*]] ] 79144c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[MUL_US:%.*]] = mul i32 [[I_021_US]], [[N]] 792b2ac9681SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP0:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[N]]) 79344c1a568SDavid Green; CHECK-PHIGUARD-NEXT: br label [[WHILE_BODY3_US:%.*]] 79444c1a568SDavid Green; CHECK-PHIGUARD: while.body3.us: 79544c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[J_019_US:%.*]] = phi i32 [ 0, [[WHILE_COND1_PREHEADER_US]] ], [ [[INC_US:%.*]], [[WHILE_BODY3_US]] ] 796b2ac9681SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP1:%.*]] = phi i32 [ [[TMP0]], [[WHILE_COND1_PREHEADER_US]] ], [ [[TMP2:%.*]], [[WHILE_BODY3_US]] ] 79744c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[ADD_US:%.*]] = add i32 [[J_019_US]], [[MUL_US]] 798d17f4f26SMatt Arsenault; CHECK-PHIGUARD-NEXT: [[ARRAYIDX_US:%.*]] = getelementptr inbounds i32, ptr [[A:%.*]], i32 [[ADD_US]] 799d17f4f26SMatt Arsenault; CHECK-PHIGUARD-NEXT: store i32 [[ADD_US]], ptr [[ARRAYIDX_US]], align 4 80044c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[INC_US]] = add nuw i32 [[J_019_US]], 1 801b2ac9681SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP2]] = call i32 @llvm.loop.decrement.reg.i32(i32 [[TMP1]], i32 1) 802b2ac9681SDavid Green; CHECK-PHIGUARD-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP2]], 0 803b2ac9681SDavid Green; CHECK-PHIGUARD-NEXT: br i1 [[TMP3]], label [[WHILE_BODY3_US]], label [[WHILE_COND1_WHILE_END_CRIT_EDGE_US]] 80444c1a568SDavid Green; CHECK-PHIGUARD: while.cond1.while.end_crit_edge.us: 80544c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[INC6_US]] = add nuw i32 [[I_021_US]], 1 80644c1a568SDavid Green; CHECK-PHIGUARD-NEXT: [[EXITCOND23:%.*]] = icmp eq i32 [[INC6_US]], [[N]] 80744c1a568SDavid Green; CHECK-PHIGUARD-NEXT: br i1 [[EXITCOND23]], label [[WHILE_END7]], label [[WHILE_COND1_PREHEADER_US]] 80844c1a568SDavid Green; CHECK-PHIGUARD: while.end7: 80944c1a568SDavid Green; CHECK-PHIGUARD-NEXT: ret void 81044c1a568SDavid Green; 811c5ef502eSSam Parkerentry: 812c5ef502eSSam Parker %cmp20 = icmp eq i32 %N, 0 813c5ef502eSSam Parker br i1 %cmp20, label %while.end7, label %while.cond1.preheader.us 814c5ef502eSSam Parker 815c5ef502eSSam Parkerwhile.cond1.preheader.us: 816c5ef502eSSam Parker %i.021.us = phi i32 [ %inc6.us, %while.cond1.while.end_crit_edge.us ], [ 0, %entry ] 817c5ef502eSSam Parker %mul.us = mul i32 %i.021.us, %N 818c5ef502eSSam Parker br label %while.body3.us 819c5ef502eSSam Parker 820c5ef502eSSam Parkerwhile.body3.us: 821c5ef502eSSam Parker %j.019.us = phi i32 [ 0, %while.cond1.preheader.us ], [ %inc.us, %while.body3.us ] 822c5ef502eSSam Parker %add.us = add i32 %j.019.us, %mul.us 823d17f4f26SMatt Arsenault %arrayidx.us = getelementptr inbounds i32, ptr %A, i32 %add.us 824d17f4f26SMatt Arsenault store i32 %add.us, ptr %arrayidx.us, align 4 825c5ef502eSSam Parker %inc.us = add nuw i32 %j.019.us, 1 826c5ef502eSSam Parker %exitcond = icmp eq i32 %inc.us, %N 827c5ef502eSSam Parker br i1 %exitcond, label %while.cond1.while.end_crit_edge.us, label %while.body3.us 828c5ef502eSSam Parker 829c5ef502eSSam Parkerwhile.cond1.while.end_crit_edge.us: 830c5ef502eSSam Parker %inc6.us = add nuw i32 %i.021.us, 1 831c5ef502eSSam Parker %exitcond23 = icmp eq i32 %inc6.us, %N 832c5ef502eSSam Parker br i1 %exitcond23, label %while.end7, label %while.cond1.preheader.us 833c5ef502eSSam Parker 834c5ef502eSSam Parkerwhile.end7: 835c5ef502eSSam Parker ret void 836c5ef502eSSam Parker} 837