JuliaGPU / JuliaGPU/GPUCompiler.jl

Unsupported `jl_apply_generic` IR pattern

Open
#576 0 comments 0 reactions 0 assignees View on GitHub
enhancement
Dominant language
Julia
Stars
187
Forks
68
Avg merge
1d 12h
Merged PRs (30d)
28

Description

```
using Test

using CUDAdrv, CUDAnative

function vadd(a::AbstractArray{T}) where {T}
Base.unsafe_store!(unsafe_convert(CUDAnative.DevicePtr{T,AS.Global}, C_NULL), 1, 1, Val(1))
return
end

function main()
tt = Tuple{CuDeviceArray{Float32,1,AS.Global}}
CUDAnative.code_sass(vadd, tt)
end
```

```
┌ Warning: Decoding arguments to jl_apply_generic failed, please file a bug with a reproducer.
│ inst = %11 = call nonnull %jl_value_t addrspace(10)* @jl_apply_generic(%jl_value_t addrspace(10)* %8, %jl_value_t addrspace(10)** nonnull %.sub, i32 2), !dbg !33
│ bb =

│ julia_vadd_38.exit: ; preds = %found.i, %err.i
│ store %jl_value_t addrspace(10)* addrspacecast (%jl_value_t* inttoptr (i64 140613733290384 to %jl_value_t*) to %jl_value_t addrspace(10)*), %jl_value_t addrspace(10)** %.sub, align 8, !dbg !33
│ %10 = getelementptr inbounds [4 x %jl_value_t addrspace(10)*], [4 x %jl_value_t addrspace(10)*]* %1, i64 0, i64 1, !dbg !33
│ store %jl_value_t addrspace(10)* addrspacecast (%jl_value_t* inttoptr (i64 140613799821008 to %jl_value_t*) to %jl_value_t addrspace(10)*), %jl_value_t addrspace(10)** %10, align 8, !dbg !33
│ %11 = call nonnull %jl_value_t addrspace(10)* @jl_apply_generic(%jl_value_t addrspace(10)* %8, %jl_value_t addrspace(10)** nonnull %.sub, i32 2), !dbg !33
│ store %jl_value_t addrspace(10)* %11, %jl_value_t addrspace(10)** %.sub, align 8, !dbg !33
│ store %jl_value_t addrspace(10)* addrspacecast (%jl_value_t* inttoptr (i64 140613704188000 to %jl_value_t*) to %jl_value_t addrspace(10)*), %jl_value_t addrspace(10)** %10, align 8, !dbg !33
│ %12 = getelementptr inbounds [4 x %jl_value_t addrspace(10)*], [4 x %jl_value_t addrspace(10)*]* %1, i64 0, i64 2, !dbg !33
│ store %jl_value_t addrspace(10)* addrspacecast (%jl_value_t* inttoptr (i64 140613704188000 to %jl_value_t*) to %jl_value_t addrspace(10)*), %jl_value_t addrspace(10)** %12, align 8, !dbg !33
│ %13 = getelementptr inbounds [4 x %jl_value_t addrspace(10)*], [4 x %jl_value_t addrspace(10)*]* %1, i64 0, i64 3, !dbg !33
│ store %jl_value_t addrspace(10)* addrspacecast (%jl_value_t* inttoptr (i64 140613798418304 to %jl_value_t*) to %jl_value_t addrspace(10)*), %jl_value_t addrspace(10)** %13, align 8, !dbg !33
│ %14 = call nonnull %jl_value_t addrspace(10)* @jl_apply_generic(%jl_value_t addrspace(10)* addrspacecast (%jl_value_t* inttoptr (i64 140613817508064 to %jl_value_t*) to %jl_value_t addrspace(10)*), %jl_value_t addrspace(10)** nonnull %.sub, i32 4), !dbg !33
│ ret void

└ @ CUDAnative ~/Julia/pkg/CUDAnative/src/compiler/validation.jl:222
ERROR: InvalidIRError: compiling vadd(CuDeviceArray{Float32,1,CUDAnative.AS.Global}) resulted in invalid LLVM IR
Reason: unsupported use of an undefined name (use of 'unsafe_convert')
Stacktrace:
[1] vadd at /home/tbesard/Julia/wip2.jl:6
Reason: unsupported call to the Julia runtime (call to jl_apply_generic)
Stacktrace:
[1] vadd at /home/tbesard/Julia/wip2.jl:6
Reason: unsupported dynamic function invocation (call to unsafe_store!)
Stacktrace:
[1] vadd at /home/tbesard/Julia/wip2.jl:6
Stacktrace:
[1] check_ir(::CUDAnative.CompilerJob, ::LLVM.Module) at /home/tbesard/Julia/pkg/CUDAnative/src/compiler/validation.jl:114
[2] macro expansion at /home/tbesard/Julia/pkg/CUDAnative/src/compiler/driver.jl:188 [inlined]
[3] macro expansion at /home/tbesard/Julia/pkg/depot/packages/TimerOutputs/7zSea/src/TimerOutput.jl:216 [inlined]
[4] #codegen#130(::Bool, ::Bool, ::Bool, ::Bool, ::Bool, ::typeof(CUDAnative.codegen), ::Symbol, ::CUDAnative.CompilerJob) at /home/tbesard/Julia/pkg/CUDAnative/src/compiler/driver.jl:186
[5] codegen at /home/tbesard/Julia/pkg/CUDAnative/src/compiler/driver.jl:57 [inlined]
[6] code_sass(::Base.TTY, ::CUDAnative.CompilerJob) at /home/tbesard/Julia/pkg/CUDAnative/src/reflection.jl:110
[7] #code_sass#189(::VersionNumber, ::Bool, ::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}, ::typeof(CUDAnative.code_sass), ::Base.TTY, ::Any, ::Any) at /home/tbesard/Julia/pkg/CUDAnative/src/reflection.jl:100
[8] code_sass(::Base.TTY, ::Any, ::Any) at /home/tbesard/Julia/pkg/CUDAnative/src/reflection.jl:98
[9] #code_sass#190(::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}, ::typeof(CUDAnative.code_sass), ::Any, ::Any) at /home/tbesard/Julia/pkg/CUDAnative/src/reflection.jl:134
[10] code_sass at /home/tbesard/Julia/pkg/CUDAnative/src/reflection.jl:134 [inlined]
[11] main() at /home/tbesard/Julia/wip2.jl:12
[12] top-level scope at REPL[5]:1
```

Contributor guide

No contributing guide indexed for this repository

Research direction

Start with the reproducer and run CUDAnative.code_sass to inspect the failure. Read check_ir in CUDAnative/src/compiler/validation.jl, especially the reported lines 114 and 222, and trace how the jl_apply_generic IR pattern is decoded. Done means this pattern no longer produces the decoder warning and invalid LLVM IR errors.

Written by the indexing model from the issue text.

Assessment

Tech stack
julia
Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
32/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.