Skip to content

Commit 54a8e7d

Browse files
committed
More fixups
1 parent 6f5105c commit 54a8e7d

File tree

7 files changed

+123
-106
lines changed

7 files changed

+123
-106
lines changed

mlir/include/mlir/Dialect/ArmSME/IR/ArmSMEOpInterfaces.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ namespace detail {
1717
LogicalResult verifyArmSMETileOpInterface(Operation *);
1818
}
1919

20+
// The first in-memory SME tile ID. This is set to 16 as that is the first tile
21+
// ID larger than any virtual tile ID supported by the SME ISA.
2022
static constexpr unsigned kInMemoryTileIdBase = 16;
23+
2124
#include "mlir/Dialect/ArmSME/IR/ArmSMEOpInterfaces.h.inc"
2225
} // namespace mlir::arm_sme
2326

mlir/include/mlir/Dialect/ArmSME/Transforms/Passes.td

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,20 +126,20 @@ def EnableArmStreaming
126126

127127
def TestTileAllocation
128128
: Pass<"test-arm-sme-tile-allocation", "mlir::func::FuncOp"> {
129-
let summary = "Tests SME tile allocation";
129+
let summary = "Tests SME 'virtual tile' allocation";
130130
let description = [{
131131
This pass does tile allocation for SME "virtual tiles". It is run at the
132132
'func.func' op level, and assigns tile IDs (via an attribute) to all ops
133133
that implement the `ArmSMETileOpInterface`. Note: This pass is only intended
134134
to be used for testing, tile allocation is done as part of the ArmSME to
135-
LLVM conversion.
135+
LLVM conversion (`convert-arm-sme-to-llvm`).
136136
}];
137137
let options = [
138138
Option<"dumpTileLiveRanges", "dump-tile-live-ranges",
139139
"bool", /*default=*/"false",
140140
"Dump the live ranges of SME tiles (for debugging)">
141141
];
142-
let dependentDialects = ["func::FuncDialect"];
142+
let dependentDialects = ["func::FuncDialect", "arm_sme::ArmSMEDialect"];
143143
}
144144

145145
def OuterProductFusion

