1
1
// RUN: mlir-opt %s -convert-vector-to-llvm -split-input-file | FileCheck %s
2
2
3
+ // TODO: Add tests for for vector.type_cast that would cover scalable vectors
4
+
3
5
func.func @bitcast_f32_to_i32_vector_0d (%input: vector <f32 >) -> vector <i32 > {
4
6
%0 = vector.bitcast %input : vector <f32 > to vector <i32 >
5
7
return %0 : vector <i32 >
@@ -1467,8 +1469,6 @@ func.func @insert_scalar_into_vec_2d_f32_dynamic_idx(%arg0: vector<1x16xf32>, %a
1467
1469
// CHECK-LABEL: @insert_scalar_into_vec_2d_f32_dynamic_idx(
1468
1470
// CHECK: vector.insert
1469
1471
1470
- // -----
1471
-
1472
1472
func.func @insert_scalar_into_vec_2d_f32_dynamic_idx_scalable (%arg0: vector <1 x[16 ]xf32 >, %arg1: f32 , %idx: index )
1473
1473
-> vector <1 x[16 ]xf32 > {
1474
1474
%0 = vector.insert %arg1 , %arg0 [0 , %idx ]: f32 into vector <1 x[16 ]xf32 >
@@ -1482,11 +1482,11 @@ func.func @insert_scalar_into_vec_2d_f32_dynamic_idx_scalable(%arg0: vector<1x[1
1482
1482
1483
1483
// -----
1484
1484
1485
- func.func @vector_type_cast (%arg0: memref <8 x8 x8 xf32 >) -> memref <vector <8 x8 x8 xf32 >> {
1485
+ func.func @type_cast_f32 (%arg0: memref <8 x8 x8 xf32 >) -> memref <vector <8 x8 x8 xf32 >> {
1486
1486
%0 = vector.type_cast %arg0: memref <8 x8 x8 xf32 > to memref <vector <8 x8 x8 xf32 >>
1487
1487
return %0 : memref <vector <8 x8 x8 xf32 >>
1488
1488
}
1489
- // CHECK-LABEL: @vector_type_cast
1489
+ // CHECK-LABEL: @type_cast_f32
1490
1490
// CHECK: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64)>
1491
1491
// CHECK: %[[allocated:.*]] = llvm.extractvalue {{.*}}[0] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
1492
1492
// CHECK: llvm.insertvalue %[[allocated]], {{.*}}[0] : !llvm.struct<(ptr, ptr, i64)>
@@ -1495,18 +1495,22 @@ func.func @vector_type_cast(%arg0: memref<8x8x8xf32>) -> memref<vector<8x8x8xf32
1495
1495
// CHECK: llvm.mlir.constant(0 : index
1496
1496
// CHECK: llvm.insertvalue {{.*}}[2] : !llvm.struct<(ptr, ptr, i64)>
1497
1497
1498
+ // NOTE: No test for scalable vectors - the input memref is fixed size.
1499
+
1498
1500
// -----
1499
1501
1500
- func.func @vector_index_type_cast (%arg0: memref <8 x8 x8 xindex >) -> memref <vector <8 x8 x8 xindex >> {
1502
+ func.func @type_cast_index (%arg0: memref <8 x8 x8 xindex >) -> memref <vector <8 x8 x8 xindex >> {
1501
1503
%0 = vector.type_cast %arg0: memref <8 x8 x8 xindex > to memref <vector <8 x8 x8 xindex >>
1502
1504
return %0 : memref <vector <8 x8 x8 xindex >>
1503
1505
}
1504
- // CHECK-LABEL: @vector_index_type_cast (
1506
+ // CHECK-LABEL: @type_cast_index (
1505
1507
// CHECK-SAME: %[[A:.*]]: memref<8x8x8xindex>)
1506
1508
// CHECK: %{{.*}} = builtin.unrealized_conversion_cast %[[A]] : memref<8x8x8xindex> to !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
1507
1509
1508
1510
// CHECK: %{{.*}} = builtin.unrealized_conversion_cast %{{.*}} : !llvm.struct<(ptr, ptr, i64)> to memref<vector<8x8x8xindex>>
1509
1511
1512
+ // NOTE: No test for scalable vectors - the input memref is fixed size.
1513
+
1510
1514
// -----
1511
1515
1512
1516
func.func @vector_type_cast_non_zero_addrspace (%arg0: memref <8 x8 x8 xf32 , 3 >) -> memref <vector <8 x8 x8 xf32 >, 3 > {
@@ -1522,40 +1526,42 @@ func.func @vector_type_cast_non_zero_addrspace(%arg0: memref<8x8x8xf32, 3>) -> m
1522
1526
// CHECK: llvm.mlir.constant(0 : index
1523
1527
// CHECK: llvm.insertvalue {{.*}}[2] : !llvm.struct<(ptr<3>, ptr<3>, i64)>
1524
1528
1529
+ // NOTE: No test for scalable vectors - the input memref is fixed size.
1530
+
1525
1531
// -----
1526
1532
1527
- func.func @vector_print_scalar_i1 (%arg0: i1 ) {
1533
+ func.func @print_scalar_i1 (%arg0: i1 ) {
1528
1534
vector.print %arg0 : i1
1529
1535
return
1530
1536
}
1531
1537
//
1532
1538
// Type "boolean" always uses zero extension.
1533
1539
//
1534
- // CHECK-LABEL: @vector_print_scalar_i1 (
1540
+ // CHECK-LABEL: @print_scalar_i1 (
1535
1541
// CHECK-SAME: %[[A:.*]]: i1)
1536
1542
// CHECK: %[[S:.*]] = arith.extui %[[A]] : i1 to i64
1537
1543
// CHECK: llvm.call @printI64(%[[S]]) : (i64) -> ()
1538
1544
// CHECK: llvm.call @printNewline() : () -> ()
1539
1545
1540
1546
// -----
1541
1547
1542
- func.func @vector_print_scalar_i4 (%arg0: i4 ) {
1548
+ func.func @print_scalar_i4 (%arg0: i4 ) {
1543
1549
vector.print %arg0 : i4
1544
1550
return
1545
1551
}
1546
- // CHECK-LABEL: @vector_print_scalar_i4 (
1552
+ // CHECK-LABEL: @print_scalar_i4 (
1547
1553
// CHECK-SAME: %[[A:.*]]: i4)
1548
1554
// CHECK: %[[S:.*]] = arith.extsi %[[A]] : i4 to i64
1549
1555
// CHECK: llvm.call @printI64(%[[S]]) : (i64) -> ()
1550
1556
// CHECK: llvm.call @printNewline() : () -> ()
1551
1557
1552
1558
// -----
1553
1559
1554
- func.func @vector_print_scalar_si4 (%arg0: si4 ) {
1560
+ func.func @print_scalar_si4 (%arg0: si4 ) {
1555
1561
vector.print %arg0 : si4
1556
1562
return
1557
1563
}
1558
- // CHECK-LABEL: @vector_print_scalar_si4 (
1564
+ // CHECK-LABEL: @print_scalar_si4 (
1559
1565
// CHECK-SAME: %[[A:.*]]: si4)
1560
1566
// CHECK: %[[C:.*]] = builtin.unrealized_conversion_cast %[[A]] : si4 to i4
1561
1567
// CHECK: %[[S:.*]] = arith.extsi %[[C]] : i4 to i64
@@ -1564,11 +1570,11 @@ func.func @vector_print_scalar_si4(%arg0: si4) {
1564
1570
1565
1571
// -----
1566
1572
1567
- func.func @vector_print_scalar_ui4 (%arg0: ui4 ) {
1573
+ func.func @print_scalar_ui4 (%arg0: ui4 ) {
1568
1574
vector.print %arg0 : ui4
1569
1575
return
1570
1576
}
1571
- // CHECK-LABEL: @vector_print_scalar_ui4 (
1577
+ // CHECK-LABEL: @print_scalar_ui4 (
1572
1578
// CHECK-SAME: %[[A:.*]]: ui4)
1573
1579
// CHECK: %[[C:.*]] = builtin.unrealized_conversion_cast %[[A]] : ui4 to i4
1574
1580
// CHECK: %[[S:.*]] = arith.extui %[[C]] : i4 to i64
@@ -1577,47 +1583,47 @@ func.func @vector_print_scalar_ui4(%arg0: ui4) {
1577
1583
1578
1584
// -----
1579
1585
1580
- func.func @vector_print_scalar_i32 (%arg0: i32 ) {
1586
+ func.func @print_scalar_i32 (%arg0: i32 ) {
1581
1587
vector.print %arg0 : i32
1582
1588
return
1583
1589
}
1584
- // CHECK-LABEL: @vector_print_scalar_i32 (
1590
+ // CHECK-LABEL: @print_scalar_i32 (
1585
1591
// CHECK-SAME: %[[A:.*]]: i32)
1586
1592
// CHECK: %[[S:.*]] = arith.extsi %[[A]] : i32 to i64
1587
1593
// CHECK: llvm.call @printI64(%[[S]]) : (i64) -> ()
1588
1594
// CHECK: llvm.call @printNewline() : () -> ()
1589
1595
1590
1596
// -----
1591
1597
1592
- func.func @vector_print_scalar_ui32 (%arg0: ui32 ) {
1598
+ func.func @print_scalar_ui32 (%arg0: ui32 ) {
1593
1599
vector.print %arg0 : ui32
1594
1600
return
1595
1601
}
1596
- // CHECK-LABEL: @vector_print_scalar_ui32 (
1602
+ // CHECK-LABEL: @print_scalar_ui32 (
1597
1603
// CHECK-SAME: %[[A:.*]]: ui32)
1598
1604
// CHECK: %[[C:.*]] = builtin.unrealized_conversion_cast %[[A]] : ui32 to i32
1599
1605
// CHECK: %[[S:.*]] = arith.extui %[[C]] : i32 to i64
1600
1606
// CHECK: llvm.call @printU64(%[[S]]) : (i64) -> ()
1601
1607
1602
1608
// -----
1603
1609
1604
- func.func @vector_print_scalar_i40 (%arg0: i40 ) {
1610
+ func.func @print_scalar_i40 (%arg0: i40 ) {
1605
1611
vector.print %arg0 : i40
1606
1612
return
1607
1613
}
1608
- // CHECK-LABEL: @vector_print_scalar_i40 (
1614
+ // CHECK-LABEL: @print_scalar_i40 (
1609
1615
// CHECK-SAME: %[[A:.*]]: i40)
1610
1616
// CHECK: %[[S:.*]] = arith.extsi %[[A]] : i40 to i64
1611
1617
// CHECK: llvm.call @printI64(%[[S]]) : (i64) -> ()
1612
1618
// CHECK: llvm.call @printNewline() : () -> ()
1613
1619
1614
1620
// -----
1615
1621
1616
- func.func @vector_print_scalar_si40 (%arg0: si40 ) {
1622
+ func.func @print_scalar_si40 (%arg0: si40 ) {
1617
1623
vector.print %arg0 : si40
1618
1624
return
1619
1625
}
1620
- // CHECK-LABEL: @vector_print_scalar_si40 (
1626
+ // CHECK-LABEL: @print_scalar_si40 (
1621
1627
// CHECK-SAME: %[[A:.*]]: si40)
1622
1628
// CHECK: %[[C:.*]] = builtin.unrealized_conversion_cast %[[A]] : si40 to i40
1623
1629
// CHECK: %[[S:.*]] = arith.extsi %[[C]] : i40 to i64
@@ -1626,11 +1632,11 @@ func.func @vector_print_scalar_si40(%arg0: si40) {
1626
1632
1627
1633
// -----
1628
1634
1629
- func.func @vector_print_scalar_ui40 (%arg0: ui40 ) {
1635
+ func.func @print_scalar_ui40 (%arg0: ui40 ) {
1630
1636
vector.print %arg0 : ui40
1631
1637
return
1632
1638
}
1633
- // CHECK-LABEL: @vector_print_scalar_ui40 (
1639
+ // CHECK-LABEL: @print_scalar_ui40 (
1634
1640
// CHECK-SAME: %[[A:.*]]: ui40)
1635
1641
// CHECK: %[[C:.*]] = builtin.unrealized_conversion_cast %[[A]] : ui40 to i40
1636
1642
// CHECK: %[[S:.*]] = arith.extui %[[C]] : i40 to i64
@@ -1639,57 +1645,57 @@ func.func @vector_print_scalar_ui40(%arg0: ui40) {
1639
1645
1640
1646
// -----
1641
1647
1642
- func.func @vector_print_scalar_i64 (%arg0: i64 ) {
1648
+ func.func @print_scalar_i64 (%arg0: i64 ) {
1643
1649
vector.print %arg0 : i64
1644
1650
return
1645
1651
}
1646
- // CHECK-LABEL: @vector_print_scalar_i64 (
1652
+ // CHECK-LABEL: @print_scalar_i64 (
1647
1653
// CHECK-SAME: %[[A:.*]]: i64)
1648
1654
// CHECK: llvm.call @printI64(%[[A]]) : (i64) -> ()
1649
1655
// CHECK: llvm.call @printNewline() : () -> ()
1650
1656
1651
1657
// -----
1652
1658
1653
- func.func @vector_print_scalar_ui64 (%arg0: ui64 ) {
1659
+ func.func @print_scalar_ui64 (%arg0: ui64 ) {
1654
1660
vector.print %arg0 : ui64
1655
1661
return
1656
1662
}
1657
- // CHECK-LABEL: @vector_print_scalar_ui64 (
1663
+ // CHECK-LABEL: @print_scalar_ui64 (
1658
1664
// CHECK-SAME: %[[A:.*]]: ui64)
1659
1665
// CHECK: %[[C:.*]] = builtin.unrealized_conversion_cast %[[A]] : ui64 to i64
1660
1666
// CHECK: llvm.call @printU64(%[[C]]) : (i64) -> ()
1661
1667
// CHECK: llvm.call @printNewline() : () -> ()
1662
1668
1663
1669
// -----
1664
1670
1665
- func.func @vector_print_scalar_index (%arg0: index ) {
1671
+ func.func @print_scalar_index (%arg0: index ) {
1666
1672
vector.print %arg0 : index
1667
1673
return
1668
1674
}
1669
- // CHECK-LABEL: @vector_print_scalar_index (
1675
+ // CHECK-LABEL: @print_scalar_index (
1670
1676
// CHECK-SAME: %[[A:.*]]: index)
1671
1677
// CHECK: %[[C:.*]] = builtin.unrealized_conversion_cast %[[A]] : index to i64
1672
1678
// CHECK: llvm.call @printU64(%[[C]]) : (i64) -> ()
1673
1679
// CHECK: llvm.call @printNewline() : () -> ()
1674
1680
1675
1681
// -----
1676
1682
1677
- func.func @vector_print_scalar_f32 (%arg0: f32 ) {
1683
+ func.func @print_scalar_f32 (%arg0: f32 ) {
1678
1684
vector.print %arg0 : f32
1679
1685
return
1680
1686
}
1681
- // CHECK-LABEL: @vector_print_scalar_f32 (
1687
+ // CHECK-LABEL: @print_scalar_f32 (
1682
1688
// CHECK-SAME: %[[A:.*]]: f32)
1683
1689
// CHECK: llvm.call @printF32(%[[A]]) : (f32) -> ()
1684
1690
// CHECK: llvm.call @printNewline() : () -> ()
1685
1691
1686
1692
// -----
1687
1693
1688
- func.func @vector_print_scalar_f64 (%arg0: f64 ) {
1694
+ func.func @print_scalar_f64 (%arg0: f64 ) {
1689
1695
vector.print %arg0 : f64
1690
1696
return
1691
1697
}
1692
- // CHECK-LABEL: @vector_print_scalar_f64 (
1698
+ // CHECK-LABEL: @print_scalar_f64 (
1693
1699
// CHECK-SAME: %[[A:.*]]: f64)
1694
1700
// CHECK: llvm.call @printF64(%[[A]]) : (f64) -> ()
1695
1701
// CHECK: llvm.call @printNewline() : () -> ()
@@ -1699,46 +1705,50 @@ func.func @vector_print_scalar_f64(%arg0: f64) {
1699
1705
// CHECK-LABEL: module {
1700
1706
// CHECK: llvm.func @printString(!llvm.ptr)
1701
1707
// CHECK: llvm.mlir.global private constant @[[GLOBAL_STR:.*]]({{.*}})
1702
- // CHECK: @vector_print_string
1708
+ // CHECK: @print_string
1703
1709
// CHECK-NEXT: %[[GLOBAL_ADDR:.*]] = llvm.mlir.addressof @[[GLOBAL_STR]] : !llvm.ptr
1704
1710
// CHECK-NEXT: %[[STR_PTR:.*]] = llvm.getelementptr %[[GLOBAL_ADDR]][0] : (!llvm.ptr) -> !llvm.ptr
1705
1711
// CHECK-NEXT: llvm.call @printString(%[[STR_PTR]]) : (!llvm.ptr) -> ()
1706
- func.func @vector_print_string () {
1712
+ func.func @print_string () {
1707
1713
vector.print str " Hello, World!"
1708
1714
return
1709
1715
}
1710
1716
1711
1717
// -----
1712
1718
1713
- func.func @extract_strided_slice1 (%arg0: vector <4 xf32 >) -> vector <2 xf32 > {
1719
+ func.func @extract_strided_slice_f32 (%arg0: vector <4 xf32 >) -> vector <2 xf32 > {
1714
1720
%0 = vector.extract_strided_slice %arg0 {offsets = [2 ], sizes = [2 ], strides = [1 ]} : vector <4 xf32 > to vector <2 xf32 >
1715
1721
return %0 : vector <2 xf32 >
1716
1722
}
1717
- // CHECK-LABEL: @extract_strided_slice1 (
1723
+ // CHECK-LABEL: @extract_strided_slice_f32 (
1718
1724
// CHECK-SAME: %[[A:.*]]: vector<4xf32>)
1719
1725
// CHECK: %[[T0:.*]] = llvm.shufflevector %[[A]], %[[A]] [2, 3] : vector<4xf32>
1720
1726
// CHECK: return %[[T0]] : vector<2xf32>
1721
1727
1728
+ // NOTE: For scalable vectors we could only extract vector<[4]xf32> from vector<[4]xf32>, but that would be a NOP.
1729
+
1722
1730
// -----
1723
1731
1724
- func.func @extract_strided_index_slice1 (%arg0: vector <4 xindex >) -> vector <2 xindex > {
1732
+ func.func @extract_strided_slice_index (%arg0: vector <4 xindex >) -> vector <2 xindex > {
1725
1733
%0 = vector.extract_strided_slice %arg0 {offsets = [2 ], sizes = [2 ], strides = [1 ]} : vector <4 xindex > to vector <2 xindex >
1726
1734
return %0 : vector <2 xindex >
1727
1735
}
1728
- // CHECK-LABEL: @extract_strided_index_slice1 (
1736
+ // CHECK-LABEL: @extract_strided_slice_index (
1729
1737
// CHECK-SAME: %[[A:.*]]: vector<4xindex>)
1730
1738
// CHECK: %[[T0:.*]] = builtin.unrealized_conversion_cast %[[A]] : vector<4xindex> to vector<4xi64>
1731
1739
// CHECK: %[[T2:.*]] = llvm.shufflevector %[[T0]], %[[T0]] [2, 3] : vector<4xi64>
1732
1740
// CHECK: %[[T3:.*]] = builtin.unrealized_conversion_cast %[[T2]] : vector<2xi64> to vector<2xindex>
1733
1741
// CHECK: return %[[T3]] : vector<2xindex>
1734
1742
1743
+ // NOTE: For scalable vectors we could only extract vector<[4]xindex> from vector<[4]xindex>, but that would be a NOP.
1744
+
1735
1745
// -----
1736
1746
1737
- func.func @extract_strided_slice2 (%arg0: vector <4 x8 xf32 >) -> vector <2 x8 xf32 > {
1747
+ func.func @extract_strided_slice_f32_1d_from_2d (%arg0: vector <4 x8 xf32 >) -> vector <2 x8 xf32 > {
1738
1748
%0 = vector.extract_strided_slice %arg0 {offsets = [2 ], sizes = [2 ], strides = [1 ]} : vector <4 x8 xf32 > to vector <2 x8 xf32 >
1739
1749
return %0 : vector <2 x8 xf32 >
1740
1750
}
1741
- // CHECK-LABEL: @extract_strided_slice2 (
1751
+ // CHECK-LABEL: @extract_strided_slice_f32_1d_from_2d (
1742
1752
// CHECK-SAME: %[[ARG:.*]]: vector<4x8xf32>)
1743
1753
// CHECK: %[[A:.*]] = builtin.unrealized_conversion_cast %[[ARG]] : vector<4x8xf32> to !llvm.array<4 x vector<8xf32>>
1744
1754
// CHECK: %[[T0:.*]] = llvm.mlir.undef : !llvm.array<2 x vector<8xf32>>
@@ -1749,13 +1759,28 @@ func.func @extract_strided_slice2(%arg0: vector<4x8xf32>) -> vector<2x8xf32> {
1749
1759
// CHECK: %[[T5:.*]] = builtin.unrealized_conversion_cast %[[T4]] : !llvm.array<2 x vector<8xf32>> to vector<2x8xf32>
1750
1760
// CHECK: return %[[T5]]
1751
1761
1762
+ func.func @extract_strided_slice_f32_1d_from_2d_scalable (%arg0: vector <4 x[8 ]xf32 >) -> vector <2 x[8 ]xf32 > {
1763
+ %0 = vector.extract_strided_slice %arg0 {offsets = [2 ], sizes = [2 ], strides = [1 ]} : vector <4 x[8 ]xf32 > to vector <2 x[8 ]xf32 >
1764
+ return %0 : vector <2 x[8 ]xf32 >
1765
+ }
1766
+ // CHECK-LABEL: func.func @extract_strided_slice_f32_1d_from_2d_scalable(
1767
+ // CHECK-SAME: %[[ARG:.*]]: vector<4x[8]xf32>)
1768
+ // CHECK: %[[A:.*]] = builtin.unrealized_conversion_cast %[[ARG]] : vector<4x[8]xf32> to !llvm.array<4 x vector<[8]xf32>>
1769
+ // CHECK: %[[T0:.*]] = llvm.mlir.undef : !llvm.array<2 x vector<[8]xf32>>
1770
+ // CHECK: %[[T1:.*]] = llvm.extractvalue %[[A]][2] : !llvm.array<4 x vector<[8]xf32>>
1771
+ // CHECK: %[[T2:.*]] = llvm.insertvalue %[[T1]], %[[T0]][0] : !llvm.array<2 x vector<[8]xf32>>
1772
+ // CHECK: %[[T3:.*]] = llvm.extractvalue %[[A]][3] : !llvm.array<4 x vector<[8]xf32>>
1773
+ // CHECK: %[[T4:.*]] = llvm.insertvalue %[[T3]], %[[T2]][1] : !llvm.array<2 x vector<[8]xf32>>
1774
+ // CHECK: %[[T5:.*]] = builtin.unrealized_conversion_cast %[[T4]] : !llvm.array<2 x vector<[8]xf32>> to vector<2x[8]xf32>
1775
+ // CHECK: return %[[T5]]
1776
+
1752
1777
// -----
1753
1778
1754
- func.func @extract_strided_slice3 (%arg0: vector <4 x8 xf32 >) -> vector <2 x2 xf32 > {
1779
+ func.func @extract_strided_slice_f32_2d_from_2d (%arg0: vector <4 x8 xf32 >) -> vector <2 x2 xf32 > {
1755
1780
%0 = vector.extract_strided_slice %arg0 {offsets = [2 , 2 ], sizes = [2 , 2 ], strides = [1 , 1 ]} : vector <4 x8 xf32 > to vector <2 x2 xf32 >
1756
1781
return %0 : vector <2 x2 xf32 >
1757
1782
}
1758
- // CHECK-LABEL: @extract_strided_slice3 (
1783
+ // CHECK-LABEL: @extract_strided_slice_f32_2d_from_2d (
1759
1784
// CHECK-SAME: %[[ARG:.*]]: vector<4x8xf32>)
1760
1785
// CHECK: %[[A:.*]] = builtin.unrealized_conversion_cast %[[ARG]] : vector<4x8xf32> to !llvm.array<4 x vector<8xf32>>
1761
1786
// CHECK: %[[VAL_2:.*]] = arith.constant dense<0.000000e+00> : vector<2x2xf32>
@@ -1769,27 +1794,25 @@ func.func @extract_strided_slice3(%arg0: vector<4x8xf32>) -> vector<2x2xf32> {
1769
1794
// CHECK: %[[VAL_12:.*]] = builtin.unrealized_conversion_cast %[[T7]] : !llvm.array<2 x vector<2xf32>> to vector<2x2xf32>
1770
1795
// CHECK: return %[[VAL_12]] : vector<2x2xf32>
1771
1796
1772
- // -----
1773
-
1774
- func.func @extract_strided_slice_scalable (%arg0 : vector <1 x4 x[4 ]xi32 >) -> vector <1 x1 x[4 ]xi32 > {
1775
- %0 = vector.extract_strided_slice %arg0 {offsets = [0 , 3 , 0 ], sizes = [1 , 1 , 4 ], strides = [1 , 1 , 1 ]} : vector <1 x4 x[4 ]xi32 > to vector <1 x1 x[4 ]xi32 >
1776
- return %0 : vector <1 x1 x[4 ]xi32 >
1777
- }
1778
-
1779
- // CHECK-LABEL: func.func @extract_strided_slice_scalable(
1780
- // CHECK-SAME: %[[ARG_0:.*]]: vector<1x4x[4]xi32>) -> vector<1x1x[4]xi32> {
1781
-
1782
- // CHECK: %[[CAST_1:.*]] = builtin.unrealized_conversion_cast %[[ARG_0]] : vector<1x4x[4]xi32> to !llvm.array<1 x array<4 x vector<[4]xi32>>>
1783
- // CHECK: %[[CST:.*]] = arith.constant dense<0> : vector<1x1x[4]xi32>
1784
- // CHECK: %[[CAST_2:.*]] = builtin.unrealized_conversion_cast %[[CST]] : vector<1x1x[4]xi32> to !llvm.array<1 x array<1 x vector<[4]xi32>>>
1785
- // CHECK: %[[CST_1:.*]] = arith.constant dense<0> : vector<1x[4]xi32>
1786
- // CHECK: %[[CAST_3:.*]] = builtin.unrealized_conversion_cast %[[CST_1]] : vector<1x[4]xi32> to !llvm.array<1 x vector<[4]xi32>>
1787
-
1788
- // CHECK: %[[EXT:.*]] = llvm.extractvalue %[[CAST_1]][0, 3] : !llvm.array<1 x array<4 x vector<[4]xi32>>>
1789
- // CHECK: %[[INS_1:.*]] = llvm.insertvalue %[[EXT]], %[[CAST_3]][0] : !llvm.array<1 x vector<[4]xi32>>
1790
- // CHECK: %[[INS_2:.*]] = llvm.insertvalue %[[INS_1]], %[[CAST_2]][0] : !llvm.array<1 x array<1 x vector<[4]xi32>>>
1791
-
1792
- // CHECK: builtin.unrealized_conversion_cast %[[INS_2]] : !llvm.array<1 x array<1 x vector<[4]xi32>>> to vector<1x1x[4]xi32>
1797
+ // NOTE: For scalable vectors, we can only extract "full" scalable dimensions
1798
+ // (e.g. [8] from [8], but not [4] from [8]).
1799
+
1800
+ func.func @extract_strided_slice_f32_2d_from_2d_scalable (%arg0: vector <4 x[8 ]xf32 >) -> vector <2 x[8 ]xf32 > {
1801
+ %0 = vector.extract_strided_slice %arg0 {offsets = [2 , 0 ], sizes = [2 , 8 ], strides = [1 , 1 ]} : vector <4 x[8 ]xf32 > to vector <2 x[8 ]xf32 >
1802
+ return %0 : vector <2 x[8 ]xf32 >
1803
+ }
1804
+ // CHECK-LABEL: @extract_strided_slice_f32_2d_from_2d_scalable(
1805
+ // CHECK-SAME: %[[ARG:.*]]: vector<4x[8]xf32>)
1806
+ // CHECK: %[[T1:.*]] = builtin.unrealized_conversion_cast %[[ARG]] : vector<4x[8]xf32> to !llvm.array<4 x vector<[8]xf32>>
1807
+ // CHECK: %[[T2:.*]] = arith.constant 0.000000e+00 : f32
1808
+ // CHECK: %[[T3:.*]] = arith.constant dense<0.000000e+00> : vector<2x[8]xf32>
1809
+ // CHECK: %[[T4:.*]] = builtin.unrealized_conversion_cast %[[T3]] : vector<2x[8]xf32> to !llvm.array<2 x vector<[8]xf32>>
1810
+ // CHECK: %[[T5:.*]] = llvm.extractvalue %[[T1]][2] : !llvm.array<4 x vector<[8]xf32>>
1811
+ // CHECK: %[[T6:.*]] = llvm.insertvalue %[[T5]], %[[T4]][0] : !llvm.array<2 x vector<[8]xf32>>
1812
+ // CHECK: %[[T7:.*]] = llvm.extractvalue %[[T1]][3] : !llvm.array<4 x vector<[8]xf32>>
1813
+ // CHECK: %[[T8:.*]] = llvm.insertvalue %[[T7]], %[[T6]][1] : !llvm.array<2 x vector<[8]xf32>>
1814
+ // CHECK: %[[T9:.*]] = builtin.unrealized_conversion_cast %[[T8]] : !llvm.array<2 x vector<[8]xf32>> to vector<2x[8]xf32>
1815
+ // CHECK: return %[[T9]] : vector<2x[8]xf32>
1793
1816
1794
1817
// -----
1795
1818
0 commit comments