xref: /llvm-project/llvm/test/Transforms/HardwareLoops/scalar-while.ll (revision 2a58be42396376e8d552158ff801d953c6c1bee3)
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