blob: f00a50d1d429eb018d71eb6e3eff4ac98ab4d6a6 [file] [edit]
; RUN: llc -mtriple=amdgpu9.50-amd-amdhsa -amdgpu-enable-pipeliner -pass-remarks-analysis=pipeliner %s -filetype=null 2>&1 | FileCheck %s --check-prefix=DEFAULT
; RUN: llc -mtriple=amdgpu9.50-amd-amdhsa -amdgpu-enable-pipeliner -pipeliner-max-mii=64 -pass-remarks-analysis=pipeliner %s -filetype=null 2>&1 | FileCheck %s --check-prefix=RAISED
; This loop's MII is 32: two independent accumulators each issue one MFMA per
; iteration, and each MFMA holds the XDL pipe for 16 cycles (res=32). That
; exceeds the generic default cap of 27. At default, pipeliner aborts and
; only a raised cap lets it schedule.
; DEFAULT: Minimal Initiation Interval too large: 32 > 27
; RAISED: Schedule found with Initiation Interval
define amdgpu_kernel void @swp_amdgpu_pipeline_max_mii(i32 %arg, ptr addrspace(3) %p) {
bb:
br label %bb1
bb1: ; preds = %bb1, %bb
%phiA = phi <16 x float> [ zeroinitializer, %bb ], [ %mfmaA, %bb1 ]
%phiB = phi <16 x float> [ zeroinitializer, %bb ], [ %mfmaB, %bb1 ]
%iv = phi i32 [ 0, %bb ], [ %arg, %bb1 ]
%load = load <4 x float>, ptr addrspace(3) %p, align 16
%elt = extractelement <4 x float> %load, i64 0
%mfmaA = tail call <16 x float> @llvm.amdgcn.mfma.f32.32x32x2f32(float %elt, float 0.000000e+00, <16 x float> %phiA, i32 0, i32 0, i32 0)
%mfmaB = tail call <16 x float> @llvm.amdgcn.mfma.f32.32x32x2f32(float %elt, float 0.000000e+00, <16 x float> %phiB, i32 0, i32 0, i32 0)
%icmp = icmp eq i32 %iv, 0
br i1 %icmp, label %exit, label %bb1
exit: ; preds = %bb1
%lcssaA = phi <16 x float> [ %mfmaA, %bb1 ]
%lcssaB = phi <16 x float> [ %mfmaB, %bb1 ]
store <16 x float> %lcssaA, ptr addrspace(3) %p, align 64
store <16 x float> %lcssaB, ptr addrspace(3) %p, align 64
ret void
}