11// RUN: mlir-opt %s -convert-vector-to-llvm -split-input-file | FileCheck %s
22
3+ // TODO: Add tests for for vector.type_cast that would cover scalable vectors
4+
35func.func @bitcast_f32_to_i32_vector_0d (%input: vector <f32 >) -> vector <i32 > {
46 %0 = vector.bitcast %input : vector <f32 > to vector <i32 >
57 return %0 : vector <i32 >
@@ -1467,8 +1469,6 @@ func.func @insert_scalar_into_vec_2d_f32_dynamic_idx(%arg0: vector<1x16xf32>, %a
14671469// CHECK-LABEL: @insert_scalar_into_vec_2d_f32_dynamic_idx(
14681470// CHECK: vector.insert
14691471
1470- // -----
1471-
14721472func.func @insert_scalar_into_vec_2d_f32_dynamic_idx_scalable (%arg0: vector <1 x[16 ]xf32 >, %arg1: f32 , %idx: index )
14731473 -> vector <1 x[16 ]xf32 > {
14741474 %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
14821482
14831483// -----
14841484
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 >> {
14861486 %0 = vector.type_cast %arg0: memref <8 x8 x8 xf32 > to memref <vector <8 x8 x8 xf32 >>
14871487 return %0 : memref <vector <8 x8 x8 xf32 >>
14881488}
1489- // CHECK-LABEL: @vector_type_cast
1489+ // CHECK-LABEL: @type_cast_f32
14901490// CHECK: llvm.mlir.undef : !llvm.struct<(ptr, ptr, i64)>
14911491// CHECK: %[[allocated:.*]] = llvm.extractvalue {{.*}}[0] : !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
14921492// 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
14951495// CHECK: llvm.mlir.constant(0 : index
14961496// CHECK: llvm.insertvalue {{.*}}[2] : !llvm.struct<(ptr, ptr, i64)>
14971497
1498+ // NOTE: No test for scalable vectors - the input memref is fixed size.
1499+
14981500// -----
14991501
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 >> {
15011503 %0 = vector.type_cast %arg0: memref <8 x8 x8 xindex > to memref <vector <8 x8 x8 xindex >>
15021504 return %0 : memref <vector <8 x8 x8 xindex >>
15031505}
1504- // CHECK-LABEL: @vector_index_type_cast (
1506+ // CHECK-LABEL: @type_cast_index (
15051507// CHECK-SAME: %[[A:.*]]: memref<8x8x8xindex>)
15061508// CHECK: %{{.*}} = builtin.unrealized_conversion_cast %[[A]] : memref<8x8x8xindex> to !llvm.struct<(ptr, ptr, i64, array<3 x i64>, array<3 x i64>)>
15071509
15081510// CHECK: %{{.*}} = builtin.unrealized_conversion_cast %{{.*}} : !llvm.struct<(ptr, ptr, i64)> to memref<vector<8x8x8xindex>>
15091511
1512+ // NOTE: No test for scalable vectors - the input memref is fixed size.
1513+
15101514// -----
15111515
15121516func.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
15221526// CHECK: llvm.mlir.constant(0 : index
15231527// CHECK: llvm.insertvalue {{.*}}[2] : !llvm.struct<(ptr<3>, ptr<3>, i64)>
15241528
1529+ // NOTE: No test for scalable vectors - the input memref is fixed size.
1530+
15251531// -----
15261532
1527- func.func @vector_print_scalar_i1 (%arg0: i1 ) {
1533+ func.func @print_scalar_i1 (%arg0: i1 ) {
15281534 vector.print %arg0 : i1
15291535 return
15301536}
15311537//
15321538// Type "boolean" always uses zero extension.
15331539//
1534- // CHECK-LABEL: @vector_print_scalar_i1 (
1540+ // CHECK-LABEL: @print_scalar_i1 (
15351541// CHECK-SAME: %[[A:.*]]: i1)
15361542// CHECK: %[[S:.*]] = arith.extui %[[A]] : i1 to i64
15371543// CHECK: llvm.call @printI64(%[[S]]) : (i64) -> ()
15381544// CHECK: llvm.call @printNewline() : () -> ()
15391545
15401546// -----
15411547
1542- func.func @vector_print_scalar_i4 (%arg0: i4 ) {
1548+ func.func @print_scalar_i4 (%arg0: i4 ) {
15431549 vector.print %arg0 : i4
15441550 return
15451551}
1546- // CHECK-LABEL: @vector_print_scalar_i4 (
1552+ // CHECK-LABEL: @print_scalar_i4 (
15471553// CHECK-SAME: %[[A:.*]]: i4)
15481554// CHECK: %[[S:.*]] = arith.extsi %[[A]] : i4 to i64
15491555// CHECK: llvm.call @printI64(%[[S]]) : (i64) -> ()
15501556// CHECK: llvm.call @printNewline() : () -> ()
15511557
15521558// -----
15531559
1554- func.func @vector_print_scalar_si4 (%arg0: si4 ) {
1560+ func.func @print_scalar_si4 (%arg0: si4 ) {
15551561 vector.print %arg0 : si4
15561562 return
15571563}
1558- // CHECK-LABEL: @vector_print_scalar_si4 (
1564+ // CHECK-LABEL: @print_scalar_si4 (
15591565// CHECK-SAME: %[[A:.*]]: si4)
15601566// CHECK: %[[C:.*]] = builtin.unrealized_conversion_cast %[[A]] : si4 to i4
15611567// CHECK: %[[S:.*]] = arith.extsi %[[C]] : i4 to i64
@@ -1564,11 +1570,11 @@ func.func @vector_print_scalar_si4(%arg0: si4) {
15641570
15651571// -----
15661572
1567- func.func @vector_print_scalar_ui4 (%arg0: ui4 ) {
1573+ func.func @print_scalar_ui4 (%arg0: ui4 ) {
15681574 vector.print %arg0 : ui4
15691575 return
15701576}
1571- // CHECK-LABEL: @vector_print_scalar_ui4 (
1577+ // CHECK-LABEL: @print_scalar_ui4 (
15721578// CHECK-SAME: %[[A:.*]]: ui4)
15731579// CHECK: %[[C:.*]] = builtin.unrealized_conversion_cast %[[A]] : ui4 to i4
15741580// CHECK: %[[S:.*]] = arith.extui %[[C]] : i4 to i64
@@ -1577,47 +1583,47 @@ func.func @vector_print_scalar_ui4(%arg0: ui4) {
15771583
15781584// -----
15791585
1580- func.func @vector_print_scalar_i32 (%arg0: i32 ) {
1586+ func.func @print_scalar_i32 (%arg0: i32 ) {
15811587 vector.print %arg0 : i32
15821588 return
15831589}
1584- // CHECK-LABEL: @vector_print_scalar_i32 (
1590+ // CHECK-LABEL: @print_scalar_i32 (
15851591// CHECK-SAME: %[[A:.*]]: i32)
15861592// CHECK: %[[S:.*]] = arith.extsi %[[A]] : i32 to i64
15871593// CHECK: llvm.call @printI64(%[[S]]) : (i64) -> ()
15881594// CHECK: llvm.call @printNewline() : () -> ()
15891595
15901596// -----
15911597
1592- func.func @vector_print_scalar_ui32 (%arg0: ui32 ) {
1598+ func.func @print_scalar_ui32 (%arg0: ui32 ) {
15931599 vector.print %arg0 : ui32
15941600 return
15951601}
1596- // CHECK-LABEL: @vector_print_scalar_ui32 (
1602+ // CHECK-LABEL: @print_scalar_ui32 (
15971603// CHECK-SAME: %[[A:.*]]: ui32)
15981604// CHECK: %[[C:.*]] = builtin.unrealized_conversion_cast %[[A]] : ui32 to i32
15991605// CHECK: %[[S:.*]] = arith.extui %[[C]] : i32 to i64
16001606// CHECK: llvm.call @printU64(%[[S]]) : (i64) -> ()
16011607
16021608// -----
16031609
1604- func.func @vector_print_scalar_i40 (%arg0: i40 ) {
1610+ func.func @print_scalar_i40 (%arg0: i40 ) {
16051611 vector.print %arg0 : i40
16061612 return
16071613}
1608- // CHECK-LABEL: @vector_print_scalar_i40 (
1614+ // CHECK-LABEL: @print_scalar_i40 (
16091615// CHECK-SAME: %[[A:.*]]: i40)
16101616// CHECK: %[[S:.*]] = arith.extsi %[[A]] : i40 to i64
16111617// CHECK: llvm.call @printI64(%[[S]]) : (i64) -> ()
16121618// CHECK: llvm.call @printNewline() : () -> ()
16131619
16141620// -----
16151621
1616- func.func @vector_print_scalar_si40 (%arg0: si40 ) {
1622+ func.func @print_scalar_si40 (%arg0: si40 ) {
16171623 vector.print %arg0 : si40
16181624 return
16191625}
1620- // CHECK-LABEL: @vector_print_scalar_si40 (
1626+ // CHECK-LABEL: @print_scalar_si40 (
16211627// CHECK-SAME: %[[A:.*]]: si40)
16221628// CHECK: %[[C:.*]] = builtin.unrealized_conversion_cast %[[A]] : si40 to i40
16231629// CHECK: %[[S:.*]] = arith.extsi %[[C]] : i40 to i64
@@ -1626,11 +1632,11 @@ func.func @vector_print_scalar_si40(%arg0: si40) {
16261632
16271633// -----
16281634
1629- func.func @vector_print_scalar_ui40 (%arg0: ui40 ) {
1635+ func.func @print_scalar_ui40 (%arg0: ui40 ) {
16301636 vector.print %arg0 : ui40
16311637 return
16321638}
1633- // CHECK-LABEL: @vector_print_scalar_ui40 (
1639+ // CHECK-LABEL: @print_scalar_ui40 (
16341640// CHECK-SAME: %[[A:.*]]: ui40)
16351641// CHECK: %[[C:.*]] = builtin.unrealized_conversion_cast %[[A]] : ui40 to i40
16361642// CHECK: %[[S:.*]] = arith.extui %[[C]] : i40 to i64
@@ -1639,57 +1645,57 @@ func.func @vector_print_scalar_ui40(%arg0: ui40) {
16391645
16401646// -----
16411647
1642- func.func @vector_print_scalar_i64 (%arg0: i64 ) {
1648+ func.func @print_scalar_i64 (%arg0: i64 ) {
16431649 vector.print %arg0 : i64
16441650 return
16451651}
1646- // CHECK-LABEL: @vector_print_scalar_i64 (
1652+ // CHECK-LABEL: @print_scalar_i64 (
16471653// CHECK-SAME: %[[A:.*]]: i64)
16481654// CHECK: llvm.call @printI64(%[[A]]) : (i64) -> ()
16491655// CHECK: llvm.call @printNewline() : () -> ()
16501656
16511657// -----
16521658
1653- func.func @vector_print_scalar_ui64 (%arg0: ui64 ) {
1659+ func.func @print_scalar_ui64 (%arg0: ui64 ) {
16541660 vector.print %arg0 : ui64
16551661 return
16561662}
1657- // CHECK-LABEL: @vector_print_scalar_ui64 (
1663+ // CHECK-LABEL: @print_scalar_ui64 (
16581664// CHECK-SAME: %[[A:.*]]: ui64)
16591665// CHECK: %[[C:.*]] = builtin.unrealized_conversion_cast %[[A]] : ui64 to i64
16601666// CHECK: llvm.call @printU64(%[[C]]) : (i64) -> ()
16611667// CHECK: llvm.call @printNewline() : () -> ()
16621668
16631669// -----
16641670
1665- func.func @vector_print_scalar_index (%arg0: index ) {
1671+ func.func @print_scalar_index (%arg0: index ) {
16661672 vector.print %arg0 : index
16671673 return
16681674}
1669- // CHECK-LABEL: @vector_print_scalar_index (
1675+ // CHECK-LABEL: @print_scalar_index (
16701676// CHECK-SAME: %[[A:.*]]: index)
16711677// CHECK: %[[C:.*]] = builtin.unrealized_conversion_cast %[[A]] : index to i64
16721678// CHECK: llvm.call @printU64(%[[C]]) : (i64) -> ()
16731679// CHECK: llvm.call @printNewline() : () -> ()
16741680
16751681// -----
16761682
1677- func.func @vector_print_scalar_f32 (%arg0: f32 ) {
1683+ func.func @print_scalar_f32 (%arg0: f32 ) {
16781684 vector.print %arg0 : f32
16791685 return
16801686}
1681- // CHECK-LABEL: @vector_print_scalar_f32 (
1687+ // CHECK-LABEL: @print_scalar_f32 (
16821688// CHECK-SAME: %[[A:.*]]: f32)
16831689// CHECK: llvm.call @printF32(%[[A]]) : (f32) -> ()
16841690// CHECK: llvm.call @printNewline() : () -> ()
16851691
16861692// -----
16871693
1688- func.func @vector_print_scalar_f64 (%arg0: f64 ) {
1694+ func.func @print_scalar_f64 (%arg0: f64 ) {
16891695 vector.print %arg0 : f64
16901696 return
16911697}
1692- // CHECK-LABEL: @vector_print_scalar_f64 (
1698+ // CHECK-LABEL: @print_scalar_f64 (
16931699// CHECK-SAME: %[[A:.*]]: f64)
16941700// CHECK: llvm.call @printF64(%[[A]]) : (f64) -> ()
16951701// CHECK: llvm.call @printNewline() : () -> ()
@@ -1699,46 +1705,50 @@ func.func @vector_print_scalar_f64(%arg0: f64) {
16991705// CHECK-LABEL: module {
17001706// CHECK: llvm.func @printString(!llvm.ptr)
17011707// CHECK: llvm.mlir.global private constant @[[GLOBAL_STR:.*]]({{.*}})
1702- // CHECK: @vector_print_string
1708+ // CHECK: @print_string
17031709// CHECK-NEXT: %[[GLOBAL_ADDR:.*]] = llvm.mlir.addressof @[[GLOBAL_STR]] : !llvm.ptr
17041710// CHECK-NEXT: %[[STR_PTR:.*]] = llvm.getelementptr %[[GLOBAL_ADDR]][0] : (!llvm.ptr) -> !llvm.ptr
17051711// CHECK-NEXT: llvm.call @printString(%[[STR_PTR]]) : (!llvm.ptr) -> ()
1706- func.func @vector_print_string () {
1712+ func.func @print_string () {
17071713 vector.print str " Hello, World!"
17081714 return
17091715}
17101716
17111717// -----
17121718
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 > {
17141720 %0 = vector.extract_strided_slice %arg0 {offsets = [2 ], sizes = [2 ], strides = [1 ]} : vector <4 xf32 > to vector <2 xf32 >
17151721 return %0 : vector <2 xf32 >
17161722}
1717- // CHECK-LABEL: @extract_strided_slice1 (
1723+ // CHECK-LABEL: @extract_strided_slice_f32 (
17181724// CHECK-SAME: %[[A:.*]]: vector<4xf32>)
17191725// CHECK: %[[T0:.*]] = llvm.shufflevector %[[A]], %[[A]] [2, 3] : vector<4xf32>
17201726// CHECK: return %[[T0]] : vector<2xf32>
17211727
1728+ // NOTE: For scalable vectors we could only extract vector<[4]xf32> from vector<[4]xf32>, but that would be a NOP.
1729+
17221730// -----
17231731
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 > {
17251733 %0 = vector.extract_strided_slice %arg0 {offsets = [2 ], sizes = [2 ], strides = [1 ]} : vector <4 xindex > to vector <2 xindex >
17261734 return %0 : vector <2 xindex >
17271735}
1728- // CHECK-LABEL: @extract_strided_index_slice1 (
1736+ // CHECK-LABEL: @extract_strided_slice_index (
17291737// CHECK-SAME: %[[A:.*]]: vector<4xindex>)
17301738// CHECK: %[[T0:.*]] = builtin.unrealized_conversion_cast %[[A]] : vector<4xindex> to vector<4xi64>
17311739// CHECK: %[[T2:.*]] = llvm.shufflevector %[[T0]], %[[T0]] [2, 3] : vector<4xi64>
17321740// CHECK: %[[T3:.*]] = builtin.unrealized_conversion_cast %[[T2]] : vector<2xi64> to vector<2xindex>
17331741// CHECK: return %[[T3]] : vector<2xindex>
17341742
1743+ // NOTE: For scalable vectors we could only extract vector<[4]xindex> from vector<[4]xindex>, but that would be a NOP.
1744+
17351745// -----
17361746
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 > {
17381748 %0 = vector.extract_strided_slice %arg0 {offsets = [2 ], sizes = [2 ], strides = [1 ]} : vector <4 x8 xf32 > to vector <2 x8 xf32 >
17391749 return %0 : vector <2 x8 xf32 >
17401750}
1741- // CHECK-LABEL: @extract_strided_slice2 (
1751+ // CHECK-LABEL: @extract_strided_slice_f32_1d_from_2d (
17421752// CHECK-SAME: %[[ARG:.*]]: vector<4x8xf32>)
17431753// CHECK: %[[A:.*]] = builtin.unrealized_conversion_cast %[[ARG]] : vector<4x8xf32> to !llvm.array<4 x vector<8xf32>>
17441754// 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> {
17491759// CHECK: %[[T5:.*]] = builtin.unrealized_conversion_cast %[[T4]] : !llvm.array<2 x vector<8xf32>> to vector<2x8xf32>
17501760// CHECK: return %[[T5]]
17511761
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+
17521777// -----
17531778
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 > {
17551780 %0 = vector.extract_strided_slice %arg0 {offsets = [2 , 2 ], sizes = [2 , 2 ], strides = [1 , 1 ]} : vector <4 x8 xf32 > to vector <2 x2 xf32 >
17561781 return %0 : vector <2 x2 xf32 >
17571782}
1758- // CHECK-LABEL: @extract_strided_slice3 (
1783+ // CHECK-LABEL: @extract_strided_slice_f32_2d_from_2d (
17591784// CHECK-SAME: %[[ARG:.*]]: vector<4x8xf32>)
17601785// CHECK: %[[A:.*]] = builtin.unrealized_conversion_cast %[[ARG]] : vector<4x8xf32> to !llvm.array<4 x vector<8xf32>>
17611786// 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> {
17691794// CHECK: %[[VAL_12:.*]] = builtin.unrealized_conversion_cast %[[T7]] : !llvm.array<2 x vector<2xf32>> to vector<2x2xf32>
17701795// CHECK: return %[[VAL_12]] : vector<2x2xf32>
17711796
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>
17931816
17941817// -----
17951818
0 commit comments