Hi,all
I’m working on adding AMDGPU backend for a JIT compiler(Taichi) and in a bit of trouble now.
With O3 optimization
llvm::PassManagerBuilder builder;
builder.OptLevel = 3;
builder.Inliner =
llvm::createFunctionInliningPass(builder.OptLevel, 0, false);
I will get the code snippet of LLVM-IR
entry:
%0 = tail call i32 @llvm.amdgcn.workitem.id.x()
%1 = tail call align 4 dereferenceable(64) i8 addrspace(4)* @llvm.amdgcn.dispatch.ptr()
%2 = getelementptr inbounds i8, i8 addrspace(4)* %1, i64 12
%3 = bitcast i8 addrspace(4)* %2 to i32 addrspace(4)*, !amdgpu.uniform !7
%4 = load i32, i32 addrspace(4)* %3, align 4, !tbaa !8
%5 = getelementptr i8, i8 addrspace(4)* %1, i64 4
%6 = bitcast i8 addrspace(4)* %5 to i16 addrspace(4)*, !amdgpu.uniform !7
%7 = load i16, i16 addrspace(4)* %6, align 4, !range !17, !invariant.load !7
%8 = tail call i32 @llvm.amdgcn.workgroup.id.x()
%9 = zext i16 %7 to i32
%10 = mul i32 %8, %9
%11 = sub i32 %4, %10
%12 = tail call i32 @llvm.umin.i32(i32 %11, i32 %9)
%13 = mul nsw i32 %12, %8
%14 = add nsw i32 %13, %0
%15 = icmp slt i32 %14, 16777216
%16 = call { i1, i32 } @llvm.amdgcn.if.i32(i1 %15)
%17 = extractvalue { i1, i32 } %16, 0
%18 = extractvalue { i1, i32 } %16, 1
br i1 %17, label %.lr.ph, label %Flow47
when I use llc
to generate GCN
assembly(llc xxx.ll), I get this error
LLVM ERROR: Cannot select: intrinsic %llvm.amdgcn.if
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0. Program arguments: llc taichi_kernel_amdgpu_llvm_ir_optimized_0005.ll
1. Running pass 'CallGraph Pass Manager' on module 'taichi_kernel_amdgpu_llvm_ir_optimized_0005.ll'.
2. Running pass 'AMDGPU DAG->DAG Pattern Instruction Selection' on function '@saxpy_kernel_c76_0_kernel_0_range_for'
#0 0x000000000231b3e3 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int)
#1 0x000000000231933e llvm::sys::RunSignalHandlers()
#2 0x000000000231b76f SignalHandler(int) Signals.cpp:0:0
#3 0x00007f0b5bf22420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
#4 0x00007f0b5ba0100b raise (/lib/x86_64-linux-gnu/libc.so.6+0x4300b)
#5 0x00007f0b5b9e0859 abort (/lib/x86_64-linux-gnu/libc.so.6+0x22859)
#6 0x0000000002297108
#7 0x000000000218da41
#8 0x000000000218cf9d
#9 0x0000000002185c2f llvm::SelectionDAGISel::DoInstructionSelection()
#10 0x00000000021852e0 llvm::SelectionDAGISel::CodeGenAndEmitDAG()
#11 0x000000000218457f llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&)
#12 0x00000000021822f7 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&)
#13 0x0000000000b031f4 AMDGPUDAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&)
#14 0x0000000001965a8e llvm::MachineFunctionPass::runOnFunction(llvm::Function&)
#15 0x0000000001cf6a8d llvm::FPPassManager::runOnFunction(llvm::Function&)
#16 0x0000000001623fe2 (anonymous namespace)::CGPassManager::runOnModule(llvm::Module&) CallGraphSCCPass.cpp:0:0
#17 0x0000000001cf7660 llvm::legacy::PassManagerImpl::run(llvm::Module&)
#18 0x00000000006e749e main
#19 0x00007f0b5b9e2083 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x24083)
#20 0x00000000006e25da _start
Aborted (core dumped)