Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / Transforms / LoopVectorize / pr59319-loop-access-info-invalidation.ll
blob7411c880012909c0da0350b28e7521de2f922239
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -passes=loop-distribute,loop-vectorize -enable-loop-distribute -force-vector-width=4 -force-vector-interleave=1 -S \
3 ; RUN: %s | FileCheck %s
5 ; This test is to assure LoopAccessInfo invalidation after LoopVectorize
6 ; modifies the IR.
7 define void @reduced(ptr %0, ptr %1, i64 %iv, ptr %2, i64 %iv76, i64 %iv93) {
8 ; CHECK-LABEL: @reduced(
9 ; CHECK-NEXT:  entry:
10 ; CHECK-NEXT:    [[TMP3:%.*]] = add i64 [[IV:%.*]], 1
11 ; CHECK-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[TMP3]], 4
12 ; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_PH:%.*]]
13 ; CHECK:       vector.ph:
14 ; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[TMP3]], 4
15 ; CHECK-NEXT:    [[IND_END:%.*]] = sub i64 [[TMP3]], [[N_MOD_VF]]
16 ; CHECK-NEXT:    br label [[VECTOR_BODY:%.*]]
17 ; CHECK:       vector.body:
18 ; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
19 ; CHECK-NEXT:    [[TMP4:%.*]] = add i64 [[INDEX]], 0
20 ; CHECK-NEXT:    [[TMP5:%.*]] = add i64 [[INDEX]], 1
21 ; CHECK-NEXT:    [[TMP6:%.*]] = add i64 [[INDEX]], 2
22 ; CHECK-NEXT:    [[TMP7:%.*]] = add i64 [[INDEX]], 3
23 ; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
24 ; CHECK-NEXT:    [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[IND_END]]
25 ; CHECK-NEXT:    br i1 [[TMP8]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
26 ; CHECK:       middle.block:
27 ; CHECK-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[TMP3]], [[IND_END]]
28 ; CHECK-NEXT:    [[IND_ESCAPE:%.*]] = sub i64 [[IND_END]], 1
29 ; CHECK-NEXT:    br i1 [[CMP_N]], label [[LOOP_2_PREHEADER:%.*]], label [[SCALAR_PH]]
30 ; CHECK:       scalar.ph:
31 ; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ]
32 ; CHECK-NEXT:    [[BC_RESUME_VAL1:%.*]] = phi i64 [ [[IND_END]], [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY]] ]
33 ; CHECK-NEXT:    br label [[LOOP_1:%.*]]
34 ; CHECK:       loop.1:
35 ; CHECK-NEXT:    [[IV761:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT77:%.*]], [[LOOP_1]] ]
36 ; CHECK-NEXT:    [[IV4:%.*]] = phi i64 [ [[BC_RESUME_VAL1]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_1]] ]
37 ; CHECK-NEXT:    [[IV_NEXT77]] = add i64 [[IV761]], 1
38 ; CHECK-NEXT:    [[ARRAYIDX_I_I50:%.*]] = getelementptr i32, ptr [[TMP0:%.*]], i64 [[IV76:%.*]]
39 ; CHECK-NEXT:    [[IV_NEXT]] = add i64 [[IV4]], 1
40 ; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV4]], [[IV]]
41 ; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label [[LOOP_2_PREHEADER]], label [[LOOP_1]], !llvm.loop [[LOOP3:![0-9]+]]
42 ; CHECK:       loop.2.preheader:
43 ; CHECK-NEXT:    [[IV761_LCSSA:%.*]] = phi i64 [ [[IV761]], [[LOOP_1]] ], [ [[IND_ESCAPE]], [[MIDDLE_BLOCK]] ]
44 ; CHECK-NEXT:    [[MIN_ITERS_CHECK6:%.*]] = icmp ult i64 [[TMP3]], 4
45 ; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK6]], label [[SCALAR_PH5:%.*]], label [[VECTOR_MEMCHECK:%.*]]
46 ; CHECK:       vector.memcheck:
47 ; CHECK-NEXT:    [[SCEVGEP:%.*]] = getelementptr i8, ptr [[TMP1:%.*]], i64 4
48 ; CHECK-NEXT:    [[TMP9:%.*]] = shl i64 [[IV761_LCSSA]], 2
49 ; CHECK-NEXT:    [[SCEVGEP2:%.*]] = getelementptr i8, ptr [[TMP0]], i64 [[TMP9]]
50 ; CHECK-NEXT:    [[TMP10:%.*]] = add i64 [[TMP9]], 4
51 ; CHECK-NEXT:    [[SCEVGEP3:%.*]] = getelementptr i8, ptr [[TMP0]], i64 [[TMP10]]
52 ; CHECK-NEXT:    [[BOUND0:%.*]] = icmp ult ptr [[TMP1]], [[SCEVGEP3]]
53 ; CHECK-NEXT:    [[BOUND1:%.*]] = icmp ult ptr [[SCEVGEP2]], [[SCEVGEP]]
54 ; CHECK-NEXT:    [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]
55 ; CHECK-NEXT:    br i1 [[FOUND_CONFLICT]], label [[SCALAR_PH5]], label [[VECTOR_PH7:%.*]]
56 ; CHECK:       vector.ph7:
57 ; CHECK-NEXT:    [[N_MOD_VF8:%.*]] = urem i64 [[TMP3]], 4
58 ; CHECK-NEXT:    [[N_VEC:%.*]] = sub i64 [[TMP3]], [[N_MOD_VF8]]
59 ; CHECK-NEXT:    br label [[VECTOR_BODY11:%.*]]
60 ; CHECK:       vector.body11:
61 ; CHECK-NEXT:    [[INDEX12:%.*]] = phi i64 [ 0, [[VECTOR_PH7]] ], [ [[INDEX_NEXT13:%.*]], [[VECTOR_BODY11]] ]
62 ; CHECK-NEXT:    store i32 0, ptr [[TMP1]], align 4, !alias.scope !4, !noalias !7
63 ; CHECK-NEXT:    [[INDEX_NEXT13]] = add nuw i64 [[INDEX12]], 4
64 ; CHECK-NEXT:    [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT13]], [[N_VEC]]
65 ; CHECK-NEXT:    br i1 [[TMP11]], label [[MIDDLE_BLOCK4:%.*]], label [[VECTOR_BODY11]], !llvm.loop [[LOOP9:![0-9]+]]
66 ; CHECK:       middle.block4:
67 ; CHECK-NEXT:    [[CMP_N10:%.*]] = icmp eq i64 [[TMP3]], [[N_VEC]]
68 ; CHECK-NEXT:    br i1 [[CMP_N10]], label [[LOOP_3_LR_PH:%.*]], label [[SCALAR_PH5]]
69 ; CHECK:       scalar.ph5:
70 ; CHECK-NEXT:    [[BC_RESUME_VAL9:%.*]] = phi i64 [ [[N_VEC]], [[MIDDLE_BLOCK4]] ], [ 0, [[LOOP_2_PREHEADER]] ], [ 0, [[VECTOR_MEMCHECK]] ]
71 ; CHECK-NEXT:    br label [[LOOP_2:%.*]]
72 ; CHECK:       loop.3.lr.ph:
73 ; CHECK-NEXT:    [[IDXPROM_I_I61:%.*]] = and i64 [[IV761_LCSSA]], 1
74 ; CHECK-NEXT:    [[ARRAYIDX_I_I62:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[IDXPROM_I_I61]]
75 ; CHECK-NEXT:    [[MIN_ITERS_CHECK22:%.*]] = icmp ult i64 [[TMP3]], 4
76 ; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK22]], label [[SCALAR_PH21:%.*]], label [[VECTOR_MEMCHECK14:%.*]]
77 ; CHECK:       vector.memcheck14:
78 ; CHECK-NEXT:    [[SCEVGEP15:%.*]] = getelementptr i8, ptr [[TMP1]], i64 4
79 ; CHECK-NEXT:    [[TMP12:%.*]] = shl nuw nsw i64 [[IDXPROM_I_I61]], 2
80 ; CHECK-NEXT:    [[TMP13:%.*]] = add nuw nsw i64 [[TMP12]], 4
81 ; CHECK-NEXT:    [[SCEVGEP16:%.*]] = getelementptr i8, ptr [[TMP0]], i64 [[TMP13]]
82 ; CHECK-NEXT:    [[BOUND017:%.*]] = icmp ult ptr [[TMP1]], [[SCEVGEP16]]
83 ; CHECK-NEXT:    [[BOUND118:%.*]] = icmp ult ptr [[ARRAYIDX_I_I62]], [[SCEVGEP15]]
84 ; CHECK-NEXT:    [[FOUND_CONFLICT19:%.*]] = and i1 [[BOUND017]], [[BOUND118]]
85 ; CHECK-NEXT:    br i1 [[FOUND_CONFLICT19]], label [[SCALAR_PH21]], label [[VECTOR_PH23:%.*]]
86 ; CHECK:       vector.ph23:
87 ; CHECK-NEXT:    [[N_MOD_VF24:%.*]] = urem i64 [[TMP3]], 4
88 ; CHECK-NEXT:    [[N_VEC25:%.*]] = sub i64 [[TMP3]], [[N_MOD_VF24]]
89 ; CHECK-NEXT:    br label [[VECTOR_BODY28:%.*]]
90 ; CHECK:       vector.body28:
91 ; CHECK-NEXT:    [[INDEX29:%.*]] = phi i64 [ 0, [[VECTOR_PH23]] ], [ [[INDEX_NEXT30:%.*]], [[VECTOR_BODY28]] ]
92 ; CHECK-NEXT:    store i32 0, ptr [[TMP1]], align 4, !alias.scope !10, !noalias !13
93 ; CHECK-NEXT:    [[INDEX_NEXT30]] = add nuw i64 [[INDEX29]], 4
94 ; CHECK-NEXT:    [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT30]], [[N_VEC25]]
95 ; CHECK-NEXT:    br i1 [[TMP14]], label [[MIDDLE_BLOCK20:%.*]], label [[VECTOR_BODY28]], !llvm.loop [[LOOP15:![0-9]+]]
96 ; CHECK:       middle.block20:
97 ; CHECK-NEXT:    [[CMP_N27:%.*]] = icmp eq i64 [[TMP3]], [[N_VEC25]]
98 ; CHECK-NEXT:    br i1 [[CMP_N27]], label [[LOOP_CLEANUP:%.*]], label [[SCALAR_PH21]]
99 ; CHECK:       scalar.ph21:
100 ; CHECK-NEXT:    [[BC_RESUME_VAL26:%.*]] = phi i64 [ [[N_VEC25]], [[MIDDLE_BLOCK20]] ], [ 0, [[LOOP_3_LR_PH]] ], [ 0, [[VECTOR_MEMCHECK14]] ]
101 ; CHECK-NEXT:    br label [[LOOP_3:%.*]]
102 ; CHECK:       loop.2:
103 ; CHECK-NEXT:    [[IV846:%.*]] = phi i64 [ [[IV_NEXT85:%.*]], [[LOOP_2]] ], [ [[BC_RESUME_VAL9]], [[SCALAR_PH5]] ]
104 ; CHECK-NEXT:    [[IV_NEXT87:%.*]] = add i64 0, 0
105 ; CHECK-NEXT:    [[ARRAYIDX_I_I56:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[IV761_LCSSA]]
106 ; CHECK-NEXT:    [[TMP15:%.*]] = load i32, ptr [[ARRAYIDX_I_I56]], align 4
107 ; CHECK-NEXT:    store i32 0, ptr [[TMP1]], align 4
108 ; CHECK-NEXT:    [[IV_NEXT85]] = add i64 [[IV846]], 1
109 ; CHECK-NEXT:    [[EXITCOND92_NOT:%.*]] = icmp eq i64 [[IV846]], [[IV]]
110 ; CHECK-NEXT:    br i1 [[EXITCOND92_NOT]], label [[LOOP_3_LR_PH]], label [[LOOP_2]], !llvm.loop [[LOOP16:![0-9]+]]
111 ; CHECK:       loop.3:
112 ; CHECK-NEXT:    [[IV932:%.*]] = phi i64 [ [[BC_RESUME_VAL26]], [[SCALAR_PH21]] ], [ [[IV_NEXT94:%.*]], [[LOOP_3]] ]
113 ; CHECK-NEXT:    [[TMP16:%.*]] = load i32, ptr [[ARRAYIDX_I_I62]], align 4
114 ; CHECK-NEXT:    [[ARRAYIDX_I_I653:%.*]] = getelementptr i32, ptr [[TMP2:%.*]], i64 [[IV93:%.*]]
115 ; CHECK-NEXT:    store i32 0, ptr [[TMP1]], align 4
116 ; CHECK-NEXT:    [[IV_NEXT94]] = add i64 [[IV932]], 1
117 ; CHECK-NEXT:    [[EXITCOND97_NOT:%.*]] = icmp eq i64 [[IV932]], [[IV]]
118 ; CHECK-NEXT:    br i1 [[EXITCOND97_NOT]], label [[LOOP_CLEANUP]], label [[LOOP_3]], !llvm.loop [[LOOP17:![0-9]+]]
119 ; CHECK:       loop.cleanup:
120 ; CHECK-NEXT:    ret void
122 entry:
123   br label %loop.1
125 loop.1:                                         ; preds = %loop.1, %entry
126   %iv761 = phi i64 [ 0, %entry ], [ %iv.next77, %loop.1 ]
127   %iv4 = phi i64 [ 0, %entry ], [ %iv.next, %loop.1 ]
128   %iv.next77 = add i64 %iv761, 1
129   %arrayidx.i.i50 = getelementptr i32, ptr %0, i64 %iv76
130   %iv.next = add i64 %iv4, 1
131   %exitcond.not = icmp eq i64 %iv4, %iv
132   br i1 %exitcond.not, label %loop.2.preheader, label %loop.1
134 loop.2.preheader:                             ; preds = %loop.1
135   br label %loop.2
137 loop.3.lr.ph:                                 ; preds = %loop.2
138   %idxprom.i.i61 = and i64 %iv761, 1
139   %arrayidx.i.i62 = getelementptr i32, ptr %0, i64 %idxprom.i.i61
140   br label %loop.3
142 loop.2:                                       ; preds = %loop.2, %loop.2.preheader
143   %iv846 = phi i64 [ %iv.next85, %loop.2 ], [ 0, %loop.2.preheader ]
144   %iv.next87 = add i64 0, 0
145   %arrayidx.i.i56 = getelementptr i32, ptr %0, i64 %iv761
146   %3 = load i32, ptr %arrayidx.i.i56, align 4
147   store i32 0, ptr %1, align 4
148   %iv.next85 = add i64 %iv846, 1
149   %exitcond92.not = icmp eq i64 %iv846, %iv
150   br i1 %exitcond92.not, label %loop.3.lr.ph, label %loop.2
152 loop.3:                                       ; preds = %loop.3, %loop.3.lr.ph
153   %iv932 = phi i64 [ 0, %loop.3.lr.ph ], [ %iv.next94, %loop.3 ]
154   %4 = load i32, ptr %arrayidx.i.i62, align 4
155   %arrayidx.i.i653 = getelementptr i32, ptr %2, i64 %iv93
156   store i32 0, ptr %1, align 4
157   %iv.next94 = add i64 %iv932, 1
158   %exitcond97.not = icmp eq i64 %iv932, %iv
159   br i1 %exitcond97.not, label %loop.cleanup, label %loop.3
161 loop.cleanup:                               ; preds = %loop.3
162   ret void