@@ -1774,3 +1774,45 @@ func.func @from_elements_3d(%arg0: f32, %arg1: f32, %arg2: f32, %arg3: f32) -> v
17741774 %0 = vector.from_elements %arg0 , %arg1 , %arg2 , %arg3 : vector <2 x1 x2 xf32 >
17751775 return %0 : vector <2 x1 x2 xf32 >
17761776}
1777+
1778+ // -----
1779+
1780+ //===----------------------------------------------------------------------===//
1781+ // vector.to_elements
1782+ //===----------------------------------------------------------------------===//
1783+
1784+ // CHECK-LABEL: func @to_elements_1d(
1785+ // CHECK-SAME: %[[ARG0:.+]]: vector<2xf32>
1786+ // CHECK: %[[C0:.+]] = llvm.mlir.constant(0 : i64) : i64
1787+ // CHECK: %[[V0:.+]] = llvm.extractelement %[[ARG0]][%[[C0]] : i64] : vector<2xf32>
1788+ // CHECK: %[[C1:.+]] = llvm.mlir.constant(1 : i64) : i64
1789+ // CHECK: %[[V1:.+]] = llvm.extractelement %[[ARG0]][%[[C1]] : i64] : vector<2xf32>
1790+ // CHECK: return %[[V0]], %[[V1]]
1791+ func.func @to_elements_1d (%arg0: vector <2 xf32 >) -> (f32 , f32 ) {
1792+ %0:2 = vector.to_elements %arg0 : vector <2 xf32 >
1793+ return %0#0 , %0#1 : f32 , f32
1794+ }
1795+
1796+ // -----
1797+
1798+ // NOTE: We unroll multi-dimensional to_elements ops with pattern
1799+ // `UnrollToElements` and then convert the 1-D to_elements ops to llvm.
1800+
1801+ // CHECK-LABEL: func @to_elements_2d(
1802+ // CHECK-SAME: %[[ARG0:.+]]: vector<2x2xf32>
1803+ // CHECK: %[[CAST:.+]] = builtin.unrealized_conversion_cast %[[ARG0]] : vector<2x2xf32> to !llvm.array<2 x vector<2xf32>>
1804+ // CHECK: %[[V0:.+]] = llvm.extractvalue %[[CAST]][0] : !llvm.array<2 x vector<2xf32>>
1805+ // CHECK: %[[V1:.+]] = llvm.extractvalue %[[CAST]][1] : !llvm.array<2 x vector<2xf32>>
1806+ // CHECK: %[[C0:.+]] = llvm.mlir.constant(0 : i64) : i64
1807+ // CHECK: %[[R0:.+]] = llvm.extractelement %[[V0]][%[[C0]] : i64] : vector<2xf32>
1808+ // CHECK: %[[C1:.+]] = llvm.mlir.constant(1 : i64) : i64
1809+ // CHECK: %[[R1:.+]] = llvm.extractelement %[[V0]][%[[C1]] : i64] : vector<2xf32>
1810+ // CHECK: %[[C0:.+]] = llvm.mlir.constant(0 : i64) : i64
1811+ // CHECK: %[[R2:.+]] = llvm.extractelement %[[V1]][%[[C0]] : i64] : vector<2xf32>
1812+ // CHECK: %[[C1:.+]] = llvm.mlir.constant(1 : i64) : i64
1813+ // CHECK: %[[R3:.+]] = llvm.extractelement %[[V1]][%[[C1]] : i64] : vector<2xf32>
1814+ // CHECK: return %[[R0]], %[[R1]], %[[R2]], %[[R3]]
1815+ func.func @to_elements_2d (%arg0: vector <2 x2 xf32 >) -> (f32 , f32 , f32 , f32 ) {
1816+ %0:4 = vector.to_elements %arg0 : vector <2 x2 xf32 >
1817+ return %0#0 , %0#1 , %0#2 , %0#3 : f32 , f32 , f32 , f32
1818+ }
0 commit comments