mlir/lib/Conversion/ArmSMEToLLVM/ArmSMEToLLVM.cpp

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -885,34 +885,38 @@ struct ConvertArmSMEToLLVMPass
885885
void mlir::configureArmSMEToLLVMConversionLegality(ConversionTarget &target) {
886886
target.addIllegalDialect<arm_sme::ArmSMEDialect>();
887887
target.addLegalOp<
888-
arm_sme::GetTileOp, arm_sme::CopyTileOp, arm_sme::aarch64_sme_zero,
889-
arm_sme::aarch64_sme_str, arm_sme::aarch64_sme_ld1b_horiz,
890-
arm_sme::aarch64_sme_ld1h_horiz, arm_sme::aarch64_sme_ld1w_horiz,
891-
arm_sme::aarch64_sme_ld1d_horiz, arm_sme::aarch64_sme_ld1q_horiz,
892-
arm_sme::aarch64_sme_st1b_horiz, arm_sme::aarch64_sme_st1h_horiz,
893-
arm_sme::aarch64_sme_st1w_horiz, arm_sme::aarch64_sme_st1d_horiz,
894-
arm_sme::aarch64_sme_st1q_horiz, arm_sme::aarch64_sme_ld1b_vert,
895-
arm_sme::aarch64_sme_ld1h_vert, arm_sme::aarch64_sme_ld1w_vert,
896-
arm_sme::aarch64_sme_ld1d_vert, arm_sme::aarch64_sme_ld1q_vert,
897-
arm_sme::aarch64_sme_st1b_vert, arm_sme::aarch64_sme_st1h_vert,
898-
arm_sme::aarch64_sme_st1w_vert, arm_sme::aarch64_sme_st1d_vert,
899-
arm_sme::aarch64_sme_st1q_vert, arm_sme::aarch64_sme_read_horiz,
900-
arm_sme::aarch64_sme_read_vert, arm_sme::aarch64_sme_write_horiz,
901-
arm_sme::aarch64_sme_write_vert, arm_sme::aarch64_sme_mopa,
902-
arm_sme::aarch64_sme_mopa_wide, arm_sme::aarch64_sme_mops_wide,
903-
arm_sme::aarch64_sme_smopa_wide, arm_sme::aarch64_sme_smops_wide,
904-
arm_sme::aarch64_sme_umopa_wide, arm_sme::aarch64_sme_umops_wide,
905-
arm_sme::aarch64_sme_smopa_za32, arm_sme::aarch64_sme_smops_za32,
906-
arm_sme::aarch64_sme_umopa_za32, arm_sme::aarch64_sme_umops_za32,
907-
arm_sme::aarch64_sme_sumopa_wide, arm_sme::aarch64_sme_sumops_wide,
908-
arm_sme::aarch64_sme_usmopa_wide, arm_sme::aarch64_sme_usmops_wide,
909-
arm_sme::aarch64_sme_cntsb, arm_sme::aarch64_sme_cntsh,
910-
arm_sme::aarch64_sme_cntsw, arm_sme::aarch64_sme_cntsd>();
888+
arm_sme::aarch64_sme_zero, arm_sme::aarch64_sme_str,
889+
arm_sme::aarch64_sme_ld1b_horiz, arm_sme::aarch64_sme_ld1h_horiz,
890+
arm_sme::aarch64_sme_ld1w_horiz, arm_sme::aarch64_sme_ld1d_horiz,
891+
arm_sme::aarch64_sme_ld1q_horiz, arm_sme::aarch64_sme_st1b_horiz,
892+
arm_sme::aarch64_sme_st1h_horiz, arm_sme::aarch64_sme_st1w_horiz,
893+
arm_sme::aarch64_sme_st1d_horiz, arm_sme::aarch64_sme_st1q_horiz,
894+
arm_sme::aarch64_sme_ld1b_vert, arm_sme::aarch64_sme_ld1h_vert,
895+
arm_sme::aarch64_sme_ld1w_vert, arm_sme::aarch64_sme_ld1d_vert,
896+
arm_sme::aarch64_sme_ld1q_vert, arm_sme::aarch64_sme_st1b_vert,
897+
arm_sme::aarch64_sme_st1h_vert, arm_sme::aarch64_sme_st1w_vert,
898+
arm_sme::aarch64_sme_st1d_vert, arm_sme::aarch64_sme_st1q_vert,
899+
arm_sme::aarch64_sme_read_horiz, arm_sme::aarch64_sme_read_vert,
900+
arm_sme::aarch64_sme_write_horiz, arm_sme::aarch64_sme_write_vert,
901+
arm_sme::aarch64_sme_mopa, arm_sme::aarch64_sme_mopa_wide,
902+
arm_sme::aarch64_sme_mops_wide, arm_sme::aarch64_sme_smopa_wide,
903+
arm_sme::aarch64_sme_smops_wide, arm_sme::aarch64_sme_umopa_wide,
904+
arm_sme::aarch64_sme_umops_wide, arm_sme::aarch64_sme_smopa_za32,
905+
arm_sme::aarch64_sme_smops_za32, arm_sme::aarch64_sme_umopa_za32,
906+
arm_sme::aarch64_sme_umops_za32, arm_sme::aarch64_sme_sumopa_wide,
907+
arm_sme::aarch64_sme_sumops_wide, arm_sme::aarch64_sme_usmopa_wide,
908+
arm_sme::aarch64_sme_usmops_wide, arm_sme::aarch64_sme_cntsb,
909+
arm_sme::aarch64_sme_cntsh, arm_sme::aarch64_sme_cntsw,
910+
arm_sme::aarch64_sme_cntsd>();
911911
target.addLegalDialect<arith::ArithDialect,
912912
/* The following are used to lower tile spills/fills */
913913
vector::VectorDialect, scf::SCFDialect,
914914
memref::MemRefDialect>();
915-
target.addLegalOp<UnrealizedConversionCastOp>();
915+
// Pseudo operations. These cannot be code-generated but may exist in the
916+
// input IR, or be generated during the conversion. They need to be eliminated
917+
// before the final conversion to LLVM IR (and likely will be due to DCE).
918+
target.addLegalOp<arm_sme::GetTileOp, arm_sme::CopyTileOp,
919+
UnrealizedConversionCastOp>();
916920
}
917921

