| # RUN: llc -march=amdgcn -run-pass si-insert-waitcnts %s -o - | FileCheck %s |
| |
| --- | |
| define amdgpu_kernel void @basic_insert_dcache_wb() { |
| ret void |
| } |
| |
| define amdgpu_kernel void @explicit_flush_after() { |
| ret void |
| } |
| |
| define amdgpu_kernel void @explicit_flush_before() { |
| ret void |
| } |
| |
| define amdgpu_kernel void @no_scalar_store() { |
| ret void |
| } |
| |
| define amdgpu_kernel void @multi_block_store() { |
| bb0: |
| br i1 undef, label %bb1, label %bb2 |
| |
| bb1: |
| ret void |
| |
| bb2: |
| ret void |
| } |
| |
| define amdgpu_kernel void @one_block_store() { |
| bb0: |
| br i1 undef, label %bb1, label %bb2 |
| |
| bb1: |
| ret void |
| |
| bb2: |
| ret void |
| } |
| |
| define amdgpu_ps float @si_return() { |
| ret float undef |
| } |
| |
| ... |
| --- |
| # CHECK-LABEL: name: basic_insert_dcache_wb |
| # CHECK: bb.0: |
| # CHECK-NEXT: S_STORE_DWORD |
| # CHECK-NEXT: S_DCACHE_WB |
| # CHECK-NEXT: S_ENDPGM |
| |
| name: basic_insert_dcache_wb |
| tracksRegLiveness: false |
| |
| body: | |
| bb.0: |
| S_STORE_DWORD_SGPR undef $sgpr2, undef $sgpr0_sgpr1, undef $m0, 0 |
| S_ENDPGM |
| ... |
| --- |
| # Already has an explicitly requested flush after the last store. |
| # CHECK-LABEL: name: explicit_flush_after |
| # CHECK: bb.0: |
| # CHECK-NEXT: S_STORE_DWORD |
| # CHECK-NEXT: S_DCACHE_WB |
| # CHECK-NEXT: S_ENDPGM |
| |
| name: explicit_flush_after |
| tracksRegLiveness: false |
| |
| body: | |
| bb.0: |
| S_STORE_DWORD_SGPR undef $sgpr2, undef $sgpr0_sgpr1, undef $m0, 0 |
| S_DCACHE_WB |
| S_ENDPGM |
| ... |
| --- |
| # Already has an explicitly requested flush before the last store. |
| # CHECK-LABEL: name: explicit_flush_before |
| # CHECK: bb.0: |
| # CHECK-NEXT: S_DCACHE_WB |
| # CHECK-NEXT: S_STORE_DWORD |
| # CHECK-NEXT: S_DCACHE_WB |
| # CHECK-NEXT: S_ENDPGM |
| |
| name: explicit_flush_before |
| tracksRegLiveness: false |
| |
| body: | |
| bb.0: |
| S_DCACHE_WB |
| S_STORE_DWORD_SGPR undef $sgpr2, undef $sgpr0_sgpr1, undef $m0, 0 |
| S_ENDPGM |
| ... |
| --- |
| # CHECK-LABEL: no_scalar_store |
| # CHECK: bb.0 |
| # CHECK-NEXT: S_ENDPGM |
| name: no_scalar_store |
| tracksRegLiveness: false |
| |
| body: | |
| bb.0: |
| S_ENDPGM |
| ... |
| |
| # CHECK-LABEL: name: multi_block_store |
| # CHECK: bb.0: |
| # CHECK-NEXT: S_STORE_DWORD |
| # CHECK-NEXT: S_DCACHE_WB |
| # CHECK-NEXT: S_ENDPGM |
| |
| # CHECK: bb.1: |
| # CHECK-NEXT: S_STORE_DWORD |
| # CHECK-NEXT: S_DCACHE_WB |
| # CHECK-NEXT: S_ENDPGM |
| |
| name: multi_block_store |
| tracksRegLiveness: false |
| |
| body: | |
| bb.0: |
| S_STORE_DWORD_SGPR undef $sgpr2, undef $sgpr0_sgpr1, undef $m0, 0 |
| S_ENDPGM |
| |
| bb.1: |
| S_STORE_DWORD_SGPR undef $sgpr4, undef $sgpr6_sgpr7, undef $m0, 0 |
| S_ENDPGM |
| ... |
| ... |
| |
| # This one should be able to omit the flush in the storeless block but |
| # this isn't handled now. |
| |
| # CHECK-LABEL: name: one_block_store |
| # CHECK: bb.0: |
| # CHECK-NEXT: S_DCACHE_WB |
| # CHECK-NEXT: S_ENDPGM |
| |
| # CHECK: bb.1: |
| # CHECK-NEXT: S_STORE_DWORD |
| # CHECK-NEXT: S_DCACHE_WB |
| # CHECK-NEXT: S_ENDPGM |
| |
| name: one_block_store |
| tracksRegLiveness: false |
| |
| body: | |
| bb.0: |
| S_ENDPGM |
| |
| bb.1: |
| S_STORE_DWORD_SGPR undef $sgpr4, undef $sgpr6_sgpr7, undef $m0, 0 |
| S_ENDPGM |
| ... |
| --- |
| # CHECK-LABEL: name: si_return |
| # CHECK: bb.0: |
| # CHECK-NEXT: S_STORE_DWORD |
| # CHECK-NEXT: S_WAITCNT |
| # CHECK-NEXT: S_DCACHE_WB |
| # CHECK-NEXT: SI_RETURN |
| |
| name: si_return |
| tracksRegLiveness: false |
| |
| body: | |
| bb.0: |
| S_STORE_DWORD_SGPR undef $sgpr2, undef $sgpr0_sgpr1, undef $m0, 0 |
| SI_RETURN_TO_EPILOG undef $vgpr0 |
| ... |