Skip to content

Commit

Permalink
AMDGPU: Force skip branches over calls
Browse files Browse the repository at this point in the history
Unfortunately the way SIInsertSkips works is backwards, and is
required for correctness. r338235 added handling of some special cases
where skipping is mandatory to avoid side effects if no lanes are
active. It conservatively handled asm correctly, but the same logic
needs to apply to calls.

Usually the call sequence code is larger than the skip threshold,
although the way the count is computed is really broken, so I'm not
sure if anything was likely to really hit this.

llvm-svn: 361202
  • Loading branch information
arsenm committed May 20, 2019
1 parent d75a045 commit 6dd08e3
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 1 deletion.
2 changes: 1 addition & 1 deletion llvm/lib/Target/AMDGPU/SIInstrInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2486,7 +2486,7 @@ bool SIInstrInfo::hasUnwantedEffectsWhenEXECEmpty(const MachineInstr &MI) const
Opcode == AMDGPU::DS_ORDERED_COUNT)
return true;

if (MI.isInlineAsm())
if (MI.isCall() || MI.isInlineAsm())
return true; // conservative assumption

// These are like SALU instructions in terms of effects, so it's questionable
Expand Down
67 changes: 67 additions & 0 deletions llvm/test/CodeGen/AMDGPU/call-skip.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=hawaii < %s | FileCheck -enable-var-scope -check-prefix=GCN %s

; A call should be skipped if all lanes are zero, since we don't know
; what side effects should be avoided inside the call.
define hidden void @func() #1 {
ret void
}

; GCN-LABEL: {{^}}if_call:
; GCN: s_and_saveexec_b64
; GCN-NEXT: ; mask branch [[END:BB[0-9]+_[0-9]+]]
; GCN-NEXT: s_cbranch_execz [[END]]
; GCN: s_swappc_b64
; GCN: [[END]]:
define void @if_call(i32 %flag) #0 {
%cc = icmp eq i32 %flag, 0
br i1 %cc, label %call, label %end

call:
call void @func()
br label %end

end:
ret void
}

; GCN-LABEL: {{^}}if_asm:
; GCN: s_and_saveexec_b64
; GCN-NEXT: ; mask branch [[END:BB[0-9]+_[0-9]+]]
; GCN-NEXT: s_cbranch_execz [[END]]
; GCN: ; sample asm
; GCN: [[END]]:
define void @if_asm(i32 %flag) #0 {
%cc = icmp eq i32 %flag, 0
br i1 %cc, label %call, label %end

call:
call void asm sideeffect "; sample asm", ""()
br label %end

end:
ret void
}

; GCN-LABEL: {{^}}if_call_kernel:
; GCN: s_and_saveexec_b64
; GCN-NEXT: ; mask branch [[END:BB[0-9]+_[0-9]+]]
; GCN-NEXT: s_cbranch_execz [[END]]
; GCN: s_swappc_b64
define amdgpu_kernel void @if_call_kernel() #0 {
%id = call i32 @llvm.amdgcn.workitem.id.x()
%cc = icmp eq i32 %id, 0
br i1 %cc, label %call, label %end

call:
call void @func()
br label %end

end:
ret void
}

declare i32 @llvm.amdgcn.workitem.id.x() #2

attributes #0 = { nounwind }
attributes #1 = { nounwind noinline }
attributes #2 = { nounwind readnone speculatable }

0 comments on commit 6dd08e3

Please sign in to comment.