918922
void mlir::populateArmSMEToLLVMConversionPatterns(LLVMTypeConverter &converter,

mlir/test/Conversion/ArmSMEToLLVM/arm-sme-to-llvm.mlir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: mlir-opt %s --pass-pipeline="builtin.module(func.func(convert-arm-sme-to-llvm,cse,canonicalize))" -split-input-file -verify-diagnostics | FileCheck %s
1+
// RUN: mlir-opt %s --pass-pipeline="builtin.module(func.func(convert-arm-sme-to-llvm,cse,canonicalize))" -split-input-file | FileCheck %s
22
// Test conversion of ArmSME ops to LLVM intrinsics.
33

44
//===----------------------------------------------------------------------===//

mlir/test/Dialect/ArmSME/basic-tile-allocation.mlir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: mlir-opt %s -test-arm-sme-tile-allocation -split-input-file -verify-diagnostics | FileCheck %s
1+
// RUN: mlir-opt %s -test-arm-sme-tile-allocation -split-input-file | FileCheck %s
22

33
// -----
44

mlir/test/Dialect/ArmSME/tile-allocation-invalid.mlir

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
// RUN: mlir-opt %s -convert-scf-to-cf -test-arm-sme-tile-allocation -split-input-file -verify-diagnostics
2-
3-
// -----
1+
// RUN: mlir-opt %s -convert-scf-to-cf -test-arm-sme-tile-allocation -verify-diagnostics
42

53
// Select between tileA and tileB. This is currently unsupported as it would
64
// require inserting (runtime) tile moves.

mlir/test/Dialect/ArmSME/tile-allocation-liveness.mlir

Lines changed: 86 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33

44
// This file tests some simple aspects of using liveness in the SME tile allocator.
55

6-
// CHECK-LIVE-RANGE: ========== Coalesced Live Ranges:
7-
// CHECK-LIVE-RANGE-NEXT: @constant_with_multiple_users
8-
// CHECK-LIVE-RANGE: ^bb0:
9-
// CHECK-LIVE-RANGE: S arm_sme.zero
10-
// CHECK-LIVE-RANGE-NEXT: |S arm_sme.move_vector_to_tile_slice
11-
// CHECK-LIVE-RANGE-NEXT: || arm_sme.move_vector_to_tile_slice
12-
// CHECK-LIVE-RANGE-NEXT: |E test.some_use
13-
// CHECK-LIVE-RANGE-NEXT: E test.some_use
6+
// CHECK-LIVE-RANGE-LABEL: @constant_with_multiple_users
7+
// CHECK-LIVE-RANGE: ========== Coalesced Live Ranges:
8+
// CHECK-LIVE-RANGE: ^bb0:
9+
// CHECK-LIVE-RANGE: S arm_sme.zero
10+
// CHECK-LIVE-RANGE-NEXT: |S arm_sme.move_vector_to_tile_slice
11+
// CHECK-LIVE-RANGE-NEXT: || arm_sme.move_vector_to_tile_slice
12+
// CHECK-LIVE-RANGE-NEXT: |E test.some_use
13+
// CHECK-LIVE-RANGE-NEXT: E test.some_use
1414

1515
// CHECK-LABEL: @constant_with_multiple_users(
1616
// CHECK-SAME: %[[VECTOR_A:.*]]: vector<[4]xf32>, %[[VECTOR_B:.*]]: vector<[4]xf32>
@@ -29,13 +29,13 @@ func.func @constant_with_multiple_users(%a: vector<[4]xf32>, %b: vector<[4]xf32>
2929

3030
// -----
3131

32-
// CHECK-LIVE-RANGE: ========== Coalesced Live Ranges:
33-
// CHECK-LIVE-RANGE-NEXT: @value_with_multiple_users
34-
// CHECK-LIVE-RANGE: ^bb0:
35-
// CHECK-LIVE-RANGE-NEXT: |S arm_sme.move_vector_to_tile_slice
36-
// CHECK-LIVE-RANGE-NEXT: || arm_sme.move_vector_to_tile_slice
37-
// CHECK-LIVE-RANGE-NEXT: |E test.some_use
38-
// CHECK-LIVE-RANGE-NEXT: E test.some_use
32+
// CHECK-LIVE-RANGE-LABEL: @value_with_multiple_users
33+
// CHECK-LIVE-RANGE: ========== Coalesced Live Ranges:
34+
// CHECK-LIVE-RANGE: ^bb0:
35+
// CHECK-LIVE-RANGE-NEXT: |S arm_sme.move_vector_to_tile_slice
36+
// CHECK-LIVE-RANGE-NEXT: || arm_sme.move_vector_to_tile_slice
37+
// CHECK-LIVE-RANGE-NEXT: |E test.some_use
38+
// CHECK-LIVE-RANGE-NEXT: E test.some_use
3939

4040
func.func @value_with_multiple_users(%tile: vector<[4]x[4]xf32>, %a: vector<[4]xf32>, %b: vector<[4]xf32>, %index: index) {
4141
// expected-error@below {{op failed to rectify tile operand with tile result (move required)}}
@@ -48,31 +48,31 @@ func.func @value_with_multiple_users(%tile: vector<[4]x[4]xf32>, %a: vector<[4]x
4848

4949
// -----
5050

51-
// CHECK-LIVE-RANGE: ========== Coalesced Live Ranges:
52-
// CHECK-LIVE-RANGE-NEXT: @reuse_tiles_after_initial_use
53-
// CHECK-LIVE-RANGE: ^bb0:
54-
// CHECK-LIVE-RANGE-NEXT: S arm_sme.get_tile
55-
// CHECK-LIVE-RANGE-NEXT: |S arm_sme.get_tile
56-
// CHECK-LIVE-RANGE-NEXT: ||S arm_sme.get_tile
57-
// CHECK-LIVE-RANGE-NEXT: |||S arm_sme.get_tile
58-
// CHECK-LIVE-RANGE-NEXT: |||| test.dummy
59-
// CHECK-LIVE-RANGE-NEXT: |||| test.dummy
60-
// CHECK-LIVE-RANGE-NEXT: |||| test.dummy
61-
// CHECK-LIVE-RANGE-NEXT: E||| test.some_use
62-
// CHECK-LIVE-RANGE-NEXT: E|| test.some_use
63-
// CHECK-LIVE-RANGE-NEXT: E| test.some_use
64-
// CHECK-LIVE-RANGE-NEXT: E test.some_use
65-
// CHECK-LIVE-RANGE-NEXT: S arm_sme.zero
66-
// CHECK-LIVE-RANGE-NEXT: |S arm_sme.zero
67-
// CHECK-LIVE-RANGE-NEXT: ||S arm_sme.zero
68-
// CHECK-LIVE-RANGE-NEXT: |||S arm_sme.zero
69-
// CHECK-LIVE-RANGE-NEXT: |||| test.dummy
70-
// CHECK-LIVE-RANGE-NEXT: |||| test.dummy
71-
// CHECK-LIVE-RANGE-NEXT: |||| test.dummy
72-
// CHECK-LIVE-RANGE-NEXT: E||| test.some_use
73-
// CHECK-LIVE-RANGE-NEXT: E|| test.some_use
74-
// CHECK-LIVE-RANGE-NEXT: E| test.some_use
75-
// CHECK-LIVE-RANGE-NEXT: E test.some_use
51+
// CHECK-LIVE-RANGE-LABEL: @reuse_tiles_after_initial_use
52+
// CHECK-LIVE-RANGE: ========== Coalesced Live Ranges:
53+
// CHECK-LIVE-RANGE: ^bb0:
54+
// CHECK-LIVE-RANGE-NEXT: S arm_sme.get_tile
55+
// CHECK-LIVE-RANGE-NEXT: |S arm_sme.get_tile
56+
// CHECK-LIVE-RANGE-NEXT: ||S arm_sme.get_tile
57+
// CHECK-LIVE-RANGE-NEXT: |||S arm_sme.get_tile
58+
// CHECK-LIVE-RANGE-NEXT: |||| test.dummy
59+
// CHECK-LIVE-RANGE-NEXT: |||| test.dummy
60+
// CHECK-LIVE-RANGE-NEXT: |||| test.dummy
61+
// CHECK-LIVE-RANGE-NEXT: E||| test.some_use
62+
// CHECK-LIVE-RANGE-NEXT: E|| test.some_use
63+
// CHECK-LIVE-RANGE-NEXT: E| test.some_use
64+
// CHECK-LIVE-RANGE-NEXT: E test.some_use
65+
// CHECK-LIVE-RANGE-NEXT: S arm_sme.zero
66+
// CHECK-LIVE-RANGE-NEXT: |S arm_sme.zero
67+
// CHECK-LIVE-RANGE-NEXT: ||S arm_sme.zero
68+
// CHECK-LIVE-RANGE-NEXT: |||S arm_sme.zero
69+
// CHECK-LIVE-RANGE-NEXT: |||| test.dummy
70+
// CHECK-LIVE-RANGE-NEXT: |||| test.dummy
71+
// CHECK-LIVE-RANGE-NEXT: |||| test.dummy
72+
// CHECK-LIVE-RANGE-NEXT: E||| test.some_use
73+
// CHECK-LIVE-RANGE-NEXT: E|| test.some_use
74+
// CHECK-LIVE-RANGE-NEXT: E| test.some_use
75+
// CHECK-LIVE-RANGE-NEXT: E test.some_use
7676

7777
// CHECK-LABEL: @reuse_tiles_after_initial_use
7878
func.func @reuse_tiles_after_initial_use() {
@@ -111,16 +111,16 @@ func.func @reuse_tiles_after_initial_use() {
111111

112112
// -----
113113

114-
// CHECK-LIVE-RANGE: ========== Coalesced Live Ranges:
115-
// CHECK-LIVE-RANGE-NEXT: @non_overlapping_branches
116-
// CHECK-LIVE-RANGE: ^bb1:
117-
// CHECK-LIVE-RANGE-NEXT: S arm_sme.zero
118-
// CHECK-LIVE-RANGE-NEXT: | arm_sme.copy_tile
119-
// CHECK-LIVE-RANGE-NEXT: E cf.br
120-
// CHECK-LIVE-RANGE-NEXT: ^bb2:
121-
// CHECK-LIVE-RANGE-NEXT: S arm_sme.get_tile
122-
// CHECK-LIVE-RANGE-NEXT: | arm_sme.copy_tile
123-
// CHECK-LIVE-RANGE-NEXT: E cf.br
114+
// CHECK-LIVE-RANGE-LABEL: @non_overlapping_branches
115+
// CHECK-LIVE-RANGE: ========== Coalesced Live Ranges:
116+
// CHECK-LIVE-RANGE: ^bb1:
117+
// CHECK-LIVE-RANGE-NEXT: S arm_sme.zero
118+
// CHECK-LIVE-RANGE-NEXT: | arm_sme.copy_tile
119+
// CHECK-LIVE-RANGE-NEXT: E cf.br
120+
// CHECK-LIVE-RANGE-NEXT: ^bb2:
121+
// CHECK-LIVE-RANGE-NEXT: S arm_sme.get_tile
122+
// CHECK-LIVE-RANGE-NEXT: | arm_sme.copy_tile
123+
// CHECK-LIVE-RANGE-NEXT: E cf.br
124124

125125
// CHECK-LABEL: @non_overlapping_branches
126126
func.func @non_overlapping_branches(%cond: i1) {
@@ -141,8 +141,20 @@ func.func @non_overlapping_branches(%cond: i1) {
141141

142142
// -----
143143

144-
// CHECK-LIVE-RANGE: ========== Coalesced Live Ranges:
145-
// <deliberately omitted>
144+
// Here %vecA and %vecB are not merged into the same live range (as they are unknown values).
145+
// This means that %vecA and %vecB are both allocated to different tiles (which is not legal).
146+
func.func @overlapping_branches(%cond: i1, %vecA: vector<[4]x[4]xf32>, %vecB: vector<[4]x[4]xf32>) {
147+
// expected-error@below {{op failed to rectify tile operand with tile result (move required)}}
148+
%tile = scf.if %cond -> vector<[4]x[4]xf32> {
149+
scf.yield %vecA : vector<[4]x[4]xf32>
150+
} else {
151+
scf.yield %vecB : vector<[4]x[4]xf32>
152+
}
153+
"test.some_use"(%tile) : (vector<[4]x[4]xf32>) -> ()
154+
return
155+
}
156+
157+
// -----
146158

147159
// CHECK-LABEL: @constant_loop_init_with_multiple_users
148160
func.func @constant_loop_init_with_multiple_users(%a: vector<[4]xf32>, %b: vector<[4]xf32>) {
@@ -169,14 +181,14 @@ func.func @constant_loop_init_with_multiple_users(%a: vector<[4]xf32>, %b: vecto
169181

170182
// -----
171183

172-
// CHECK-LIVE-RANGE: ========== Coalesced Live Ranges:
173-
// CHECK-LIVE-RANGE-NEXT: @run_out_of_tiles_but_avoid_spill
174-
// CHECK-LIVE-RANGE: ^bb2:
175-
// CHECK-LIVE-RANGE-NEXT: |S arm_sme.copy_tile
176-
// CHECK-LIVE-RANGE-NEXT: ||S arm_sme.copy_tile
177-
// CHECK-LIVE-RANGE-NEXT: |||S arm_sme.copy_tile
178-
// CHECK-LIVE-RANGE-NEXT: ||||S arm_sme.copy_tile
179-
// CHECK-LIVE-RANGE-NEXT: EEEEE cf.br
184+
// CHECK-LIVE-RANGE-LABEL: @run_out_of_tiles_but_avoid_spill
185+
// CHECK-LIVE-RANGE: ========== Coalesced Live Ranges:
186+
// CHECK-LIVE-RANGE: ^bb2:
187+
// CHECK-LIVE-RANGE-NEXT: |S arm_sme.copy_tile
188+
// CHECK-LIVE-RANGE-NEXT: ||S arm_sme.copy_tile
189+
// CHECK-LIVE-RANGE-NEXT: |||S arm_sme.copy_tile
190+
// CHECK-LIVE-RANGE-NEXT: ||||S arm_sme.copy_tile
191+
// CHECK-LIVE-RANGE-NEXT: EEEEE cf.br
180192

181193
// Note in the live ranges (above) there is five tile values, but we only have four tiles.
182194

@@ -222,20 +234,20 @@ func.func @run_out_of_tiles_but_avoid_spill(%a: vector<[4]xf32>, %b: vector<[4]x
222234
// We should be able to avoid spills like this, but logic handling this case is
223235
// not implemented yet. Note tile ID >= 16 means a spill/in-memory tile.
224236

225-
// CHECK-LIVE-RANGE: ========== Coalesced Live Ranges:
226-
// CHECK-LIVE-RANGE-NEXT: @avoidable_spill
227-
// CHECK-LIVE-RANGE: ^bb2:
228-
// CHECK-LIVE-RANGE-NEXT: || test.some_use
229-
// CHECK-LIVE-RANGE-NEXT: ||S arm_sme.move_vector_to_tile_slice
230-
// CHECK-LIVE-RANGE-NEXT: |||S arm_sme.move_vector_to_tile_slice
231-
// CHECK-LIVE-RANGE-NEXT: ||||S arm_sme.move_vector_to_tile_slice
232-
// CHECK-LIVE-RANGE-NEXT: |||||S arm_sme.move_vector_to_tile_slice
233-
// CHECK-LIVE-RANGE-NEXT: ||E||| test.some_use
234-
// CHECK-LIVE-RANGE-NEXT: || E|| test.some_use
235-
// CHECK-LIVE-RANGE-NEXT: || E| test.some_use
236-
// CHECK-LIVE-RANGE-NEXT: || E test.some_use
237-
// CHECK-LIVE-RANGE-NEXT: || arith.addi
238-
// CHECK-LIVE-RANGE-NEXT: EE cf.br
237+
// CHECK-LIVE-RANGE-LABEL: @avoidable_spill
238+
// CHECK-LIVE-RANGE: ========== Coalesced Live Ranges:
239+
// CHECK-LIVE-RANGE: ^bb2:
240+
// CHECK-LIVE-RANGE-NEXT: || test.some_use
241+
// CHECK-LIVE-RANGE-NEXT: ||S arm_sme.move_vector_to_tile_slice
242+
// CHECK-LIVE-RANGE-NEXT: |||S arm_sme.move_vector_to_tile_slice
243+
// CHECK-LIVE-RANGE-NEXT: ||||S arm_sme.move_vector_to_tile_slice
244+
// CHECK-LIVE-RANGE-NEXT: |||||S arm_sme.move_vector_to_tile_slice
245+
// CHECK-LIVE-RANGE-NEXT: ||E||| test.some_use
246+
// CHECK-LIVE-RANGE-NEXT: || E|| test.some_use
247+
// CHECK-LIVE-RANGE-NEXT: || E| test.some_use
248+
// CHECK-LIVE-RANGE-NEXT: || E test.some_use
249+
// CHECK-LIVE-RANGE-NEXT: || arith.addi
250+
// CHECK-LIVE-RANGE-NEXT: EE cf.br
239251

240252
// Note in the live ranges (above) there is two constant live-ins (first two ranges),
241253
// which gives six overlapping live ranges. The allocator currently will spill the

0 commit comments

Comments
 (0)