Skip to content

Commit 189ef30

Browse files
committed
Add test case in GVN to catch the inefficiency and minor changes in test
1 parent 1eb1350 commit 189ef30

File tree

2 files changed

+115
-31
lines changed

2 files changed

+115
-31
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -passes=gvn -S %s | FileCheck %s
3+
4+
; This test case is extracted from rnflow (fortran) benchmark in polyhedron benchmark suite.
5+
; The function minlst primarily takes two indices (i.e. range), scans backwards in the range
6+
; and returns the firstIV of the minimum value.
7+
8+
define i32 @minlst(i32 %first_index, i32 %last_index, ptr %array) {
9+
; CHECK-LABEL: define i32 @minlst(
10+
; CHECK-SAME: i32 [[FIRST_INDEX:%.*]], i32 [[LAST_INDEX:%.*]], ptr [[ARRAY:%.*]]) {
11+
; CHECK-NEXT: [[ENTRY:.*]]:
12+
; CHECK-NEXT: [[FIRST_INDEX_SEXT:%.*]] = sext i32 [[FIRST_INDEX]] to i64
13+
; CHECK-NEXT: [[LAST_INDEX_NEG:%.*]] = sub i32 0, [[LAST_INDEX]]
14+
; CHECK-NEXT: [[LAST_INDEX_NEG_SEXT:%.*]] = sext i32 [[LAST_INDEX_NEG]] to i64
15+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[FIRST_INDEX_SEXT]], [[LAST_INDEX_NEG_SEXT]]
16+
; CHECK-NEXT: [[DIFF:%.*]] = sub nsw i64 0, [[ADD]]
17+
; CHECK-NEXT: [[FIRST_PTR:%.*]] = getelementptr i8, ptr [[ARRAY]], i64 -8
18+
; CHECK-NEXT: [[SECOND_PTR:%.*]] = getelementptr i8, ptr [[ARRAY]], i64 -4
19+
; CHECK-NEXT: [[EARLY_EXIT_COND:%.*]] = icmp slt i64 [[ADD]], 0
20+
; CHECK-NEXT: br i1 [[EARLY_EXIT_COND]], label %[[LOOP_PREHEADER:.*]], [[DOT_CRIT_EDGE:label %.*]]
21+
; CHECK: [[LOOP_PREHEADER]]:
22+
; CHECK-NEXT: [[LAST_INDEX_SEXT:%.*]] = sext i32 [[LAST_INDEX]] to i64
23+
; CHECK-NEXT: br label %[[LOOP:.*]]
24+
; CHECK: [[LOOP]]:
25+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ [[LAST_INDEX_SEXT]], %[[LOOP_PREHEADER]] ]
26+
; CHECK-NEXT: [[DEC_IV:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ [[DIFF]], %[[LOOP_PREHEADER]] ]
27+
; CHECK-NEXT: [[INDEX:%.*]] = phi i32 [ [[SELECT:%.*]], %[[LOOP]] ], [ [[LAST_INDEX]], %[[LOOP_PREHEADER]] ]
28+
; CHECK-NEXT: [[IV_NEXT]] = add nsw i64 [[IV]], -1
29+
; CHECK-NEXT: [[LOAD1_PTR:%.*]] = getelementptr float, ptr [[FIRST_PTR]], i64 [[IV]]
30+
; CHECK-NEXT: [[LOAD1:%.*]] = load float, ptr [[LOAD1_PTR]], align 4
31+
; CHECK-NEXT: [[INDEX_SEXT:%.*]] = sext i32 [[INDEX]] to i64
32+
; CHECK-NEXT: [[LOAD2_PTR:%.*]] = getelementptr float, ptr [[SECOND_PTR]], i64 [[INDEX_SEXT]]
33+
; CHECK-NEXT: [[LOAD2:%.*]] = load float, ptr [[LOAD2_PTR]], align 4
34+
; CHECK-NEXT: [[CMP:%.*]] = fcmp contract olt float [[LOAD1]], [[LOAD2]]
35+
; CHECK-NEXT: [[IV_NEXT_TRUNC:%.*]] = trunc nsw i64 [[IV_NEXT]] to i32
36+
; CHECK-NEXT: [[SELECT]] = select i1 [[CMP]], i32 [[IV_NEXT_TRUNC]], i32 [[INDEX]]
37+
; CHECK-NEXT: [[DEC]] = add nsw i64 [[DEC_IV]], -1
38+
; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp sgt i64 [[DEC_IV]], 1
39+
; CHECK-NEXT: br i1 [[LOOP_COND]], label %[[LOOP]], [[DOT_CRIT_EDGE]]
40+
; CHECK: [[__CRIT_EDGE:.*:]]
41+
; CHECK-NEXT: [[LAST_INDEX_RET:%.*]] = phi i32 [ [[SELECT]], %[[LOOP]] ], [ [[LAST_INDEX]], %[[ENTRY]] ]
42+
; CHECK-NEXT: ret i32 [[LAST_INDEX_RET]]
43+
;
44+
entry:
45+
%first_index_sext = sext i32 %first_index to i64
46+
%last_index_neg = sub i32 0, %last_index
47+
%last_index_neg_sext = sext i32 %last_index_neg to i64
48+
%add = add nsw i64 %first_index_sext, %last_index_neg_sext
49+
%diff = sub nsw i64 0, %add
50+
%first_ptr = getelementptr i8, ptr %array, i64 -8
51+
%second_ptr = getelementptr i8, ptr %array, i64 -4
52+
%early_exit_cond = icmp slt i64 %add, 0
53+
br i1 %early_exit_cond, label %loop.preheader, label %._crit_edge
54+
55+
loop.preheader: ; preds = %entry
56+
%last_index_sext = sext i32 %last_index to i64
57+
br label %loop
58+
59+
loop: ; preds = %loop.preheader, %loop
60+
%iv = phi i64 [%iv.next, %loop], [ %last_index_sext, %loop.preheader ]
61+
%dec_iv = phi i64 [ %dec, %loop ], [ %diff, %loop.preheader ]
62+
%index = phi i32 [ %select, %loop ], [ %last_index, %loop.preheader ]
63+
%iv.next = add nsw i64 %iv, -1
64+
%load1_ptr = getelementptr float, ptr %first_ptr, i64 %iv
65+
%load1 = load float, ptr %load1_ptr, align 4
66+
%index_sext = sext i32 %index to i64
67+
%load2_ptr = getelementptr float, ptr %second_ptr, i64 %index_sext
68+
%load2 = load float, ptr %load2_ptr, align 4
69+
%cmp = fcmp contract olt float %load1, %load2
70+
%iv.next.trunc = trunc nsw i64 %iv.next to i32
71+
%select = select i1 %cmp, i32 %iv.next.trunc, i32 %index
72+
%dec = add nsw i64 %dec_iv, -1
73+
%loop_cond = icmp sgt i64 %dec_iv, 1
74+
br i1 %loop_cond, label %loop, label %._crit_edge
75+
76+
._crit_edge: ; preds = %loop, %entry
77+
%last_index_ret = phi i32 [ %select, %loop ], [ %last_index, %entry ]
78+
ret i32 %last_index_ret
79+
}

