This prevents S_NOP from being rescheduled past other (side-effecting) instructions, which is useful because it is generally used to introduce a short delay or to avoid hazards. Currently this only affects MIR tests because the compiler itself only inserts nops in PostRAHazardRecognizer which runs after all scheduling.
81 lines
3.1 KiB
YAML
81 lines
3.1 KiB
YAML
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
|
|
# RUN: llc -mtriple=amdgcn-amd-amdhsa -verify-machineinstrs -amdgpu-dce-in-ra=0 -stress-regalloc=1 -start-before=register-coalescer -stop-after=greedy,1 -o - %s | FileCheck %s
|
|
# https://bugs.llvm.org/show_bug.cgi?id=33620
|
|
|
|
---
|
|
# This would assert due to the empty live interval created for %9
|
|
# on the last S_NOP with an undef subreg use.
|
|
|
|
|
|
|
|
|
|
name: expecting_non_empty_interval
|
|
tracksRegLiveness: true
|
|
machineFunctionInfo:
|
|
scratchRSrcReg: $sgpr0_sgpr1_sgpr2_sgpr3
|
|
stackPtrOffsetReg: $sgpr32
|
|
body: |
|
|
; CHECK-LABEL: name: expecting_non_empty_interval
|
|
; CHECK: bb.0:
|
|
; CHECK-NEXT: successors: %bb.1(0x80000000)
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: undef %5.sub1:vreg_64 = V_MOV_B32_e32 1786773504, implicit $exec
|
|
; CHECK-NEXT: dead [[V_MUL_F32_e32_:%[0-9]+]]:vgpr_32 = V_MUL_F32_e32 0, %5.sub1, implicit $mode, implicit $exec
|
|
; CHECK-NEXT: undef %7.sub1:vreg_64 = V_MAC_F32_e32 0, undef %1:vgpr_32, undef %7.sub1, implicit $mode, implicit $exec
|
|
; CHECK-NEXT: SI_SPILL_V64_SAVE %7, %stack.0, $sgpr32, 0, implicit $exec :: (store (s64) into %stack.0, align 4, addrspace 5)
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: bb.1:
|
|
; CHECK-NEXT: undef %6.sub1:vreg_64 = V_MOV_B32_e32 1786773504, implicit $exec
|
|
; CHECK-NEXT: S_NOP 0, implicit %6.sub1
|
|
; CHECK-NEXT: [[SI_SPILL_V64_RESTORE:%[0-9]+]]:vreg_64 = SI_SPILL_V64_RESTORE %stack.0, $sgpr32, 0, implicit $exec :: (load (s64) from %stack.0, align 4, addrspace 5)
|
|
; CHECK-NEXT: S_NOP 0, implicit [[SI_SPILL_V64_RESTORE]].sub1
|
|
; CHECK-NEXT: S_NOP 0, implicit undef %9.sub0:vreg_64
|
|
bb.0:
|
|
successors: %bb.1
|
|
|
|
undef %0.sub1:vreg_64 = V_MAC_F32_e32 0, undef %1:vgpr_32, undef %0.sub1, implicit $mode, implicit $exec
|
|
undef %2.sub1:vreg_64 = V_MOV_B32_e32 1786773504, implicit $exec
|
|
dead %3:vgpr_32 = V_MUL_F32_e32 0, %2.sub1, implicit $mode, implicit $exec
|
|
|
|
bb.1:
|
|
S_NOP 0, implicit %2.sub1
|
|
S_NOP 0, implicit %0.sub1
|
|
S_NOP 0, implicit undef %0.sub0
|
|
|
|
...
|
|
|
|
# Similar assert which happens when trying to rematerialize.
|
|
# https://bugs.llvm.org/show_bug.cgi?id=33884
|
|
---
|
|
|
|
|
|
name: rematerialize_empty_interval_has_reference
|
|
tracksRegLiveness: true
|
|
machineFunctionInfo:
|
|
scratchRSrcReg: $sgpr0_sgpr1_sgpr2_sgpr3
|
|
stackPtrOffsetReg: $sgpr32
|
|
body: |
|
|
; CHECK-LABEL: name: rematerialize_empty_interval_has_reference
|
|
; CHECK: bb.0:
|
|
; CHECK-NEXT: successors: %bb.1(0x80000000)
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: undef %1.sub2:vreg_128 = V_MOV_B32_e32 1786773504, implicit $exec
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: bb.1:
|
|
; CHECK-NEXT: S_NOP 0, implicit %1.sub2
|
|
; CHECK-NEXT: S_NOP 0, implicit undef %4.sub0:vreg_128
|
|
; CHECK-NEXT: undef %2.sub2:vreg_128 = V_MOV_B32_e32 0, implicit $exec
|
|
; CHECK-NEXT: S_NOP 0, implicit %2.sub2
|
|
bb.0:
|
|
successors: %bb.1
|
|
|
|
undef %0.sub2:vreg_128 = V_MOV_B32_e32 0, implicit $exec
|
|
undef %1.sub2:vreg_128 = V_MOV_B32_e32 1786773504, implicit $exec
|
|
|
|
bb.1:
|
|
S_NOP 0, implicit %1.sub2
|
|
S_NOP 0, implicit undef %0.sub0
|
|
S_NOP 0, implicit %0.sub2
|
|
|
|
...
|