Lines Matching full:tile

16 // users to ensure the IR has been lowered to CF before invoking the tile
22 // Tile Overlaps
145 /// Allocates and returns a tile ID. Fails if there are no tiles left.
157 /// Acquires a specific tile ID. Asserts the tile is initially free.
161 "cannot acquire allocated tile!");
165 /// Releases a previously allocated tile ID.
169 "cannot release unallocated tile!");
173 /// Allocates an in-memory tile ID.
175 // Note: We never release in-memory tile IDs. We could, which may allow
176 // reusing an allocation, but as we _never_ want to spill an SME tile this
187 /// `cf.cond_br`s that contain tile operands. This prevents spurious liveness
192 /// cf.cond_br %cond, ^bb1(%tile: vector<[4]x[4]xf32>), ^bb2
199 /// cf.br ^bb1(%tile: vector<[4]x[4]xf32>)
236 /// Inserts tile copies at `cf.br` operations.
240 /// cf.br ^bb1(%tile: vector<[4]x[4]xf32>)
245 /// %copy = arm_sme.copy_tile %tile : vector<[4]x[4]xf32>
265 /// Prepares the IR for tile allocation. It does this by first 'splitting'
266 /// conditional branches (see `splitCondBranches`), then inserting tile copies
269 /// branch (see `tile-allocation-copies.mlir` and
270 /// `tile-allocation-liveness.mlir` for examples). The copies break up live
279 /// A live range for a (collection of) tile values. A live range is built up of
281 /// where a value in the range needs to be live (i.e. in an SME virtual tile).
283 /// range can be allocated to the same SME virtual tile.
339 /// The tile ID (or none) assigned to this live range.
359 "ArmSME tile allocation does not support nested regions");
375 /// Defines or updates a live range for an SME tile value. Live-ins may update
415 /// Iterate over all predecessor tile values to a (tile) block argument.
441 /// Coalesce live ranges where it would prevent unnecessary tile moves.
462 // Merge the live ranges of new definitions with their tile operands.
498 // Sort the new live ranges by starting point (ready for tile allocation).
525 // Heuristic: Spill the range that ends last (with a compatible tile type).
538 /// Greedily allocate tile IDs to live ranges. Spill using simple heuristics.
542 // `activeRanges` = Live ranges that need to be in a tile at the
545 // `inactiveRanges` = Live ranges that _do not_ need to be in a tile
548 // range, where it is possible to reuse the live range's tile ID _before_ it
550 // often, which helps avoid costly tile spills.
593 // We need to reserve the tile IDs of overlapping inactive ranges to
594 // prevent two (overlapping) live ranges from getting the same tile ID.
601 // 4. Allocate a tile ID to `nextRange`.
615 // Spill an (in)active live range (so release its tile ID first).
642 /// Assigns a tile ID to an MLIR value.
649 // Ensure ArmSME ops that don't produce a value still get a tile ID.
656 /// Assign tile IDs back to IR and attempt to resolve trivial tile ID conflicts.
669 /// Eliminates copies where the operand has the same tile ID.
678 /// Validates each predecessor to a tile block argument has been assigned
679 /// the same tile ID.
692 "block argument not allocated to the same SME virtial tile as "
700 /// Attempts to resolve (trivial) tile ID conflicts.
705 // Operand already allocated to the correct tile.
713 tileOp.emitOpError("tile operand allocated to different SME "
714 "virtial tile (move required)");
716 << "tile operand is: " << tileOperand->get();
736 // 1. Assign the tile ID to the value.
739 // 2. Attempt to eliminate redundant tile copies.
743 // 3. Validate tile block arguments.
747 // 4. Attempt to resolve (trivial) tile ID conflicts.
759 llvm::errs() << "SME Tile Liveness: @" << function.getName()
809 // 1. Preprocess the IR for tile allocation.
812 // 2. Gather live ranges for each ArmSME tile within the function.
834 // for tile allocation. E.g. Unify the result of an operation with its
843 // 4. Allocate tile IDs to live ranges.
846 // 5. Assign the tile IDs back to the ArmSME operations.
852 // 6. Erase trivially dead tile operations (e.g. a ZeroOp with no