llvm/test/Transforms/LoopIdiom/last-min-index-ftn.ll

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -134,28 +134,16 @@ define i32 @minlst(i32 %first_index, i32 %last_index, ptr %array) {
134134
; CHECK-LOOP-IDIOM-NEXT: [[FIRST_PTR:%.*]] = getelementptr i8, ptr [[ARRAY]], i64 -8
135135
; CHECK-LOOP-IDIOM-NEXT: [[SECOND_PTR:%.*]] = getelementptr i8, ptr [[ARRAY]], i64 -4
136136
; CHECK-LOOP-IDIOM-NEXT: [[EARLY_EXIT_COND:%.*]] = icmp slt i64 [[ADD]], 0
137-
; CHECK-LOOP-IDIOM-NEXT: br i1 [[EARLY_EXIT_COND]], label %[[LOOP_PREHEADER:.*]], [[DOT_CRIT_EDGE:label %.*]]
138-
; CHECK-LOOP-IDIOM: [[LOOP_PREHEADER]]:
137+
; CHECK-LOOP-IDIOM-NEXT: br i1 [[EARLY_EXIT_COND]], label %[[MINIDX_EARLY_EXIT1:.*]], [[DOT_CRIT_EDGE:label %.*]]
138+
; CHECK-LOOP-IDIOM: [[MINIDX_EARLY_EXIT1]]:
139139
; CHECK-LOOP-IDIOM-NEXT: [[LAST_INDEX_SEXT:%.*]] = sext i32 [[LAST_INDEX]] to i64
140-
; CHECK-LOOP-IDIOM-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()
141-
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_VLEN:%.*]] = shl i64 [[TMP0]], 2
142-
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_NOT:%.*]] = sub i64 0, [[MINIDX_VLEN]]
143-
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_AND:%.*]] = and i64 [[LAST_INDEX_SEXT]], [[MINIDX_NOT]]
144-
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_UMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[MINIDX_AND]], i64 [[FIRST_INDEX_SEXT]])
145-
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_ADD:%.*]] = add i64 [[LAST_INDEX_SEXT]], 1
146-
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_MASK:%.*]] = call <vscale x 4 x i1> @llvm.get.active.lane.mask.nxv4i1.i64(i64 [[MINIDX_UMAX]], i64 [[MINIDX_ADD]])
147-
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_UMAX_MINUS1:%.*]] = sub i64 [[MINIDX_UMAX]], 1
148-
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_ADD_PTR_I:%.*]] = getelementptr inbounds float, ptr [[FIRST_PTR]], i64 [[MINIDX_UMAX_MINUS1]]
149-
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_LOADVALS:%.*]] = call <vscale x 4 x float> @llvm.masked.load.nxv4f32.p0(ptr [[MINIDX_ADD_PTR_I]], i32 1, <vscale x 4 x i1> [[MINIDX_MASK]], <vscale x 4 x float> zeroinitializer)
150-
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_CURRENTVALS:%.*]] = select <vscale x 4 x i1> [[MINIDX_MASK]], <vscale x 4 x float> [[MINIDX_LOADVALS]], <vscale x 4 x float> splat (float 0x7FF0000000000000)
151-
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_REVERSE:%.*]] = call <vscale x 4 x i1> @llvm.vector.reverse.nxv4i1(<vscale x 4 x i1> [[MINIDX_MASK]])
152-
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_REVERSEVALS:%.*]] = call <vscale x 4 x float> @llvm.vector.reverse.nxv4f32(<vscale x 4 x float> [[MINIDX_CURRENTVALS]])
153-
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_MINVAL:%.*]] = call float @llvm.vector.reduce.fminimum.nxv4f32(<vscale x 4 x float> [[MINIDX_REVERSEVALS]])
154-
; CHECK-LOOP-IDIOM-NEXT: br i1 true, label %[[MINIDX_VEC_ENTRY:.*]], label %[[LOOP:.*]]
155-
; CHECK-LOOP-IDIOM: [[LOOP]]:
156-
; CHECK-LOOP-IDIOM-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ [[LAST_INDEX_SEXT]], %[[LOOP_PREHEADER]] ]
157-
; CHECK-LOOP-IDIOM-NEXT: [[DEC_IV:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ [[DIFF]], %[[LOOP_PREHEADER]] ]
158-
; CHECK-LOOP-IDIOM-NEXT: [[INDEX:%.*]] = phi i32 [ [[SELECT:%.*]], %[[LOOP]] ], [ [[LAST_INDEX]], %[[LOOP_PREHEADER]] ]
140+
; CHECK-LOOP-IDIOM-NEXT: [[FIRST_INDEX_CMP:%.*]] = icmp eq i64 [[FIRST_INDEX_SEXT]], [[LAST_INDEX_SEXT]]
141+
; CHECK-LOOP-IDIOM-NEXT: [[SECOND_INDEX_BITCAST:%.*]] = trunc i64 [[LAST_INDEX_SEXT]] to i32
142+
; CHECK-LOOP-IDIOM-NEXT: br i1 [[FIRST_INDEX_CMP]], label %[[DOT_CRIT_EDGE_LOOPEXIT:.*]], label %[[MINIDX_VEC_SCALAR_FORK:.*]]
143+
; CHECK-LOOP-IDIOM: [[LOOP:.*]]:
144+
; CHECK-LOOP-IDIOM-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], %[[LOOP]] ], [ [[LAST_INDEX_SEXT]], %[[MINIDX_VEC_SCALAR_FORK]] ]
145+
; CHECK-LOOP-IDIOM-NEXT: [[DEC_IV:%.*]] = phi i64 [ [[DEC:%.*]], %[[LOOP]] ], [ [[DIFF]], %[[MINIDX_VEC_SCALAR_FORK]] ]
146+
; CHECK-LOOP-IDIOM-NEXT: [[INDEX:%.*]] = phi i32 [ [[SELECT:%.*]], %[[LOOP]] ], [ [[LAST_INDEX]], %[[MINIDX_VEC_SCALAR_FORK]] ]
159147
; CHECK-LOOP-IDIOM-NEXT: [[IV_NEXT]] = add nsw i64 [[IV]], -1
160148
; CHECK-LOOP-IDIOM-NEXT: [[LOAD1_PTR:%.*]] = getelementptr float, ptr [[FIRST_PTR]], i64 [[IV]]
161149
; CHECK-LOOP-IDIOM-NEXT: [[LOAD1:%.*]] = load float, ptr [[LOAD1_PTR]], align 4
@@ -167,16 +155,32 @@ define i32 @minlst(i32 %first_index, i32 %last_index, ptr %array) {
167155
; CHECK-LOOP-IDIOM-NEXT: [[SELECT]] = select i1 [[CMP]], i32 [[IV_NEXT_TRUNC]], i32 [[INDEX]]
168156
; CHECK-LOOP-IDIOM-NEXT: [[DEC]] = add nsw i64 [[DEC_IV]], -1
169157
; CHECK-LOOP-IDIOM-NEXT: [[LOOP_COND:%.*]] = icmp sgt i64 [[DEC_IV]], 1
170-
; CHECK-LOOP-IDIOM-NEXT: br i1 [[LOOP_COND]], label %[[LOOP]], label %[[DOT_CRIT_EDGE_LOOPEXIT:.*]]
158+
; CHECK-LOOP-IDIOM-NEXT: br i1 [[LOOP_COND]], label %[[LOOP]], label %[[DOT_CRIT_EDGE_LOOPEXIT]]
171159
; CHECK-LOOP-IDIOM: [[__CRIT_EDGE_LOOPEXIT:.*:]]
172-
; CHECK-LOOP-IDIOM-NEXT: [[TMP1:%.*]] = phi i32 [ [[SELECT]], %[[LOOP]] ], [ [[MINIDX_RET_BITCAST:%.*]], %[[MINIDX_END:.*]] ]
160+
; CHECK-LOOP-IDIOM-NEXT: [[TMP0:%.*]] = phi i32 [ [[SELECT]], %[[LOOP]] ], [ [[MINIDX_RET_BITCAST:%.*]], %[[MINIDX_END:.*]] ], [ [[SECOND_INDEX_BITCAST]], %[[MINIDX_EARLY_EXIT1]] ]
173161
; CHECK-LOOP-IDIOM-NEXT: br [[DOT_CRIT_EDGE]]
174162
; CHECK-LOOP-IDIOM: [[__CRIT_EDGE:.*:]]
175-
; CHECK-LOOP-IDIOM-NEXT: [[LAST_INDEX_RET:%.*]] = phi i32 [ [[LAST_INDEX]], %[[ENTRY]] ], [ [[TMP1]], %[[DOT_CRIT_EDGE_LOOPEXIT]] ]
163+
; CHECK-LOOP-IDIOM-NEXT: [[LAST_INDEX_RET:%.*]] = phi i32 [ [[LAST_INDEX]], %[[ENTRY]] ], [ [[TMP0]], %[[DOT_CRIT_EDGE_LOOPEXIT]] ]
176164
; CHECK-LOOP-IDIOM-NEXT: ret i32 [[LAST_INDEX_RET]]
177-
; CHECK-LOOP-IDIOM: [[MINIDX_VEC_ENTRY]]:
178-
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_ENTRY_CMP:%.*]] = fcmp olt float [[MINIDX_MINVAL]], 0x7FF0000000000000
165+
; CHECK-LOOP-IDIOM: [[MINIDX_VEC_ENTRY:.*]]:
166+
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_ENTRY_CMP:%.*]] = fcmp olt float [[MINIDX_MINVAL:%.*]], 0x7FF0000000000000
179167
; CHECK-LOOP-IDIOM-NEXT: br i1 [[MINIDX_ENTRY_CMP]], label %[[MINIDX_PARTIAL_1_IF:.*]], label %[[MINIDX_PARTIAL_1_PROC_EXIT:.*]]
168+
; CHECK-LOOP-IDIOM: [[MINIDX_VEC_SCALAR_FORK]]:
169+
; CHECK-LOOP-IDIOM-NEXT: [[TMP1:%.*]] = call i64 @llvm.vscale.i64()
170+
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_VLEN:%.*]] = shl i64 [[TMP1]], 2
171+
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_NOT:%.*]] = sub i64 0, [[MINIDX_VLEN]]
172+
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_AND:%.*]] = and i64 [[LAST_INDEX_SEXT]], [[MINIDX_NOT]]
173+
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_UMAX:%.*]] = call i64 @llvm.smax.i64(i64 [[MINIDX_AND]], i64 [[FIRST_INDEX_SEXT]])
174+
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_ADD:%.*]] = add i64 [[LAST_INDEX_SEXT]], 1
175+
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_MASK:%.*]] = call <vscale x 4 x i1> @llvm.get.active.lane.mask.nxv4i1.i64(i64 [[MINIDX_UMAX]], i64 [[MINIDX_ADD]])
176+
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_UMAX_MINUS1:%.*]] = sub i64 [[MINIDX_UMAX]], 1
177+
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_ADD_PTR_I:%.*]] = getelementptr inbounds float, ptr [[ARRAY]], i64 [[MINIDX_UMAX_MINUS1]]
178+
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_LOADVALS:%.*]] = call <vscale x 4 x float> @llvm.masked.load.nxv4f32.p0(ptr [[MINIDX_ADD_PTR_I]], i32 1, <vscale x 4 x i1> [[MINIDX_MASK]], <vscale x 4 x float> zeroinitializer)
179+
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_CURRENTVALS:%.*]] = select <vscale x 4 x i1> [[MINIDX_MASK]], <vscale x 4 x float> [[MINIDX_LOADVALS]], <vscale x 4 x float> splat (float 0x7FF0000000000000)
180+
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_REVERSE:%.*]] = call <vscale x 4 x i1> @llvm.vector.reverse.nxv4i1(<vscale x 4 x i1> [[MINIDX_MASK]])
181+
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_REVERSEVALS:%.*]] = call <vscale x 4 x float> @llvm.vector.reverse.nxv4f32(<vscale x 4 x float> [[MINIDX_CURRENTVALS]])
182+
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_MINVAL]] = call float @llvm.vector.reduce.fminimum.nxv4f32(<vscale x 4 x float> [[MINIDX_REVERSEVALS]])
183+
; CHECK-LOOP-IDIOM-NEXT: br i1 true, label %[[MINIDX_VEC_ENTRY]], label %[[LOOP]]
180184
; CHECK-LOOP-IDIOM: [[MINIDX_PARTIAL_1_IF]]:
181185
; CHECK-LOOP-IDIOM-NEXT: [[MINVAL_SPLAT_SPLATINSERT:%.*]] = insertelement <vscale x 4 x float> poison, float [[MINIDX_MINVAL]], i64 0
182186
; CHECK-LOOP-IDIOM-NEXT: [[MINVAL_SPLAT_SPLAT:%.*]] = shufflevector <vscale x 4 x float> [[MINVAL_SPLAT_SPLATINSERT]], <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer
@@ -201,7 +205,7 @@ define i32 @minlst(i32 %first_index, i32 %last_index, ptr %array) {
201205
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_VECT_BODY_KNOWN_MIN:%.*]] = phi float [ [[MINIDX_PARTIAL_1_EXIT_KNOWN_MIN]], %[[MINIDX_WHILE_BODY_PH]] ], [ [[MINIDX_VECT_CONTINUE_KNOWN_MIN:%.*]], %[[MINIDX_VECT_CONTINUE]] ]
202206
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_VECT_BODY_SUB]] = sub i64 [[MINIDX_VECT_BODY_PHI1]], [[MINIDX_VLEN]]
203207
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_VECT_BODY_SUB_MINUS1:%.*]] = sub i64 [[MINIDX_VECT_BODY_SUB]], 1
204-
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_VECT_BODY_GEP:%.*]] = getelementptr inbounds float, ptr [[FIRST_PTR]], i64 [[MINIDX_VECT_BODY_SUB_MINUS1]]
208+
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_VECT_BODY_GEP:%.*]] = getelementptr inbounds float, ptr [[ARRAY]], i64 [[MINIDX_VECT_BODY_SUB_MINUS1]]
205209
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_VECT_BODY_UNMASKEDLOAD:%.*]] = load <vscale x 4 x float>, ptr [[MINIDX_VECT_BODY_GEP]], align 16
206210
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_VECT_BODY_REVERSE:%.*]] = call <vscale x 4 x float> @llvm.vector.reverse.nxv4f32(<vscale x 4 x float> [[MINIDX_VECT_BODY_UNMASKEDLOAD]])
207211
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_VECT_BODY_REDUCE:%.*]] = call float @llvm.vector.reduce.fminimum.nxv4f32(<vscale x 4 x float> [[MINIDX_VECT_BODY_REVERSE]])
@@ -228,12 +232,13 @@ define i32 @minlst(i32 %first_index, i32 %last_index, ptr %array) {
228232
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_VECT_END_CMP:%.*]] = icmp ugt i64 [[MINIDX_VECT_END_LCSSA]], [[FIRST_INDEX_SEXT]]
229233
; CHECK-LOOP-IDIOM-NEXT: br i1 [[MINIDX_VECT_END_CMP]], label %[[MINIDX_PARTIAL_2_IF:.*]], label %[[MINIDX_END]]
230234
; CHECK-LOOP-IDIOM: [[MINIDX_PARTIAL_2_IF]]:
231-
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_PARTIAL_2_IF_ADD_ZERO:%.*]] = add i64 [[MINIDX_VECT_END_LCSSA]], 0
235+
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_PARTIAL_2_IF_ADD_ZERO:%.*]] = add i64 [[MINIDX_VECT_END_LCSSA]], 1
232236
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_PARTIAL_2_IF_MASK:%.*]] = call <vscale x 4 x i1> @llvm.get.active.lane.mask.nxv4i1.i64(i64 [[FIRST_INDEX_SEXT]], i64 [[MINIDX_PARTIAL_2_IF_ADD_ZERO]])
233-
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_PARTIAL_2_IF_MASK_REVERSE:%.*]] = call <vscale x 4 x i1> @llvm.vector.reverse.nxv4i1(<vscale x 4 x i1> [[MINIDX_PARTIAL_2_IF_MASK]])
234237
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_PARTIAL_2_IF_IPOS1_MINUS1:%.*]] = sub i64 [[FIRST_INDEX_SEXT]], 1
235-
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_PARTIAL_2_IF_GEP:%.*]] = getelementptr inbounds float, ptr [[FIRST_PTR]], i64 [[MINIDX_PARTIAL_2_IF_IPOS1_MINUS1]]
236-
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_PARTIAL_2_IF_LOAD:%.*]] = call <vscale x 4 x float> @llvm.masked.load.nxv4f32.p0(ptr [[MINIDX_PARTIAL_2_IF_GEP]], i32 1, <vscale x 4 x i1> [[MINIDX_PARTIAL_2_IF_MASK_REVERSE]], <vscale x 4 x float> zeroinitializer)
238+
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_PARTIAL_2_IF_GEP:%.*]] = getelementptr inbounds float, ptr [[ARRAY]], i64 [[MINIDX_PARTIAL_2_IF_IPOS1_MINUS1]]
239+
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_PARTIAL_2_IF_LOAD1:%.*]] = call <vscale x 4 x float> @llvm.masked.load.nxv4f32.p0(ptr [[MINIDX_PARTIAL_2_IF_GEP]], i32 1, <vscale x 4 x i1> [[MINIDX_PARTIAL_2_IF_MASK]], <vscale x 4 x float> zeroinitializer)
240+
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_PARTIAL_2_IF_LOAD:%.*]] = select <vscale x 4 x i1> [[MINIDX_PARTIAL_2_IF_MASK]], <vscale x 4 x float> [[MINIDX_PARTIAL_2_IF_LOAD1]], <vscale x 4 x float> splat (float 0x7FF0000000000000)
241+
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_PARTIAL_2_IF_MASK_REVERSE:%.*]] = call <vscale x 4 x i1> @llvm.vector.reverse.nxv4i1(<vscale x 4 x i1> [[MINIDX_PARTIAL_2_IF_MASK]])
237242
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_PARTIAL_2_IF_REVERSE:%.*]] = call <vscale x 4 x float> @llvm.vector.reverse.nxv4f32(<vscale x 4 x float> [[MINIDX_PARTIAL_2_IF_LOAD]])
238243
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_PARTIAL_2_IF_REDUCE:%.*]] = call float @llvm.vector.reduce.fminimum.nxv4f32(<vscale x 4 x float> [[MINIDX_PARTIAL_2_IF_REVERSE]])
239244
; CHECK-LOOP-IDIOM-NEXT: [[MINIDX_PARTIAL_2_IF_FCMP:%.*]] = fcmp olt float [[MINIDX_PARTIAL_2_IF_REDUCE]], [[MINIDX_VECT_END_KNOWN_MIN_LCSSA]]

0 commit comments

Comments
 (0)