JuliaGPU / JuliaGPU/GPUCompiler.jl

Decoding call to jl_apply_generic fails if arguments are stored in alloca

Open
#575 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

From: https://github.com/vchuravy/GPUifyLoops.jl/pull/58#issuecomment-490147476

Looks like the issue is that calls are first stored in an alloca.

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

│ top:
│ %1 = alloca [2 x %jl_value_t addrspace(10)*], align 8
│ %.sub = getelementptr inbounds [2 x %jl_value_t addrspace(10)*], [2 x %jl_value_t addrspace(10)*]* %1, i64 0, i64 0
│ %2 = call fastcc %jl_value_t addrspace(10)* @ptx_gc_pool_alloc(i64 8), !dbg !43
│ %3 = getelementptr inbounds [1 x i64], [1 x i64] addrspace(11)* %0, i64 0, i64 0, !dbg !43
│ %4 = bitcast %jl_value_t addrspace(10)* %2 to i64 addrspace(10)*, !dbg !43
│ %5 = load i64, i64 addrspace(11)* %3, align 8, !dbg !43, !tbaa !44, !invariant.load !4
│ store i64 %5, i64 addrspace(10)* %4, align 8, !dbg !43, !tbaa !47
│ store %jl_value_t addrspace(10)* addrspacecast (%jl_value_t* inttoptr (i64 140429411225104 to %jl_value_t*) to %jl_value_t addrspace(10)*), %jl_value_t addrspace(10)** %.sub, align 8, !dbg !43
│ %6 = getelementptr inbounds [2 x %jl_value_t addrspace(10)*], [2 x %jl_value_t addrspace(10)*]* %1, i64 0, i64 1, !dbg !43
│ store %jl_value_t addrspace(10)* %2, %jl_value_t addrspace(10)** %6, align 8, !dbg !43
│ %7 = call nonnull %jl_value_t addrspace(10)* @jl_f_apply_type(%jl_value_t addrspace(10)* addrspacecast (%jl_value_t* null to %jl_value_t addrspace(10)*), %jl_value_t addrspace(10)** nonnull %.sub, i32 2), !dbg !43
│ store %jl_value_t addrspace(10)* %7, %jl_value_t addrspace(10)** %.sub, align 8, !dbg !43
│ %8 = call nonnull %jl_value_t addrspace(10)* @jl_apply_generic(%jl_value_t addrspace(10)** nonnull %.sub, i32 1), !dbg !43
│ ret %jl_value_t addrspace(10)* %8, !dbg !43

└ @ CUDAnative ~/.julia/packages/CUDAnative/wU0tS/src/compiler/validation.jl:213
┌ Warning: Decoding arguments to jl_apply_generic failed, please file a bug with a reproducer.
│ inst = %8 = call nonnull %jl_value_t addrspace(10)* @jl_apply_generic(%jl_value_t addrspace(10)** nonnull %.sub, i32 1), !dbg !43
│ bb =

│ top:
│ %1 = alloca [2 x %jl_value_t addrspace(10)*], align 8
│ %.sub = getelementptr inbounds [2 x %jl_value_t addrspace(10)*], [2 x %jl_value_t addrspace(10)*]* %1, i64 0, i64 0
│ %2 = call fastcc %jl_value_t addrspace(10)* @ptx_gc_pool_alloc(i64 8), !dbg !43
│ %3 = getelementptr inbounds [1 x i64], [1 x i64] addrspace(11)* %0, i64 0, i64 0, !dbg !43
│ %4 = bitcast %jl_value_t addrspace(10)* %2 to i64 addrspace(10)*, !dbg !43
│ %5 = load i64, i64 addrspace(11)* %3, align 8, !dbg !43, !tbaa !44, !invariant.load !4
│ store i64 %5, i64 addrspace(10)* %4, align 8, !dbg !43, !tbaa !47
│ store %jl_value_t addrspace(10)* addrspacecast (%jl_value_t* inttoptr (i64 140429411225104 to %jl_value_t*) to %jl_value_t addrspace(10)*), %jl_value_t addrspace(10)** %.sub, align 8, !dbg !43
│ %6 = getelementptr inbounds [2 x %jl_value_t addrspace(10)*], [2 x %jl_value_t addrspace(10)*]* %1, i64 0, i64 1, !dbg !43
│ store %jl_value_t addrspace(10)* %2, %jl_value_t addrspace(10)** %6, align 8, !dbg !43
│ %7 = call nonnull %jl_value_t addrspace(10)* @jl_f_apply_type(%jl_value_t addrspace(10)* addrspacecast (%jl_value_t* null to %jl_value_t addrspace(10)*), %jl_value_t addrspace(10)** nonnull %.sub, i32 2), !dbg !43
│ store %jl_value_t addrspace(10)* %7, %jl_value_t addrspace(10)** %.sub, align 8, !dbg !43
│ %8 = call nonnull %jl_value_t addrspace(10)* @jl_apply_generic(%jl_value_t addrspace(10)** nonnull %.sub, i32 1), !dbg !43
│ ret %jl_value_t addrspace(10)* %8, !dbg !43

└ @ CUDAnative ~/.julia/packages/CUDAnative/wU0tS/src/compiler/validation.jl:213
```

Contributor guide

No contributing guide indexed for this repository

Research direction

Start at CUDAnative's compiler/validation.jl:213 and inspect the argument-decoding path for jl_apply_generic calls. Use the alloca-backed LLVM IR in this report as the reproducer; done means the call's arguments are decoded without the warning.

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
Needs clarification
Newbie friendliness
25/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.