[win/asan] GetInstructionSize: Fix `83 E4 XX` to return 3. (#119644)
[llvm-project.git] / llvm / test / Transforms / LoopUnrollAndJam / dependencies_visit_order.ll
blobf1a5adf096a553bcd237c961146ca44f8be622bc
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -passes=loop-unroll-and-jam -allow-unroll-and-jam -unroll-and-jam-count=4 < %s -S | FileCheck %s
4 target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
6 define void @test1() {
7 ; CHECK-LABEL: @test1(
8 ; CHECK-NEXT:  bb:
9 ; CHECK-NEXT:    br i1 false, label [[BB1_BB43_CRIT_EDGE_UNR_LCSSA:%.*]], label [[BB_NEW:%.*]]
10 ; CHECK:       bb.new:
11 ; CHECK-NEXT:    br label [[BB5_PREHEADER:%.*]]
12 ; CHECK:       bb5.preheader:
13 ; CHECK-NEXT:    [[I10:%.*]] = phi i16 [ 0, [[BB_NEW]] ], [ [[I42_3:%.*]], [[BB38:%.*]] ]
14 ; CHECK-NEXT:    [[NITER:%.*]] = phi i16 [ 0, [[BB_NEW]] ], [ [[NITER_NEXT_3:%.*]], [[BB38]] ]
15 ; CHECK-NEXT:    [[I4017:%.*]] = zext i16 [[I10]] to i64
16 ; CHECK-NEXT:    [[I13_I:%.*]] = add nuw nsw i64 [[I4017]], 1
17 ; CHECK-NEXT:    [[I42:%.*]] = trunc i64 [[I13_I]] to i16
18 ; CHECK-NEXT:    [[I4017_1:%.*]] = zext i16 [[I42]] to i64
19 ; CHECK-NEXT:    [[I13_I_1:%.*]] = add nuw nsw i64 [[I4017_1]], 1
20 ; CHECK-NEXT:    [[I42_1:%.*]] = trunc i64 [[I13_I_1]] to i16
21 ; CHECK-NEXT:    [[I4017_2:%.*]] = zext i16 [[I42_1]] to i64
22 ; CHECK-NEXT:    [[I13_I_2:%.*]] = add nuw nsw i64 [[I4017_2]], 1
23 ; CHECK-NEXT:    [[I42_2:%.*]] = trunc i64 [[I13_I_2]] to i16
24 ; CHECK-NEXT:    [[I4017_3:%.*]] = zext i16 [[I42_2]] to i64
25 ; CHECK-NEXT:    [[I13_I_3:%.*]] = add nuw nsw i64 [[I4017_3]], 1
26 ; CHECK-NEXT:    [[I42_3]] = trunc i64 [[I13_I_3]] to i16
27 ; CHECK-NEXT:    [[NITER_NEXT_3]] = add nuw i16 [[NITER]], 4
28 ; CHECK-NEXT:    br label [[BB10_PREHEADER:%.*]]
29 ; CHECK:       bb10.preheader:
30 ; CHECK-NEXT:    br i1 true, label [[BB38]], label [[BB10_PREHEADER]]
31 ; CHECK:       bb38:
32 ; CHECK-NEXT:    [[NITER_NCMP_3:%.*]] = icmp eq i16 [[NITER_NEXT_3]], -28
33 ; CHECK-NEXT:    br i1 [[NITER_NCMP_3]], label [[BB1_BB43_CRIT_EDGE_UNR_LCSSA_LOOPEXIT:%.*]], label [[BB5_PREHEADER]], !llvm.loop [[LOOP0:![0-9]+]]
34 ; CHECK:       bb1.bb43_crit_edge.unr-lcssa.loopexit:
35 ; CHECK-NEXT:    [[I10_UNR_PH:%.*]] = phi i16 [ [[I42_3]], [[BB38]] ]
36 ; CHECK-NEXT:    br label [[BB1_BB43_CRIT_EDGE_UNR_LCSSA]]
37 ; CHECK:       bb1.bb43_crit_edge.unr-lcssa:
38 ; CHECK-NEXT:    [[I10_UNR:%.*]] = phi i16 [ 0, [[BB:%.*]] ], [ [[I10_UNR_PH]], [[BB1_BB43_CRIT_EDGE_UNR_LCSSA_LOOPEXIT]] ]
39 ; CHECK-NEXT:    br i1 true, label [[BB5_PREHEADER_EPIL_PREHEADER:%.*]], label [[BB1_BB43_CRIT_EDGE:%.*]]
40 ; CHECK:       bb5.preheader.epil.preheader:
41 ; CHECK-NEXT:    br label [[BB5_PREHEADER_EPIL:%.*]]
42 ; CHECK:       bb5.preheader.epil:
43 ; CHECK-NEXT:    [[I10_EPIL:%.*]] = phi i16 [ [[I10_UNR]], [[BB5_PREHEADER_EPIL_PREHEADER]] ], [ [[I42_EPIL:%.*]], [[BB38_EPIL:%.*]] ]
44 ; CHECK-NEXT:    [[EPIL_ITER:%.*]] = phi i16 [ 0, [[BB5_PREHEADER_EPIL_PREHEADER]] ], [ [[EPIL_ITER_NEXT:%.*]], [[BB38_EPIL]] ]
45 ; CHECK-NEXT:    br label [[BB10_PREHEADER_EPIL:%.*]]
46 ; CHECK:       bb10.preheader.epil:
47 ; CHECK-NEXT:    br i1 true, label [[BB38_EPIL]], label [[BB10_PREHEADER_EPIL]]
48 ; CHECK:       bb38.epil:
49 ; CHECK-NEXT:    [[I4017_EPIL:%.*]] = zext i16 [[I10_EPIL]] to i64
50 ; CHECK-NEXT:    [[I13_I_EPIL:%.*]] = add i64 [[I4017_EPIL]], 1
51 ; CHECK-NEXT:    [[I14_I_EPIL:%.*]] = select i1 true, i64 [[I13_I_EPIL]], i64 [[I4017_EPIL]]
52 ; CHECK-NEXT:    [[I42_EPIL]] = trunc i64 [[I14_I_EPIL]] to i16
53 ; CHECK-NEXT:    [[I3_NOT_EPIL:%.*]] = icmp eq i16 [[I10_EPIL]], -27
54 ; CHECK-NEXT:    [[EPIL_ITER_NEXT]] = add i16 [[EPIL_ITER]], 1
55 ; CHECK-NEXT:    [[EPIL_ITER_CMP:%.*]] = icmp ne i16 [[EPIL_ITER_NEXT]], 2
56 ; CHECK-NEXT:    br i1 [[EPIL_ITER_CMP]], label [[BB5_PREHEADER_EPIL]], label [[BB1_BB43_CRIT_EDGE_EPILOG_LCSSA:%.*]], !llvm.loop [[LOOP2:![0-9]+]]
57 ; CHECK:       bb1.bb43_crit_edge.epilog-lcssa:
58 ; CHECK-NEXT:    br label [[BB1_BB43_CRIT_EDGE]]
59 ; CHECK:       bb1.bb43_crit_edge:
60 ; CHECK-NEXT:    ret void
62 bb:
63   br label %bb5.preheader
65 bb5.preheader:                                    ; preds = %bb38, %bb
66   %i10 = phi i16 [ 0, %bb ], [ %i42, %bb38 ]
67   br label %bb10.preheader
69 bb10.preheader:                                   ; preds = %bb10.preheader, %bb5.preheader
70   br i1 true, label %bb38, label %bb10.preheader
72 bb38:                                             ; preds = %bb10.preheader
73   %i4017 = zext i16 %i10 to i64
74   %i13.i = add i64 %i4017, 1
75   %i14.i = select i1 true, i64 %i13.i, i64 %i4017
76   %i42 = trunc i64 %i14.i to i16
77   %i3.not = icmp eq i16 %i10, -27
78   br i1 %i3.not, label %bb1.bb43_crit_edge, label %bb5.preheader
80 bb1.bb43_crit_edge:                               ; preds = %bb38
81   ret void