xref: /llvm-project/llvm/test/Transforms/LoopFlatten/loop-flatten-simplify-cfg.ll (revision 055fb7795aa219a3d274d280ec9129784f169f56)
11124ad2fSStelios Ioannou;; This test was created to ensure that the LoopFlatten pass can
21124ad2fSStelios Ioannou;; operate on loops that are not in simplified form before applying the pass.
31124ad2fSStelios Ioannou
472482c51SRoman Lebedev; RUN: opt < %s -S -passes='loop(loop-flatten),simplifycfg,verify' -verify-loop-info -verify-dom-info -verify-scev | FileCheck %s
51124ad2fSStelios Ioannou
61124ad2fSStelios Ioannoutarget datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
71124ad2fSStelios Ioannou
8*055fb779SNikita Popovdefine void @test(i64 %N, ptr %A, i64 %val) {
91124ad2fSStelios Ioannou; CHECK-LABEL: @test(
101124ad2fSStelios Ioannou; CHECK-NEXT:  entry:
111124ad2fSStelios Ioannou; CHECK-NEXT:    [[CMP_NOT:%.*]] = icmp eq i64 [[N:%.*]], 0
121124ad2fSStelios Ioannou; CHECK-NEXT:    br i1 [[CMP_NOT]], label [[FOR_END:%.*]], label [[FOR_COND_PREHEADER_PREHEADER:%.*]]
131124ad2fSStelios Ioannou; CHECK:       for.cond.preheader.preheader:
141124ad2fSStelios Ioannou; CHECK-NEXT:    [[FLATTEN_TRIPCOUNT:%.*]] = mul i64 [[N]], [[N]]
151124ad2fSStelios Ioannou; CHECK-NEXT:    br label [[FOR_COND_PREHEADER:%.*]]
161124ad2fSStelios Ioannou; CHECK:       for.cond.preheader:
171124ad2fSStelios Ioannou; CHECK-NEXT:    [[I:%.*]] = phi i64 [ [[INC6:%.*]], [[FOR_COND_PREHEADER]] ], [ 0, [[FOR_COND_PREHEADER_PREHEADER]] ]
181124ad2fSStelios Ioannou; CHECK-NEXT:    [[MUL:%.*]] = mul i64 [[I]], [[N]]
191124ad2fSStelios Ioannou; CHECK-NEXT:    [[ADD:%.*]] = add i64 0, [[MUL]]
20*055fb779SNikita Popov; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i64, ptr [[A:%.*]], i64 [[I]]
21*055fb779SNikita Popov; CHECK-NEXT:    [[TMP0:%.*]] = load i64, ptr [[ARRAYIDX]], align 4
221124ad2fSStelios Ioannou; CHECK-NEXT:    [[ADD4:%.*]] = add nsw i64 [[TMP0]], [[VAL:%.*]]
23*055fb779SNikita Popov; CHECK-NEXT:    store i64 [[ADD4]], ptr [[ARRAYIDX]], align 4
241124ad2fSStelios Ioannou; CHECK-NEXT:    [[INC:%.*]] = add nuw nsw i64 0, 1
251124ad2fSStelios Ioannou; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i64 [[INC]], [[N]]
261124ad2fSStelios Ioannou; CHECK-NEXT:    [[INC6]] = add nuw nsw i64 [[I]], 1
271124ad2fSStelios Ioannou; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i64 [[INC6]], [[FLATTEN_TRIPCOUNT]]
281124ad2fSStelios Ioannou; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_COND_PREHEADER]], label [[FOR_END]]
291124ad2fSStelios Ioannou; CHECK:       for.end:
301124ad2fSStelios Ioannou; CHECK-NEXT:    ret void
311124ad2fSStelios Ioannou;
321124ad2fSStelios Ioannouentry:
331124ad2fSStelios Ioannou  %cmp.not = icmp eq i64 %N, 0
341124ad2fSStelios Ioannou  br i1 %cmp.not, label %for.end, label %for.cond.preheader
351124ad2fSStelios Ioannou
361124ad2fSStelios Ioannoufor.cond.preheader:
371124ad2fSStelios Ioannou  %i= phi i64 [ %inc6, %for.cond.for.inc_crit_edge ], [ 0, %entry ]
381124ad2fSStelios Ioannou  %mul = mul i64 %i, %N
391124ad2fSStelios Ioannou  br label %for.body
401124ad2fSStelios Ioannou
411124ad2fSStelios Ioannoufor.body:
421124ad2fSStelios Ioannou  %j = phi i64 [ 0, %for.cond.preheader ], [ %inc, %for.body ]
431124ad2fSStelios Ioannou  %add = add i64 %j, %mul
44*055fb779SNikita Popov  %arrayidx = getelementptr inbounds i64, ptr %A, i64 %add
45*055fb779SNikita Popov  %0 = load i64, ptr %arrayidx, align 4
461124ad2fSStelios Ioannou  %add4 = add nsw i64 %0, %val
47*055fb779SNikita Popov  store i64 %add4, ptr %arrayidx, align 4
481124ad2fSStelios Ioannou  %inc = add nuw nsw i64 %j, 1
491124ad2fSStelios Ioannou  %cmp2 = icmp ult i64 %inc, %N
501124ad2fSStelios Ioannou  br i1 %cmp2, label %for.body, label %for.cond.for.inc_crit_edge
511124ad2fSStelios Ioannou
521124ad2fSStelios Ioannoufor.cond.for.inc_crit_edge:
531124ad2fSStelios Ioannou  %inc6 = add nuw nsw i64 %i, 1
541124ad2fSStelios Ioannou  %cmp = icmp ult i64 %inc6, %N
551124ad2fSStelios Ioannou  br i1 %cmp, label %for.cond.preheader, label %for.end
561124ad2fSStelios Ioannou
571124ad2fSStelios Ioannoufor.end:
581124ad2fSStelios Ioannou  ret void
591124ad2fSStelios Ioannou}
60