@@ -1326,6 +1326,136 @@ exit:
1326
1326
ret i32 10
1327
1327
}
1328
1328
1329
+ define i32 @partial_unswitch_true_successor_trunc (ptr %ptr , i32 %N ) {
1330
+ ; CHECK-LABEL: @partial_unswitch_true_successor_trunc(
1331
+ ; CHECK-NEXT: entry:
1332
+ ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[PTR:%.*]], align 4
1333
+ ; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[TMP0]] to i1
1334
+ ; CHECK-NEXT: br i1 [[TMP1]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]
1335
+ ; CHECK: entry.split.us:
1336
+ ; CHECK-NEXT: br label [[LOOP_HEADER_US:%.*]]
1337
+ ; CHECK: loop.header.us:
1338
+ ; CHECK-NEXT: [[IV_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US]] ], [ [[IV_NEXT_US:%.*]], [[LOOP_LATCH_US:%.*]] ]
1339
+ ; CHECK-NEXT: br label [[NOCLOBBER_US:%.*]]
1340
+ ; CHECK: noclobber.us:
1341
+ ; CHECK-NEXT: br label [[LOOP_LATCH_US]]
1342
+ ; CHECK: loop.latch.us:
1343
+ ; CHECK-NEXT: [[C_US:%.*]] = icmp ult i32 [[IV_US]], [[N:%.*]]
1344
+ ; CHECK-NEXT: [[IV_NEXT_US]] = add i32 [[IV_US]], 1
1345
+ ; CHECK-NEXT: br i1 [[C_US]], label [[LOOP_HEADER_US]], label [[EXIT_SPLIT_US:%.*]]
1346
+ ; CHECK: exit.split.us:
1347
+ ; CHECK-NEXT: br label [[EXIT:%.*]]
1348
+ ; CHECK: entry.split:
1349
+ ; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
1350
+ ; CHECK: loop.header:
1351
+ ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
1352
+ ; CHECK-NEXT: [[LV:%.*]] = load i32, ptr [[PTR]], align 4
1353
+ ; CHECK-NEXT: [[SC:%.*]] = trunc i32 [[LV]] to i1
1354
+ ; CHECK-NEXT: br i1 [[SC]], label [[NOCLOBBER:%.*]], label [[CLOBBER:%.*]]
1355
+ ; CHECK: noclobber:
1356
+ ; CHECK-NEXT: br label [[LOOP_LATCH]]
1357
+ ; CHECK: clobber:
1358
+ ; CHECK-NEXT: call void @clobber()
1359
+ ; CHECK-NEXT: br label [[LOOP_LATCH]]
1360
+ ; CHECK: loop.latch:
1361
+ ; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[IV]], [[N]]
1362
+ ; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
1363
+ ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP12:![0-9]+]]
1364
+ ; CHECK: exit.split:
1365
+ ; CHECK-NEXT: br label [[EXIT]]
1366
+ ; CHECK: exit:
1367
+ ; CHECK-NEXT: ret i32 10
1368
+ ;
1369
+ entry:
1370
+ br label %loop.header
1371
+
1372
+ loop.header:
1373
+ %iv = phi i32 [ 0 , %entry ], [ %iv.next , %loop.latch ]
1374
+ %lv = load i32 , ptr %ptr
1375
+ %sc = trunc i32 %lv to i1
1376
+ br i1 %sc , label %noclobber , label %clobber
1377
+
1378
+ noclobber:
1379
+ br label %loop.latch
1380
+
1381
+ clobber:
1382
+ call void @clobber ()
1383
+ br label %loop.latch
1384
+
1385
+ loop.latch:
1386
+ %c = icmp ult i32 %iv , %N
1387
+ %iv.next = add i32 %iv , 1
1388
+ br i1 %c , label %loop.header , label %exit
1389
+
1390
+ exit:
1391
+ ret i32 10
1392
+ }
1393
+
1394
+ define i32 @partial_unswitch_false_successor_trunc (ptr %ptr , i32 %N ) {
1395
+ ; CHECK-LABEL: @partial_unswitch_false_successor_trunc(
1396
+ ; CHECK-NEXT: entry:
1397
+ ; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[PTR:%.*]], align 4
1398
+ ; CHECK-NEXT: [[TMP1:%.*]] = trunc i32 [[TMP0]] to i1
1399
+ ; CHECK-NEXT: br i1 [[TMP1]], label [[ENTRY_SPLIT:%.*]], label [[ENTRY_SPLIT_US:%.*]]
1400
+ ; CHECK: entry.split.us:
1401
+ ; CHECK-NEXT: br label [[LOOP_HEADER_US:%.*]]
1402
+ ; CHECK: loop.header.us:
1403
+ ; CHECK-NEXT: [[IV_US:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT_US]] ], [ [[IV_NEXT_US:%.*]], [[LOOP_LATCH_US:%.*]] ]
1404
+ ; CHECK-NEXT: br label [[NOCLOBBER_US:%.*]]
1405
+ ; CHECK: noclobber.us:
1406
+ ; CHECK-NEXT: br label [[LOOP_LATCH_US]]
1407
+ ; CHECK: loop.latch.us:
1408
+ ; CHECK-NEXT: [[C_US:%.*]] = icmp ult i32 [[IV_US]], [[N:%.*]]
1409
+ ; CHECK-NEXT: [[IV_NEXT_US]] = add i32 [[IV_US]], 1
1410
+ ; CHECK-NEXT: br i1 [[C_US]], label [[LOOP_HEADER_US]], label [[EXIT_SPLIT_US:%.*]]
1411
+ ; CHECK: exit.split.us:
1412
+ ; CHECK-NEXT: br label [[EXIT:%.*]]
1413
+ ; CHECK: entry.split:
1414
+ ; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
1415
+ ; CHECK: loop.header:
1416
+ ; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY_SPLIT]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]
1417
+ ; CHECK-NEXT: [[LV:%.*]] = load i32, ptr [[PTR]], align 4
1418
+ ; CHECK-NEXT: [[SC:%.*]] = trunc i32 [[LV]] to i1
1419
+ ; CHECK-NEXT: br i1 [[SC]], label [[CLOBBER:%.*]], label [[NOCLOBBER:%.*]]
1420
+ ; CHECK: clobber:
1421
+ ; CHECK-NEXT: call void @clobber()
1422
+ ; CHECK-NEXT: br label [[LOOP_LATCH]]
1423
+ ; CHECK: noclobber:
1424
+ ; CHECK-NEXT: br label [[LOOP_LATCH]]
1425
+ ; CHECK: loop.latch:
1426
+ ; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[IV]], [[N]]
1427
+ ; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1
1428
+ ; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[EXIT_SPLIT:%.*]], !llvm.loop [[LOOP13:![0-9]+]]
1429
+ ; CHECK: exit.split:
1430
+ ; CHECK-NEXT: br label [[EXIT]]
1431
+ ; CHECK: exit:
1432
+ ; CHECK-NEXT: ret i32 10
1433
+ ;
1434
+ entry:
1435
+ br label %loop.header
1436
+
1437
+ loop.header:
1438
+ %iv = phi i32 [ 0 , %entry ], [ %iv.next , %loop.latch ]
1439
+ %lv = load i32 , ptr %ptr
1440
+ %sc = trunc i32 %lv to i1
1441
+ br i1 %sc , label %clobber , label %noclobber
1442
+
1443
+ clobber:
1444
+ call void @clobber ()
1445
+ br label %loop.latch
1446
+
1447
+ noclobber:
1448
+ br label %loop.latch
1449
+
1450
+ loop.latch:
1451
+ %c = icmp ult i32 %iv , %N
1452
+ %iv.next = add i32 %iv , 1
1453
+ br i1 %c , label %loop.header , label %exit
1454
+
1455
+ exit:
1456
+ ret i32 10
1457
+ }
1458
+
1329
1459
; CHECK: [[LOOP0]] = distinct !{[[LOOP0]], [[UNSWITCH_PARTIAL_DISABLE:![0-9]+]]}
1330
1460
; CHECK: [[UNSWITCH_PARTIAL_DISABLE]] = !{!"llvm.loop.unswitch.partial.disable"}
1331
1461
; CHECK: [[LOOP2]] = distinct !{[[LOOP2]], [[UNSWITCH_PARTIAL_DISABLE]]}
0 commit comments