1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 10:42:39 +01:00
llvm-mirror/test/CodeGen/NVPTX/calls-with-phi.ll
Justin Lebar 10af09a34f [NVPTX] Allow libcalls that are defined in the current module.
The patch adds a possibility to make library calls on NVPTX.

An important thing about library functions - they must be defined within
the current module. This basically should guarantee that we produce a
valid PTX assembly (without calls to not defined functions). The one who
wants to use the libcalls is probably will have to link against
compiler-rt or any other implementation.

Currently, it's completely impossible to make library calls because of
error LLVM ERROR: Cannot select: i32 = ExternalSymbol '...'. But we can
lower ExternalSymbol to TargetExternalSymbol and verify if the function
definition is available.

Also, there was an issue with a DAG during legalisation. When we expand
instruction into libcall, the inner call-chain isn't being "integrated"
into outer chain. Since the last "data-flow" (call retval load) node is
located in call-chain earlier than CALLSEQ_END node, the latter becomes
a leaf and therefore a dead node (and is being removed quite fast).
Proposed here solution relies on another data-flow pseudo nodes
(ProxyReg) which purpose is only to keep CALLSEQ_END at legalisation and
instruction selection phases - we remove the pseudo instructions before
register scheduling phase.

Patch by Denys Zariaiev!

Differential Revision: https://reviews.llvm.org/D34708

llvm-svn: 350069
2018-12-26 19:12:31 +00:00

23 lines
433 B
LLVM

; RUN: llc < %s -march=nvptx 2>&1 | FileCheck %s
; Make sure the example doesn't crash with segfault
; CHECK: .visible .func ({{.*}}) loop
define i32 @loop(i32, i32) {
entry:
br label %loop
loop:
%i = phi i32 [ %0, %entry ], [ %res, %loop ]
%res = call i32 @div(i32 %i, i32 %1)
%exitcond = icmp eq i32 %res, %0
br i1 %exitcond, label %exit, label %loop
exit:
ret i32 %res
}
define i32 @div(i32, i32) {
ret i32 0
}