@@ -1334,3 +1334,201 @@ entry:
1334
1334
%a = call i32 @llvm.loongarch.lsx.vpickve2gr.w (<4 x i32 > %v , i32 3 )
1335
1335
ret i32 %a
1336
1336
}
1337
+
1338
+ define fastcc ptr @test21 (ptr %B , ptr %Op0 , ptr %Op1 , ptr %P , ptr %M , i1 zeroext %I , i64 %0 , ptr %a.1 , i64 %1 , i1 %c , i32 %2 ) {
1339
+ ; CHECK-LABEL: test21:
1340
+ ; CHECK: # %bb.0: # %entry
1341
+ ; CHECK-NEXT: addi.d $sp, $sp, -80
1342
+ ; CHECK-NEXT: .cfi_def_cfa_offset 80
1343
+ ; CHECK-NEXT: st.d $ra, $sp, 72 # 8-byte Folded Spill
1344
+ ; CHECK-NEXT: st.d $fp, $sp, 64 # 8-byte Folded Spill
1345
+ ; CHECK-NEXT: st.d $s0, $sp, 56 # 8-byte Folded Spill
1346
+ ; CHECK-NEXT: st.d $s1, $sp, 48 # 8-byte Folded Spill
1347
+ ; CHECK-NEXT: st.d $s2, $sp, 40 # 8-byte Folded Spill
1348
+ ; CHECK-NEXT: st.d $s3, $sp, 32 # 8-byte Folded Spill
1349
+ ; CHECK-NEXT: st.d $s4, $sp, 24 # 8-byte Folded Spill
1350
+ ; CHECK-NEXT: st.d $s5, $sp, 16 # 8-byte Folded Spill
1351
+ ; CHECK-NEXT: st.d $s6, $sp, 8 # 8-byte Folded Spill
1352
+ ; CHECK-NEXT: .cfi_offset 1, -8
1353
+ ; CHECK-NEXT: .cfi_offset 22, -16
1354
+ ; CHECK-NEXT: .cfi_offset 23, -24
1355
+ ; CHECK-NEXT: .cfi_offset 24, -32
1356
+ ; CHECK-NEXT: .cfi_offset 25, -40
1357
+ ; CHECK-NEXT: .cfi_offset 26, -48
1358
+ ; CHECK-NEXT: .cfi_offset 27, -56
1359
+ ; CHECK-NEXT: .cfi_offset 28, -64
1360
+ ; CHECK-NEXT: .cfi_offset 29, -72
1361
+ ; CHECK-NEXT: ld.d $s6, $sp, 80
1362
+ ; CHECK-NEXT: move $s2, $a7
1363
+ ; CHECK-NEXT: move $s4, $a5
1364
+ ; CHECK-NEXT: move $s0, $a4
1365
+ ; CHECK-NEXT: move $fp, $a3
1366
+ ; CHECK-NEXT: move $s5, $a2
1367
+ ; CHECK-NEXT: move $s3, $a1
1368
+ ; CHECK-NEXT: move $s1, $a0
1369
+ ; CHECK-NEXT: move $a0, $zero
1370
+ ; CHECK-NEXT: jirl $ra, $zero, 0
1371
+ ; CHECK-NEXT: beqz $s4, .LBB24_2
1372
+ ; CHECK-NEXT: # %bb.1: # %if.then26
1373
+ ; CHECK-NEXT: addi.w $s6, $s6, 1
1374
+ ; CHECK-NEXT: beqz $s4, .LBB24_3
1375
+ ; CHECK-NEXT: b .LBB24_6
1376
+ ; CHECK-NEXT: .LBB24_2:
1377
+ ; CHECK-NEXT: move $s3, $s5
1378
+ ; CHECK-NEXT: bnez $s4, .LBB24_6
1379
+ ; CHECK-NEXT: .LBB24_3: # %for.cond32.preheader.preheader
1380
+ ; CHECK-NEXT: ld.d $a0, $sp, 96
1381
+ ; CHECK-NEXT: ld.d $a1, $sp, 88
1382
+ ; CHECK-NEXT: addi.w $a2, $s6, 0
1383
+ ; CHECK-NEXT: sltui $a2, $a2, 1
1384
+ ; CHECK-NEXT: masknez $a0, $a0, $a2
1385
+ ; CHECK-NEXT: vreplgr2vr.w $vr0, $s6
1386
+ ; CHECK-NEXT: andi $a1, $a1, 1
1387
+ ; CHECK-NEXT: .p2align 4, , 16
1388
+ ; CHECK-NEXT: .LBB24_4: # %for.cond32.preheader
1389
+ ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
1390
+ ; CHECK-NEXT: st.w $a0, $zero, 0
1391
+ ; CHECK-NEXT: vst $vr0, $s2, 0
1392
+ ; CHECK-NEXT: bnez $a1, .LBB24_4
1393
+ ; CHECK-NEXT: # %bb.5: # %for.cond.cleanup
1394
+ ; CHECK-NEXT: move $a0, $zero
1395
+ ; CHECK-NEXT: move $a1, $s3
1396
+ ; CHECK-NEXT: move $a2, $zero
1397
+ ; CHECK-NEXT: move $a3, $zero
1398
+ ; CHECK-NEXT: move $a4, $zero
1399
+ ; CHECK-NEXT: move $a5, $zero
1400
+ ; CHECK-NEXT: jirl $ra, $zero, 0
1401
+ ; CHECK-NEXT: move $a0, $s1
1402
+ ; CHECK-NEXT: move $a1, $s0
1403
+ ; CHECK-NEXT: move $a2, $zero
1404
+ ; CHECK-NEXT: move $a3, $fp
1405
+ ; CHECK-NEXT: jirl $ra, $zero, 0
1406
+ ; CHECK-NEXT: .LBB24_6: # %for.cond32.preheader.us.preheader
1407
+ ; CHECK-NEXT: move $a0, $zero
1408
+ ; CHECK-NEXT: ld.d $s6, $sp, 8 # 8-byte Folded Reload
1409
+ ; CHECK-NEXT: ld.d $s5, $sp, 16 # 8-byte Folded Reload
1410
+ ; CHECK-NEXT: ld.d $s4, $sp, 24 # 8-byte Folded Reload
1411
+ ; CHECK-NEXT: ld.d $s3, $sp, 32 # 8-byte Folded Reload
1412
+ ; CHECK-NEXT: ld.d $s2, $sp, 40 # 8-byte Folded Reload
1413
+ ; CHECK-NEXT: ld.d $s1, $sp, 48 # 8-byte Folded Reload
1414
+ ; CHECK-NEXT: ld.d $s0, $sp, 56 # 8-byte Folded Reload
1415
+ ; CHECK-NEXT: ld.d $fp, $sp, 64 # 8-byte Folded Reload
1416
+ ; CHECK-NEXT: ld.d $ra, $sp, 72 # 8-byte Folded Reload
1417
+ ; CHECK-NEXT: addi.d $sp, $sp, 80
1418
+ ; CHECK-NEXT: ret
1419
+ ;
1420
+ ; NORMV-LABEL: test21:
1421
+ ; NORMV: # %bb.0: # %entry
1422
+ ; NORMV-NEXT: addi.d $sp, $sp, -80
1423
+ ; NORMV-NEXT: .cfi_def_cfa_offset 80
1424
+ ; NORMV-NEXT: st.d $ra, $sp, 72 # 8-byte Folded Spill
1425
+ ; NORMV-NEXT: st.d $fp, $sp, 64 # 8-byte Folded Spill
1426
+ ; NORMV-NEXT: st.d $s0, $sp, 56 # 8-byte Folded Spill
1427
+ ; NORMV-NEXT: st.d $s1, $sp, 48 # 8-byte Folded Spill
1428
+ ; NORMV-NEXT: st.d $s2, $sp, 40 # 8-byte Folded Spill
1429
+ ; NORMV-NEXT: st.d $s3, $sp, 32 # 8-byte Folded Spill
1430
+ ; NORMV-NEXT: st.d $s4, $sp, 24 # 8-byte Folded Spill
1431
+ ; NORMV-NEXT: st.d $s5, $sp, 16 # 8-byte Folded Spill
1432
+ ; NORMV-NEXT: st.d $s6, $sp, 8 # 8-byte Folded Spill
1433
+ ; NORMV-NEXT: .cfi_offset 1, -8
1434
+ ; NORMV-NEXT: .cfi_offset 22, -16
1435
+ ; NORMV-NEXT: .cfi_offset 23, -24
1436
+ ; NORMV-NEXT: .cfi_offset 24, -32
1437
+ ; NORMV-NEXT: .cfi_offset 25, -40
1438
+ ; NORMV-NEXT: .cfi_offset 26, -48
1439
+ ; NORMV-NEXT: .cfi_offset 27, -56
1440
+ ; NORMV-NEXT: .cfi_offset 28, -64
1441
+ ; NORMV-NEXT: .cfi_offset 29, -72
1442
+ ; NORMV-NEXT: ld.d $s6, $sp, 80
1443
+ ; NORMV-NEXT: move $s2, $a7
1444
+ ; NORMV-NEXT: move $s4, $a5
1445
+ ; NORMV-NEXT: move $s0, $a4
1446
+ ; NORMV-NEXT: move $fp, $a3
1447
+ ; NORMV-NEXT: move $s5, $a2
1448
+ ; NORMV-NEXT: move $s3, $a1
1449
+ ; NORMV-NEXT: move $s1, $a0
1450
+ ; NORMV-NEXT: move $a0, $zero
1451
+ ; NORMV-NEXT: jirl $ra, $zero, 0
1452
+ ; NORMV-NEXT: beqz $s4, .LBB24_2
1453
+ ; NORMV-NEXT: # %bb.1: # %if.then26
1454
+ ; NORMV-NEXT: addi.d $a0, $s6, 1
1455
+ ; NORMV-NEXT: addi.w $s6, $a0, 0
1456
+ ; NORMV-NEXT: beqz $s4, .LBB24_3
1457
+ ; NORMV-NEXT: b .LBB24_6
1458
+ ; NORMV-NEXT: .LBB24_2:
1459
+ ; NORMV-NEXT: move $s3, $s5
1460
+ ; NORMV-NEXT: bnez $s4, .LBB24_6
1461
+ ; NORMV-NEXT: .LBB24_3: # %for.cond32.preheader.preheader
1462
+ ; NORMV-NEXT: ld.d $a0, $sp, 96
1463
+ ; NORMV-NEXT: ld.d $a1, $sp, 88
1464
+ ; NORMV-NEXT: addi.w $a2, $s6, 0
1465
+ ; NORMV-NEXT: sltui $a2, $a2, 1
1466
+ ; NORMV-NEXT: masknez $a0, $a0, $a2
1467
+ ; NORMV-NEXT: vreplgr2vr.w $vr0, $s6
1468
+ ; NORMV-NEXT: andi $a1, $a1, 1
1469
+ ; NORMV-NEXT: .p2align 4, , 16
1470
+ ; NORMV-NEXT: .LBB24_4: # %for.cond32.preheader
1471
+ ; NORMV-NEXT: # =>This Inner Loop Header: Depth=1
1472
+ ; NORMV-NEXT: st.w $a0, $zero, 0
1473
+ ; NORMV-NEXT: vst $vr0, $s2, 0
1474
+ ; NORMV-NEXT: bnez $a1, .LBB24_4
1475
+ ; NORMV-NEXT: # %bb.5: # %for.cond.cleanup
1476
+ ; NORMV-NEXT: move $a0, $zero
1477
+ ; NORMV-NEXT: move $a1, $s3
1478
+ ; NORMV-NEXT: move $a2, $zero
1479
+ ; NORMV-NEXT: move $a3, $zero
1480
+ ; NORMV-NEXT: move $a4, $zero
1481
+ ; NORMV-NEXT: move $a5, $zero
1482
+ ; NORMV-NEXT: jirl $ra, $zero, 0
1483
+ ; NORMV-NEXT: move $a0, $s1
1484
+ ; NORMV-NEXT: move $a1, $s0
1485
+ ; NORMV-NEXT: move $a2, $zero
1486
+ ; NORMV-NEXT: move $a3, $fp
1487
+ ; NORMV-NEXT: jirl $ra, $zero, 0
1488
+ ; NORMV-NEXT: .LBB24_6: # %for.cond32.preheader.us.preheader
1489
+ ; NORMV-NEXT: move $a0, $zero
1490
+ ; NORMV-NEXT: ld.d $s6, $sp, 8 # 8-byte Folded Reload
1491
+ ; NORMV-NEXT: ld.d $s5, $sp, 16 # 8-byte Folded Reload
1492
+ ; NORMV-NEXT: ld.d $s4, $sp, 24 # 8-byte Folded Reload
1493
+ ; NORMV-NEXT: ld.d $s3, $sp, 32 # 8-byte Folded Reload
1494
+ ; NORMV-NEXT: ld.d $s2, $sp, 40 # 8-byte Folded Reload
1495
+ ; NORMV-NEXT: ld.d $s1, $sp, 48 # 8-byte Folded Reload
1496
+ ; NORMV-NEXT: ld.d $s0, $sp, 56 # 8-byte Folded Reload
1497
+ ; NORMV-NEXT: ld.d $fp, $sp, 64 # 8-byte Folded Reload
1498
+ ; NORMV-NEXT: ld.d $ra, $sp, 72 # 8-byte Folded Reload
1499
+ ; NORMV-NEXT: addi.d $sp, $sp, 80
1500
+ ; NORMV-NEXT: ret
1501
+ entry:
1502
+ %call4.i.i.i.i = tail call i32 null (ptr null )
1503
+ %conv = trunc i64 %1 to i32
1504
+ br i1 %I , label %if.then26 , label %if.end30
1505
+
1506
+ if.then26: ; preds = %entry
1507
+ %sub27 = add i32 %conv , 1
1508
+ br label %if.end30
1509
+
1510
+ if.end30: ; preds = %if.then26, %entry
1511
+ %Op1.addr.0 = phi ptr [ %Op0 , %if.then26 ], [ %Op1 , %entry ]
1512
+ %ShiftVal.1 = phi i32 [ %sub27 , %if.then26 ], [ %conv , %entry ]
1513
+ br i1 %I , label %for.cond32.preheader.us.preheader , label %for.cond32.preheader.preheader
1514
+
1515
+ for.cond32.preheader.preheader: ; preds = %if.end30
1516
+ %cmp37 = icmp ult i32 %ShiftVal.1 , 1
1517
+ %spec.select = select i1 %cmp37 , i32 0 , i32 %2
1518
+ br label %for.cond32.preheader
1519
+
1520
+ for.cond32.preheader.us.preheader: ; preds = %if.end30
1521
+ ret ptr null
1522
+
1523
+ for.cond32.preheader: ; preds = %for.cond32.preheader, %for.cond32.preheader.preheader
1524
+ store i32 %spec.select , ptr null , align 4
1525
+ %3 = insertelement <4 x i32 > zeroinitializer , i32 %ShiftVal.1 , i64 0
1526
+ %4 = shufflevector <4 x i32 > %3 , <4 x i32 > zeroinitializer , <4 x i32 > zeroinitializer
1527
+ store <4 x i32 > %4 , ptr %a.1 , align 4
1528
+ br i1 %c , label %for.cond32.preheader , label %for.cond.cleanup
1529
+
1530
+ for.cond.cleanup: ; preds = %for.cond32.preheader
1531
+ %call48 = call ptr null (ptr null , ptr %Op1.addr.0 , ptr null , [2 x i64 ] zeroinitializer , ptr null )
1532
+ %call49 = call fastcc ptr null (ptr %B , ptr %M , ptr null , ptr %P )
1533
+ ret ptr null
1534
+ }
0 commit comments