@@ -1174,3 +1174,188 @@ e.exit:
1174
1174
%res = phi i32 [ %iv.next , %loop ]
1175
1175
ret i32 %res
1176
1176
}
1177
+
1178
+ ; Test case for https://github.com/llvm/llvm-project/issues/122496.
1179
+ ; FIXME: Currently an incorrect live-out is used.
1180
+ define i32 @iv_ext_used_outside ( ptr %dst ) {
1181
+ ; VEC-LABEL: define i32 @iv_ext_used_outside(
1182
+ ; VEC-SAME: ptr [[DST:%.*]]) {
1183
+ ; VEC-NEXT: [[ENTRY:.*]]:
1184
+ ; VEC-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
1185
+ ; VEC: [[VECTOR_PH]]:
1186
+ ; VEC-NEXT: br label %[[VECTOR_BODY:.*]]
1187
+ ; VEC: [[VECTOR_BODY]]:
1188
+ ; VEC-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
1189
+ ; VEC-NEXT: [[OFFSET_IDX:%.*]] = trunc i32 [[INDEX]] to i16
1190
+ ; VEC-NEXT: [[TMP0:%.*]] = add i16 [[OFFSET_IDX]], 0
1191
+ ; VEC-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw i32, ptr [[DST]], i16 [[TMP0]]
1192
+ ; VEC-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw i32, ptr [[TMP1]], i32 0
1193
+ ; VEC-NEXT: store <2 x i32> zeroinitializer, ptr [[TMP2]], align 4
1194
+ ; VEC-NEXT: [[TMP3:%.*]] = add nuw nsw i16 [[TMP0]], 1
1195
+ ; VEC-NEXT: [[TMP4:%.*]] = zext nneg i16 [[TMP3]] to i32
1196
+ ; VEC-NEXT: [[TMP5:%.*]] = zext nneg i16 [[TMP3]] to i32
1197
+ ; VEC-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
1198
+ ; VEC-NEXT: [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], 128
1199
+ ; VEC-NEXT: br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
1200
+ ; VEC: [[MIDDLE_BLOCK]]:
1201
+ ; VEC-NEXT: br i1 false, label %[[EXIT:.*]], label %[[SCALAR_PH]]
1202
+ ; VEC: [[SCALAR_PH]]:
1203
+ ; VEC-NEXT: [[BC_RESUME_VAL:%.*]] = phi i16 [ 128, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
1204
+ ; VEC-NEXT: [[BC_RESUME_VAL1:%.*]] = phi i32 [ 128, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
1205
+ ; VEC-NEXT: br label %[[LOOP:.*]]
1206
+ ; VEC: [[LOOP]]:
1207
+ ; VEC-NEXT: [[IV_1:%.*]] = phi i16 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_1_NEXT:%.*]], %[[LOOP]] ]
1208
+ ; VEC-NEXT: [[IV_2:%.*]] = phi i32 [ [[BC_RESUME_VAL1]], %[[SCALAR_PH]] ], [ [[IV_1_EXT:%.*]], %[[LOOP]] ]
1209
+ ; VEC-NEXT: [[GEP:%.*]] = getelementptr inbounds nuw i32, ptr [[DST]], i16 [[IV_1]]
1210
+ ; VEC-NEXT: store i32 0, ptr [[GEP]], align 4
1211
+ ; VEC-NEXT: [[IV_1_NEXT]] = add nuw nsw i16 [[IV_1]], 1
1212
+ ; VEC-NEXT: [[IV_1_EXT]] = zext nneg i16 [[IV_1_NEXT]] to i32
1213
+ ; VEC-NEXT: [[EC:%.*]] = icmp samesign ult i16 [[IV_1]], 128
1214
+ ; VEC-NEXT: br i1 [[EC]], label %[[LOOP]], label %[[EXIT]], {{!llvm.loop ![0-9]+}}
1215
+ ; VEC: [[EXIT]]:
1216
+ ; VEC-NEXT: [[IV_1_EXT_LCSSA:%.*]] = phi i32 [ [[IV_1_EXT]], %[[LOOP]] ], [ [[TMP5]], %[[MIDDLE_BLOCK]] ]
1217
+ ; VEC-NEXT: ret i32 [[IV_1_EXT_LCSSA]]
1218
+ ;
1219
+ ; INTERLEAVE-LABEL: define i32 @iv_ext_used_outside(
1220
+ ; INTERLEAVE-SAME: ptr [[DST:%.*]]) {
1221
+ ; INTERLEAVE-NEXT: [[ENTRY:.*]]:
1222
+ ; INTERLEAVE-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
1223
+ ; INTERLEAVE: [[VECTOR_PH]]:
1224
+ ; INTERLEAVE-NEXT: br label %[[VECTOR_BODY:.*]]
1225
+ ; INTERLEAVE: [[VECTOR_BODY]]:
1226
+ ; INTERLEAVE-NEXT: [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
1227
+ ; INTERLEAVE-NEXT: [[OFFSET_IDX:%.*]] = trunc i32 [[INDEX]] to i16
1228
+ ; INTERLEAVE-NEXT: [[TMP0:%.*]] = add i16 [[OFFSET_IDX]], 0
1229
+ ; INTERLEAVE-NEXT: [[TMP1:%.*]] = add i16 [[OFFSET_IDX]], 1
1230
+ ; INTERLEAVE-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw i32, ptr [[DST]], i16 [[TMP0]]
1231
+ ; INTERLEAVE-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw i32, ptr [[DST]], i16 [[TMP1]]
1232
+ ; INTERLEAVE-NEXT: store i32 0, ptr [[TMP2]], align 4
1233
+ ; INTERLEAVE-NEXT: store i32 0, ptr [[TMP3]], align 4
1234
+ ; INTERLEAVE-NEXT: [[TMP4:%.*]] = add nuw nsw i16 [[TMP1]], 1
1235
+ ; INTERLEAVE-NEXT: [[TMP5:%.*]] = zext nneg i16 [[TMP4]] to i32
1236
+ ; INTERLEAVE-NEXT: [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
1237
+ ; INTERLEAVE-NEXT: [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], 128
1238
+ ; INTERLEAVE-NEXT: br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
1239
+ ; INTERLEAVE: [[MIDDLE_BLOCK]]:
1240
+ ; INTERLEAVE-NEXT: br i1 false, label %[[EXIT:.*]], label %[[SCALAR_PH]]
1241
+ ; INTERLEAVE: [[SCALAR_PH]]:
1242
+ ; INTERLEAVE-NEXT: [[BC_RESUME_VAL:%.*]] = phi i16 [ 128, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
1243
+ ; INTERLEAVE-NEXT: [[BC_RESUME_VAL1:%.*]] = phi i32 [ 128, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
1244
+ ; INTERLEAVE-NEXT: br label %[[LOOP:.*]]
1245
+ ; INTERLEAVE: [[LOOP]]:
1246
+ ; INTERLEAVE-NEXT: [[IV_1:%.*]] = phi i16 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_1_NEXT:%.*]], %[[LOOP]] ]
1247
+ ; INTERLEAVE-NEXT: [[IV_2:%.*]] = phi i32 [ [[BC_RESUME_VAL1]], %[[SCALAR_PH]] ], [ [[IV_1_EXT:%.*]], %[[LOOP]] ]
1248
+ ; INTERLEAVE-NEXT: [[GEP:%.*]] = getelementptr inbounds nuw i32, ptr [[DST]], i16 [[IV_1]]
1249
+ ; INTERLEAVE-NEXT: store i32 0, ptr [[GEP]], align 4
1250
+ ; INTERLEAVE-NEXT: [[IV_1_NEXT]] = add nuw nsw i16 [[IV_1]], 1
1251
+ ; INTERLEAVE-NEXT: [[IV_1_EXT]] = zext nneg i16 [[IV_1_NEXT]] to i32
1252
+ ; INTERLEAVE-NEXT: [[EC:%.*]] = icmp samesign ult i16 [[IV_1]], 128
1253
+ ; INTERLEAVE-NEXT: br i1 [[EC]], label %[[LOOP]], label %[[EXIT]], {{!llvm.loop ![0-9]+}}
1254
+ ; INTERLEAVE: [[EXIT]]:
1255
+ ; INTERLEAVE-NEXT: [[IV_1_EXT_LCSSA:%.*]] = phi i32 [ [[IV_1_EXT]], %[[LOOP]] ], [ [[TMP5]], %[[MIDDLE_BLOCK]] ]
1256
+ ; INTERLEAVE-NEXT: ret i32 [[IV_1_EXT_LCSSA]]
1257
+ ;
1258
+ entry:
1259
+ br label %loop
1260
+
1261
+ loop:
1262
+ %iv.1 = phi i16 [ 0 , %entry ], [ %iv.1.next , %loop ]
1263
+ %iv.2 = phi i32 [ 0 , %entry ], [ %iv.1.ext , %loop ]
1264
+ %gep = getelementptr inbounds nuw i32 , ptr %dst , i16 %iv.1
1265
+ store i32 0 , ptr %gep , align 4
1266
+ %iv.1.next = add nuw nsw i16 %iv.1 , 1
1267
+ %iv.1.ext = zext nneg i16 %iv.1.next to i32
1268
+ %ec = icmp samesign ult i16 %iv.1 , 128
1269
+ br i1 %ec , label %loop , label %exit
1270
+
1271
+ exit:
1272
+ %iv.1.ext.lcssa = phi i32 [ %iv.1.ext , %loop ]
1273
+ ret i32 %iv.1.ext.lcssa
1274
+ }
1275
+
1276
+ ; Test case for https://github.com/llvm/llvm-project/issues/122602.
1277
+ ; FIXME: Currently an incorrect live-out is used.
1278
+ define i64 @test_iv_increment_incremented (ptr %dst ) {
1279
+ ; VEC-LABEL: define i64 @test_iv_increment_incremented(
1280
+ ; VEC-SAME: ptr [[DST:%.*]]) {
1281
+ ; VEC-NEXT: [[ENTRY:.*]]:
1282
+ ; VEC-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
1283
+ ; VEC: [[VECTOR_PH]]:
1284
+ ; VEC-NEXT: br label %[[VECTOR_BODY:.*]]
1285
+ ; VEC: [[VECTOR_BODY]]:
1286
+ ; VEC-NEXT: [[TMP0:%.*]] = getelementptr i16, ptr [[DST]], i64 3
1287
+ ; VEC-NEXT: [[TMP1:%.*]] = getelementptr i16, ptr [[TMP0]], i32 0
1288
+ ; VEC-NEXT: [[TMP2:%.*]] = getelementptr i16, ptr [[TMP1]], i32 -1
1289
+ ; VEC-NEXT: store <2 x i16> splat (i16 1), ptr [[TMP2]], align 2
1290
+ ; VEC-NEXT: [[TMP3:%.*]] = add i64 2, -1
1291
+ ; VEC-NEXT: [[TMP4:%.*]] = add i64 [[TMP3]], 1
1292
+ ; VEC-NEXT: [[TMP5:%.*]] = add i64 [[TMP3]], 1
1293
+ ; VEC-NEXT: br label %[[MIDDLE_BLOCK:.*]]
1294
+ ; VEC: [[MIDDLE_BLOCK]]:
1295
+ ; VEC-NEXT: br i1 true, label %[[EXIT:.*]], label %[[SCALAR_PH]]
1296
+ ; VEC: [[SCALAR_PH]]:
1297
+ ; VEC-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 1, %[[MIDDLE_BLOCK]] ], [ 3, %[[ENTRY]] ]
1298
+ ; VEC-NEXT: [[BC_RESUME_VAL1:%.*]] = phi i64 [ 0, %[[MIDDLE_BLOCK]] ], [ 2, %[[ENTRY]] ]
1299
+ ; VEC-NEXT: br label %[[LOOP:.*]]
1300
+ ; VEC: [[LOOP]]:
1301
+ ; VEC-NEXT: [[IV_1:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_1_NEXT:%.*]], %[[LOOP]] ]
1302
+ ; VEC-NEXT: [[IV_2:%.*]] = phi i64 [ [[BC_RESUME_VAL1]], %[[SCALAR_PH]] ], [ [[IV_2_NEXT:%.*]], %[[LOOP]] ]
1303
+ ; VEC-NEXT: [[GEP:%.*]] = getelementptr i16, ptr [[DST]], i64 [[IV_1]]
1304
+ ; VEC-NEXT: store i16 1, ptr [[GEP]], align 2
1305
+ ; VEC-NEXT: [[IV_2_NEXT]] = add i64 [[IV_2]], -1
1306
+ ; VEC-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_2_NEXT]], 0
1307
+ ; VEC-NEXT: [[IV_1_NEXT]] = add i64 [[IV_2_NEXT]], 1
1308
+ ; VEC-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], {{!llvm.loop ![0-9]+}}
1309
+ ; VEC: [[EXIT]]:
1310
+ ; VEC-NEXT: [[IV_1_NEXT_LCSSA:%.*]] = phi i64 [ [[IV_1_NEXT]], %[[LOOP]] ], [ [[TMP5]], %[[MIDDLE_BLOCK]] ]
1311
+ ; VEC-NEXT: ret i64 [[IV_1_NEXT_LCSSA]]
1312
+ ;
1313
+ ; INTERLEAVE-LABEL: define i64 @test_iv_increment_incremented(
1314
+ ; INTERLEAVE-SAME: ptr [[DST:%.*]]) {
1315
+ ; INTERLEAVE-NEXT: [[ENTRY:.*]]:
1316
+ ; INTERLEAVE-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
1317
+ ; INTERLEAVE: [[VECTOR_PH]]:
1318
+ ; INTERLEAVE-NEXT: br label %[[VECTOR_BODY:.*]]
1319
+ ; INTERLEAVE: [[VECTOR_BODY]]:
1320
+ ; INTERLEAVE-NEXT: [[TMP0:%.*]] = getelementptr i16, ptr [[DST]], i64 3
1321
+ ; INTERLEAVE-NEXT: [[TMP1:%.*]] = getelementptr i16, ptr [[DST]], i64 2
1322
+ ; INTERLEAVE-NEXT: store i16 1, ptr [[TMP0]], align 2
1323
+ ; INTERLEAVE-NEXT: store i16 1, ptr [[TMP1]], align 2
1324
+ ; INTERLEAVE-NEXT: [[TMP2:%.*]] = add i64 1, -1
1325
+ ; INTERLEAVE-NEXT: [[TMP3:%.*]] = add i64 [[TMP2]], 1
1326
+ ; INTERLEAVE-NEXT: br label %[[MIDDLE_BLOCK:.*]]
1327
+ ; INTERLEAVE: [[MIDDLE_BLOCK]]:
1328
+ ; INTERLEAVE-NEXT: br i1 true, label %[[EXIT:.*]], label %[[SCALAR_PH]]
1329
+ ; INTERLEAVE: [[SCALAR_PH]]:
1330
+ ; INTERLEAVE-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 1, %[[MIDDLE_BLOCK]] ], [ 3, %[[ENTRY]] ]
1331
+ ; INTERLEAVE-NEXT: [[BC_RESUME_VAL1:%.*]] = phi i64 [ 0, %[[MIDDLE_BLOCK]] ], [ 2, %[[ENTRY]] ]
1332
+ ; INTERLEAVE-NEXT: br label %[[LOOP:.*]]
1333
+ ; INTERLEAVE: [[LOOP]]:
1334
+ ; INTERLEAVE-NEXT: [[IV_1:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_1_NEXT:%.*]], %[[LOOP]] ]
1335
+ ; INTERLEAVE-NEXT: [[IV_2:%.*]] = phi i64 [ [[BC_RESUME_VAL1]], %[[SCALAR_PH]] ], [ [[IV_2_NEXT:%.*]], %[[LOOP]] ]
1336
+ ; INTERLEAVE-NEXT: [[GEP:%.*]] = getelementptr i16, ptr [[DST]], i64 [[IV_1]]
1337
+ ; INTERLEAVE-NEXT: store i16 1, ptr [[GEP]], align 2
1338
+ ; INTERLEAVE-NEXT: [[IV_2_NEXT]] = add i64 [[IV_2]], -1
1339
+ ; INTERLEAVE-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_2_NEXT]], 0
1340
+ ; INTERLEAVE-NEXT: [[IV_1_NEXT]] = add i64 [[IV_2_NEXT]], 1
1341
+ ; INTERLEAVE-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], {{!llvm.loop ![0-9]+}}
1342
+ ; INTERLEAVE: [[EXIT]]:
1343
+ ; INTERLEAVE-NEXT: [[IV_1_NEXT_LCSSA:%.*]] = phi i64 [ [[IV_1_NEXT]], %[[LOOP]] ], [ [[TMP3]], %[[MIDDLE_BLOCK]] ]
1344
+ ; INTERLEAVE-NEXT: ret i64 [[IV_1_NEXT_LCSSA]]
1345
+ ;
1346
+ entry:
1347
+ br label %loop
1348
+
1349
+ loop:
1350
+ %iv.1 = phi i64 [ 3 , %entry ], [ %iv.1.next , %loop ]
1351
+ %iv.2 = phi i64 [ 2 , %entry ], [ %iv.2.next , %loop ]
1352
+ %gep = getelementptr i16 , ptr %dst , i64 %iv.1
1353
+ store i16 1 , ptr %gep , align 2
1354
+ %iv.2.next = add i64 %iv.2 , -1
1355
+ %ec = icmp eq i64 %iv.2.next , 0
1356
+ %iv.1.next = add i64 %iv.2.next , 1
1357
+ br i1 %ec , label %exit , label %loop
1358
+
1359
+ exit:
1360
+ ret i64 %iv.1.next
1361
+ }
0 commit comments