[LLVMdev] NVPTX: __iAtomicCAS support ?

Dmitry N. Mikushin maemarcus at gmail.com
Wed May 16 05:44:12 PDT 2012


Dear colleagues,

I'm looking if we can replace nvopencc with LLVM NVPTX in our project.
It turns NVPTX won't work with the code nvopencc can handle (please
see the log below). So are atomic intrinsics not supported or am I
doing call in a wrong way?

Thanks,
- Dima.

SOURCE
========

dmikushin at hp2:~> cat kernelgen_monitor.ll
; ModuleID = '/opt/kernelgen/include/kernelgen_monitor.cu'
target datalayout = "e-p:64:64-i64:64:64-f64:64:64-n1:8:16:32:64"
target triple = "ptx64-unknown-unknown"

%struct.kernelgen_callback_t = type { i32, i32,
%"struct.kernelgen::kernel_t"*, i32, i32,
%struct.kernelgen_callback_data_t* }
%"struct.kernelgen::kernel_t" = type opaque
%struct.kernelgen_callback_data_t = type opaque

define ptx_kernel void @_Z17kernelgen_monitorPi(i32* %callback) nounwind {
entry:
  %callback.addr = alloca i32*, align 8
  store i32* %callback, i32** %callback.addr, align 8
  %0 = load i32** %callback.addr, align 8
  %1 = bitcast i32* %0 to %struct.kernelgen_callback_t*
  %lock = getelementptr inbounds %struct.kernelgen_callback_t* %1, i32 0, i32 0
  %call = call ptx_device i32 @_Z12__iAtomicCASPiii(i32* %lock, i32 1, i32 0)
  br label %while.cond

while.cond:                                       ; preds = %while.body, %entry
  %2 = load i32** %callback.addr, align 8
  %3 = bitcast i32* %2 to %struct.kernelgen_callback_t*
  %lock1 = getelementptr inbounds %struct.kernelgen_callback_t* %3, i32 0, i32 0
  %call2 = call ptx_device i32 @_Z12__iAtomicCASPiii(i32* %lock1, i32 1, i32 1)
  %tobool = icmp ne i32 %call2, 0
  %lnot = xor i1 %tobool, true
  br i1 %lnot, label %while.body, label %while.end

while.body:                                       ; preds = %while.cond
  br label %while.cond

while.end:                                        ; preds = %while.cond
  ret void
}

declare ptx_device i32 @_Z12__iAtomicCASPiii(i32*, i32, i32)

CODEGEN
=========

dmikushin at hp2:~> llc < kernelgen_monitor.ll -march=nvptx -mcpu=sm_20
//
// Generated by LLVM NVPTX Back-End
//

.version 3.0
.target sm_20, texmode_independent
.address_size 32

.func  (.param .b32 func_retval0) _Z12__iAtomicCASPiii
(
	.param .b32 _Z12__iAtomicCASPiii_param_0,
	.param .b32 _Z12__iAtomicCASPiii_param_1,
	.param .b32 _Z12__iAtomicCASPiii_param_2
)
;

Not Implemented
UNREACHABLE executed at
/tmp/rpmbuild_debug/BUILD/llvm/build/include/llvm/Target/TargetLowering.h:1249!
0  libLLVM-3.2svn.so 0x00007f47738b8f5f
1  libLLVM-3.2svn.so 0x00007f47738b9525
2  libpthread.so.0   0x00007f47726135d0
3  libc.so.6         0x00007f4771931945 gsignal + 53
4  libc.so.6         0x00007f4771932f21 abort + 385
5  libLLVM-3.2svn.so 0x00007f47738a24c1
llvm::report_fatal_error(llvm::Twine const&) + 0
6  libLLVM-3.2svn.so 0x00007f47735cd390
7  libLLVM-3.2svn.so 0x00007f47737fe2ba
llvm::TargetLowering::LowerCallTo(llvm::SDValue, llvm::Type*, bool,
bool, bool, bool, unsigned int, llvm::CallingConv::ID, bool, bool,
bool, llvm::SDValue, std::vector<llvm::TargetLowering::ArgListEntry,
std::allocator<llvm::TargetLowering::ArgListEntry> >&,
llvm::SelectionDAG&, llvm::DebugLoc) const + 2120
8  libLLVM-3.2svn.so 0x00007f4773807199
llvm::SelectionDAGBuilder::LowerCallTo(llvm::ImmutableCallSite,
llvm::SDValue, bool, llvm::MachineBasicBlock*) + 2913
9  libLLVM-3.2svn.so 0x00007f477381b3af
llvm::SelectionDAGBuilder::visitCall(llvm::CallInst const&) + 9681
10 libLLVM-3.2svn.so 0x00007f477382abee
llvm::SelectionDAGBuilder::visit(unsigned int, llvm::User const&) +
1044
11 libLLVM-3.2svn.so 0x00007f477382ad6d
llvm::SelectionDAGBuilder::visit(llvm::Instruction const&) + 105
12 libLLVM-3.2svn.so 0x00007f4773844925
llvm::SelectionDAGISel::SelectBasicBlock(llvm::ilist_iterator<llvm::Instruction
const>, llvm::ilist_iterator<llvm::Instruction const>, bool&) + 59
13 libLLVM-3.2svn.so 0x00007f477384540c
llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) +
2620
14 libLLVM-3.2svn.so 0x00007f47738459c6
llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) +
896
15 libLLVM-3.2svn.so 0x00007f4773175bfe
llvm::MachineFunctionPass::runOnFunction(llvm::Function&) + 82
16 libLLVM-3.2svn.so 0x00007f47733ac299
llvm::FPPassManager::runOnFunction(llvm::Function&) + 331
17 libLLVM-3.2svn.so 0x00007f47733ac474
llvm::FPPassManager::runOnModule(llvm::Module&) + 86
18 libLLVM-3.2svn.so 0x00007f47733abf6d
llvm::MPPassManager::runOnModule(llvm::Module&) + 381
19 libLLVM-3.2svn.so 0x00007f47733ad6eb
llvm::PassManagerImpl::run(llvm::Module&) + 111
20 libLLVM-3.2svn.so 0x00007f47733ad74d
llvm::PassManager::run(llvm::Module&) + 33
21 llc               0x000000000040eed6 main + 2835
22 libc.so.6         0x00007f477191dbc6 __libc_start_main + 230
23 llc               0x000000000040cc09
Stack dump:
0.	Program arguments: llc -march=nvptx -mcpu=sm_20
1.	Running pass 'Function Pass Manager' on module '<stdin>'.
2.	Running pass 'NVPTX DAG->DAG Pattern Instruction Selection' on
function '@_Z17kernelgen_monitorPi'
Aborted
dmikushin at hp2:~> cd ~/rpmbuild/BUILD/llvm/ && svn info
Path: .
Working Copy Root Path: /tmp/rpmbuild_debug/BUILD/llvm
URL: http://llvm.org/svn/llvm-project/llvm/trunk
Repository Root: http://llvm.org/svn/llvm-project
Repository UUID: 91177308-0d34-0410-b5e6-96231b3b80d8
Revision: 156703
Node Kind: directory
Schedule: normal
Last Changed Author: foad
Last Changed Rev: 156703
Last Changed Date: 2012-05-12 12:30:16 +0400 (Sat, 12 May 2012)



More information about the llvm-dev mailing list