@@ -436,30 +436,32 @@ func.func @cond_branch_with_backedge(%slice: vector<[4]xf32>) {
436
436
// CHECK-LIVE-RANGE-LABEL: @fill_holes_in_tile_liveness
437
437
// CHECK-LIVE-RANGE: ========== Coalesced Live Ranges:
438
438
// CHECK-LIVE-RANGE: ^bb0:
439
- // CHECK-LIVE-RANGE: S arm_sme.get_tile
440
- // CHECK-LIVE-RANGE: E cf.cond_br
441
- // CHECK-LIVE-RANGE: ^bb1:
442
- // CHECK-LIVE-RANGE: S arm_sme.get_tile
443
- // CHECK-LIVE-RANGE: | test.dummy
444
- // CHECK-LIVE-RANGE: E test.some_use
445
- // CHECK-LIVE-RANGE: cf.br
446
- // CHECK-LIVE-RANGE: ^bb2:
447
- // CHECK-LIVE-RANGE: | test.dummy
448
- // CHECK-LIVE-RANGE: | test.dummy
449
- // CHECK-LIVE-RANGE: | test.dummy
450
- // CHECK-LIVE-RANGE: E test.some_use
451
- // CHECK-LIVE-RANGE: cf.br
439
+ // CHECK-LIVE-RANGE-NEXT : S arm_sme.get_tile
440
+ // CHECK-LIVE-RANGE-NEXT : E cf.cond_br
441
+ // CHECK-LIVE-RANGE-NEXT : ^bb1:
442
+ // CHECK-LIVE-RANGE-NEXT : S arm_sme.get_tile
443
+ // CHECK-LIVE-RANGE-NEXT : | test.dummy
444
+ // CHECK-LIVE-RANGE-NEXT : E test.some_use
445
+ // CHECK-LIVE-RANGE-NEXT : cf.br
446
+ // CHECK-LIVE-RANGE-NEXT : ^bb2:
447
+ // CHECK-LIVE-RANGE-NEXT : | test.dummy
448
+ // CHECK-LIVE-RANGE-NEXT : | test.dummy
449
+ // CHECK-LIVE-RANGE-NEXT : | test.dummy
450
+ // CHECK-LIVE-RANGE-NEXT : E test.some_use
451
+ // CHECK-LIVE-RANGE-NEXT : cf.br
452
452
453
453
// Here there's a 'hole' in the liveness of %tileA (in bb1) where another value
454
- // can reuse the tile ID (0) assigned to %tileA.
454
+ // can reuse the tile ID assigned to %tileA. The liveness for %tileB is
455
+ // entirely within the 'hole' in %tileA's live range, so %tileB should get the
456
+ // same tile ID as %tileA.
455
457
456
458
// CHECK-LABEL: @fill_holes_in_tile_liveness
457
459
func.func @fill_holes_in_tile_liveness (%cond: i1 ) {
458
- // CHECK: arm_sme.get_tile {tile_id = 0 : i32}
460
+ // CHECK: arm_sme.get_tile {tile_id = [[TILE_ID_A:.*]] : i32}
459
461
%tileA = arm_sme.get_tile : vector <[4 ]x[4 ]xf32 >
460
462
cf.cond_br %cond , ^bb2 , ^bb1
461
463
^bb1 :
462
- // CHECK: arm_sme.get_tile {tile_id = 0 : i32}
464
+ // CHECK: arm_sme.get_tile {tile_id = [[TILE_ID_A]] : i32}
463
465
%tileB = arm_sme.get_tile : vector <[4 ]x[4 ]xf32 >
464
466
" test.dummy" (): () -> ()
465
467
" test.some_use" (%tileB ) : (vector <[4 ]x[4 ]xf32 >) -> ()
@@ -479,25 +481,25 @@ func.func @fill_holes_in_tile_liveness(%cond: i1) {
479
481
// CHECK-LIVE-RANGE-LABEL: @holes_in_tile_liveness_inactive_overlaps
480
482
// CHECK-LIVE-RANGE: ========== Coalesced Live Ranges:
481
483
// CHECK-LIVE-RANGE: ^bb0:
482
- // CHECK-LIVE-RANGE: S arm_sme.get_tile
483
- // CHECK-LIVE-RANGE: E cf.cond_br
484
- // CHECK-LIVE-RANGE: ^bb1:
485
- // CHECK-LIVE-RANGE: S arm_sme.get_tile
486
- // CHECK-LIVE-RANGE: | test.dummy
487
- // CHECK-LIVE-RANGE: | test.some_use
488
- // CHECK-LIVE-RANGE: | arm_sme.copy_tile
489
- // CHECK-LIVE-RANGE: E cf.br
490
- // CHECK-LIVE-RANGE: ^bb2:
491
- // CHECK-LIVE-RANGE: | test.dummy
492
- // CHECK-LIVE-RANGE: | test.dummy
493
- // CHECK-LIVE-RANGE: | test.dummy
494
- // CHECK-LIVE-RANGE: |S arm_sme.get_tile
495
- // CHECK-LIVE-RANGE: E| test.some_use
496
- // CHECK-LIVE-RANGE: | arm_sme.copy_tile
497
- // CHECK-LIVE-RANGE: E cf.br
498
- // CHECK-LIVE-RANGE: ^bb3:
499
- // CHECK-LIVE-RANGE: E test.some_use
500
- // CHECK-LIVE-RANGE: func.return
484
+ // CHECK-LIVE-RANGE-NEXT : S arm_sme.get_tile
485
+ // CHECK-LIVE-RANGE-NEXT : E cf.cond_br
486
+ // CHECK-LIVE-RANGE-NEXT : ^bb1:
487
+ // CHECK-LIVE-RANGE-NEXT : S arm_sme.get_tile
488
+ // CHECK-LIVE-RANGE-NEXT : | test.dummy
489
+ // CHECK-LIVE-RANGE-NEXT : | test.some_use
490
+ // CHECK-LIVE-RANGE-NEXT : | arm_sme.copy_tile
491
+ // CHECK-LIVE-RANGE-NEXT : E cf.br
492
+ // CHECK-LIVE-RANGE-NEXT : ^bb2:
493
+ // CHECK-LIVE-RANGE-NEXT : | test.dummy
494
+ // CHECK-LIVE-RANGE-NEXT : | test.dummy
495
+ // CHECK-LIVE-RANGE-NEXT : | test.dummy
496
+ // CHECK-LIVE-RANGE-NEXT : |S arm_sme.get_tile
497
+ // CHECK-LIVE-RANGE-NEXT : E| test.some_use
498
+ // CHECK-LIVE-RANGE-NEXT : | arm_sme.copy_tile
499
+ // CHECK-LIVE-RANGE-NEXT : E cf.br
500
+ // CHECK-LIVE-RANGE-NEXT : ^bb3:
501
+ // CHECK-LIVE-RANGE-NEXT : E test.some_use
502
+ // CHECK-LIVE-RANGE-NEXT : func.return
501
503
502
504
// This tests an edge case in inactive live ranges. The first live range is
503
505
// inactive at the start of ^bb1. If the tile allocator did not check if the
@@ -560,3 +562,49 @@ func.func @spill_inactive_live_range(%cond: i1) {
560
562
" test.some_use" (%tile ) : (vector <[16 ]x[16 ]xi8 >) -> ()
561
563
return
562
564
}
565
+
566
+ // -----
567
+
568
+ // CHECK-LIVE-RANGE-LABEL: @reactivate_inactive_live_range
569
+ // CHECK-LIVE-RANGE: ========== Coalesced Live Ranges:
570
+ // CHECK-LIVE-RANGE: ^bb0:
571
+ // CHECK-LIVE-RANGE-NEXT: S arm_sme.get_tile
572
+ // CHECK-LIVE-RANGE-NEXT: E cf.cond_br
573
+ // CHECK-LIVE-RANGE-NEXT: ^bb1:
574
+ // CHECK-LIVE-RANGE-NEXT: S arm_sme.get_tile
575
+ // CHECK-LIVE-RANGE-NEXT: | test.dummy
576
+ // CHECK-LIVE-RANGE-NEXT: E test.some_use
577
+ // CHECK-LIVE-RANGE-NEXT: cf.br
578
+ // CHECK-LIVE-RANGE-NEXT: ^bb2:
579
+ // CHECK-LIVE-RANGE-NEXT: | S arm_sme.get_tile
580
+ // CHECK-LIVE-RANGE-NEXT: | | test.dummy
581
+ // CHECK-LIVE-RANGE-NEXT: | | test.dummy
582
+ // CHECK-LIVE-RANGE-NEXT: | E test.some_use
583
+ // CHECK-LIVE-RANGE-NEXT: E test.some_use
584
+ // CHECK-LIVE-RANGE-NEXT: cf.br
585
+
586
+ // Here the live range for %tileA becomes inactive in bb1 (so %tileB gets tile
587
+ // ID 0 too). Then in bb2 the live range for tileA is reactivated as it overlaps
588
+ // with the start of %tileC's live range (which means %tileC gets tile ID 1).
589
+
590
+ func.func @reactivate_inactive_live_range (%cond: i1 ) {
591
+ // CHECK: arm_sme.get_tile {tile_id = 0 : i32}
592
+ %tileA = arm_sme.get_tile : vector <[4 ]x[4 ]xf32 >
593
+ cf.cond_br %cond , ^bb2 , ^bb1
594
+ ^bb1 :
595
+ // CHECK: arm_sme.get_tile {tile_id = 0 : i32}
596
+ %tileB = arm_sme.get_tile : vector <[16 ]x[16 ]xi8 >
597
+ " test.dummy" (): () -> ()
598
+ " test.some_use" (%tileB ) : (vector <[16 ]x[16 ]xi8 >) -> ()
599
+ cf.br ^bb3
600
+ ^bb2 :
601
+ // CHECK: arm_sme.get_tile {tile_id = 1 : i32}
602
+ %tileC = arm_sme.get_tile : vector <[4 ]x[4 ]xf32 >
603
+ " test.dummy" (): () -> ()
604
+ " test.dummy" (): () -> ()
605
+ " test.some_use" (%tileC ) : (vector <[4 ]x[4 ]xf32 >) -> ()
606
+ " test.some_use" (%tileA ) : (vector <[4 ]x[4 ]xf32 >) -> ()
607
+ cf.br ^bb3
608
+ ^bb3 :
609
+ return
610
+ }
0 commit comments