The condition in canEvictInterferenceBasedOnCost is slightly different from the assertion in evictInteference. canEvictInterferenceBasedOnCost uses a <= check for the cascade number for legality, but the assert was checking for <. For equal cascade numbers for an urgent eviction, canEvictInterferenceBasedOnCost could return success. The actual eviction would then hit this assert. Avoid ever returning true for equivalent cascade numbers. The resulting failed allocation seems a bit off to me. e.g. in illegal-eviction-assert.mir, I wuold assume %0 gets allocated starting at $vgpr0. That was its initial allocation choice, but was later evicted. In this example no evictions can help improve anything.
30 lines
1.4 KiB
LLVM
30 lines
1.4 KiB
LLVM
; RUN: not llc -march=amdgcn -mcpu=gfx908 -verify-machineinstrs -o - %s 2>%t.err | FileCheck %s
|
|
; RUN: FileCheck -check-prefix=ERR %s < %t.err
|
|
|
|
; This testcase would fail on an "illegal eviction". If the assert was
|
|
; relaxed to allow equivalent cascade numbers, it would infinite loop.
|
|
|
|
; ERR: error: inline assembly requires more registers than available
|
|
; ERR: error: inline assembly requires more registers than available
|
|
|
|
%asm.output = type { <16 x i32>, <8 x i32>, <5 x i32>, <4 x i32>, <16 x i32> }
|
|
|
|
; CHECK-LABEL: {{^}}illegal_eviction_assert:
|
|
; CHECK: ; def v[4:19] v[20:27] v[0:4] v[0:3] a[0:15]
|
|
; CHECK: ; clobber
|
|
; CHECK: ; use v[4:19] v[20:27] v[0:4] v[0:3] a[1:16]
|
|
define void @illegal_eviction_assert(<32 x i32> addrspace(1)* %arg) #0 {
|
|
;%agpr0 = call i32 asm sideeffect "; def $0","=${a0}"()
|
|
%asm = call %asm.output asm sideeffect "; def $0 $1 $2 $3 $4","=v,=v,=v,=v,={a[0:15]}"()
|
|
%vgpr0 = extractvalue %asm.output %asm, 0
|
|
%vgpr1 = extractvalue %asm.output %asm, 1
|
|
%vgpr2 = extractvalue %asm.output %asm, 2
|
|
%vgpr3 = extractvalue %asm.output %asm, 3
|
|
%agpr0 = extractvalue %asm.output %asm, 4
|
|
call void asm sideeffect "; clobber", "~{v[0:31]}"()
|
|
call void asm sideeffect "; use $0 $1 $2 $3 $4","v,v,v,v,{a[1:16]}"(<16 x i32> %vgpr0, <8 x i32> %vgpr1, <5 x i32> %vgpr2, <4 x i32> %vgpr3, <16 x i32> %agpr0)
|
|
ret void
|
|
}
|
|
|
|
attributes #0 = { "amdgpu-waves-per-eu"="8,8" }
|