blob: 3f4ba6271058d0e7afb23b81c8601e5ab65eb94b [file] [edit]
; RUN: opt -passes=inline -mtriple=amdgpu-amd-amdhsa -inline-instr-cost=50 \
; RUN: -pass-remarks=inline -pass-remarks-missed=inline < %s 2>&1 | FileCheck %s
; A call left out of line in a kernel is register allocated against the worst
; case for the whole kernel, so it costs the hot path too and the reduced
; cold-callsite threshold does not apply. It still applies in a callable
; caller. Both callsites are equally cold and the callee has two uses, so the
; only difference is the caller's calling convention.
; CHECK-DAG: 'callee' inlined into 'kernel'
; CHECK-DAG: 'callee' not inlined into 'func' because too costly to inline
define internal void @callee(ptr addrspace(1) %p, i32 %x) {
entry:
%v0 = mul i32 %x, 3
%v1 = mul i32 %v0, 4
%v2 = mul i32 %v1, 5
%v3 = mul i32 %v2, 6
%v4 = mul i32 %v3, 7
%v5 = mul i32 %v4, 8
%v6 = mul i32 %v5, 9
%v7 = mul i32 %v6, 10
%v8 = mul i32 %v7, 11
%v9 = mul i32 %v8, 12
%v10 = mul i32 %v9, 13
%v11 = mul i32 %v10, 14
%v12 = mul i32 %v11, 15
%v13 = mul i32 %v12, 16
%v14 = mul i32 %v13, 17
%v15 = mul i32 %v14, 18
store i32 %v15, ptr addrspace(1) %p, align 4
ret void
}
define amdgpu_kernel void @kernel(ptr addrspace(1) %p, i32 %x, i1 %c) {
entry:
br i1 %c, label %cold, label %exit, !prof !0
cold:
call void @callee(ptr addrspace(1) %p, i32 %x)
br label %exit
exit:
ret void
}
define void @func(ptr addrspace(1) %p, i32 %x, i1 %c) {
entry:
br i1 %c, label %cold, label %exit, !prof !0
cold:
call void @callee(ptr addrspace(1) %p, i32 %x)
br label %exit
exit:
ret void
}
!0 = !{!"branch_weights", i32 1, i32 4000}