CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
110 lines
3.2 KiB
Markdown
110 lines
3.2 KiB
Markdown
# RemoveInstructionPass
|
|
|
|
`RemoveInstructionPass` strips instructions whose unified opcode matches a
|
|
configured target set from every basic block approved by
|
|
`PassContext::shouldProcessBasicBlock`.
|
|
|
|
Typical use cases include experiments that remove specific instruction classes
|
|
(e.g. `tensor_load_to_lds`) without hand-editing generated assembly.
|
|
|
|
## gfx1250 pipeline integration
|
|
|
|
On gfx1250, the pass is registered as the **last kernel-scope pass** (after
|
|
`AccumulateInstructionSizePass`). It is **disabled by default**: the factory
|
|
returns `nullptr` when `ModuleOptions.RemoveInstructions` is empty, so nothing
|
|
is removed unless you opt in.
|
|
|
|
## Configuration
|
|
|
|
### Via `stinkytofu-opt`
|
|
|
|
Pass mnemonics are comma-separated unified opcode names (the same strings used
|
|
in `GFX::` / `HwInstDesc::mnemonic`):
|
|
|
|
```bash
|
|
./build/tools/stinkytofu-opt/stinkytofu-opt \
|
|
--arch gfx1250 input.stir \
|
|
--RemoveInstructionPass=tensor_load_to_lds \
|
|
--print-output
|
|
```
|
|
|
|
Remove multiple instruction types in one run:
|
|
|
|
```bash
|
|
./build/tools/stinkytofu-opt/stinkytofu-opt \
|
|
--arch gfx1250 input.stir \
|
|
--RemoveInstructionPass=tensor_load_to_lds,ds_load_b128,v_wmma_f32_16x16x16_bf16 \
|
|
--print-output
|
|
```
|
|
|
|
Mnemonics are resolved against the target architecture at pass run time.
|
|
Unknown names are skipped with a `PASS_DEBUG` message; if no valid opcode
|
|
remains, the pass is a no-op.
|
|
|
|
### Via Tensile / rocisa (`ModuleOptions`)
|
|
|
|
Set `RemoveInstructions` in the `options` dict passed to
|
|
`rocisa.toStinkyTofuModule()`. In `KernelWriter.py`, add it to
|
|
`stinky_module_options`:
|
|
|
|
```python
|
|
stinky_module_options = {
|
|
"OptLevel": stinky_opt_level,
|
|
# ...
|
|
"RemoveInstructions": "tensor_load_to_lds",
|
|
}
|
|
```
|
|
|
|
Comma-separated values remove multiple opcodes, for example:
|
|
|
|
```python
|
|
"RemoveInstructions": "tensor_load_to_lds,ds_load_b128,v_wmma_f32_16x16x16_bf16"
|
|
```
|
|
|
|
Leave `RemoveInstructions` unset or as `""` to keep the pass disabled.
|
|
|
|
### Programmatic C++ API
|
|
|
|
```cpp
|
|
// Disabled (returns nullptr)
|
|
auto disabled = createRemoveInstructionPass();
|
|
|
|
// Comma-separated mnemonics (gfx1250 backend uses this form)
|
|
auto pass = createRemoveInstructionPass("tensor_load_to_lds,s_nop");
|
|
if (pass) pm.addPass(std::move(pass));
|
|
|
|
// Explicit unified opcodes
|
|
pm.addPass(createRemoveInstructionPass(
|
|
std::vector<UnifiedOpcode>{GFX::tensor_load_to_lds}));
|
|
|
|
// Mnemonic list (resolved at run time)
|
|
pm.addPass(createRemoveInstructionPass(
|
|
std::vector<std::string>{"tensor_load_to_lds", "ds_load_b128"}));
|
|
```
|
|
|
|
## Common mnemonics
|
|
|
|
| Mnemonic | Instruction class |
|
|
|----------|-------------------|
|
|
| `tensor_load_to_lds` | Tensor prefetch to LDS |
|
|
| `ds_load_b128` | DS load (example LDS read) |
|
|
| `v_wmma_f32_16x16x16_bf16` | WMMA matrix multiply |
|
|
|
|
Use the exact mnemonic string for your target architecture. Operand variants
|
|
(e.g. different WMMA shapes) are separate unified opcodes.
|
|
|
|
## Tests
|
|
|
|
- Unit: `tests/unit/asm/RemoveInstructionPassTest.cpp`
|
|
- FileCheck: `tests/filecheck/remove_instruction.stir`
|
|
|
|
```bash
|
|
cd build && ctest -R 'RemoveInstructionPassTest|FileCheck.remove_instruction'
|
|
```
|
|
|
|
## Implementation
|
|
|
|
- `include/stinkytofu/transforms/asm/RemoveInstructionPass.hpp`
|
|
- `src/transforms/asm/RemoveInstructionPass.cpp`
|
|
- `src/pipeline/backend/Gfx1250Backend.cpp` (conditional pipeline hook)
|