Verify loads from global uniqued pointers.
- Dominant language
- Julia
- Stars
- 1.4k
- Forks
- 281
- Avg merge
- 1d 7h
- Merged PRs (30d)
- 30
Description
The `kernel` below ends up sneaking a `getelemptr` to a CPU pointer past the verifier.
```julia
using CUDAnative
function kernel()
I = findfirst(isequal(:y), (:x, :y, :z))
nothing
end
```
```
define void @ptxcall_kernel_28() local_unnamed_addr {
entry:
%value_phi.i1 = load %jl_value_t addrspace(10)*, %jl_value_t addrspace(10)** inttoptr (i64 140437212784368 to %jl_value_t addrspace(10)**), align 16, !tbaa !2, !nonnull !7
%0 = addrspacecast %jl_value_t addrspace(10)* %value_phi.i1 to %jl_value_t addrspace(11)*
%1 = icmp eq %jl_value_t addrspace(11)* %0, addrspacecast (%jl_value_t* inttoptr (i64 140437181828360 to %jl_value_t*) to %jl_value_t addrspace(11)*)
br i1 %1, label %julia_kernel_28.exit, label %L8.i.lr.ph
L8.i.lr.ph: ; preds = %entry
br label %L8.i
L8.i: ; preds = %L8.i.lr.ph, %L26.i
%value_phi1.i2 = phi i64 [ 1, %L8.i.lr.ph ], [ %4, %L26.i ]
%2 = icmp eq i64 %value_phi1.i2, 3
br i1 %2, label %julia_kernel_28.exit, label %L19.i
L19.i: ; preds = %L8.i
%3 = icmp ult i64 %value_phi1.i2, 3
br i1 %3, label %L26.i, label %fail.i
L26.i: ; preds = %fail.i, %L19.i
%4 = add nuw nsw i64 %value_phi1.i2, 1
%5 = getelementptr inbounds %jl_value_t addrspace(10)*, %jl_value_t addrspace(10)** inttoptr (i64 140437212785040 to %jl_value_t addrspace(10)**), i64 %value_phi1.i2
%value_phi.i = load %jl_value_t addrspace(10)*, %jl_value_t addrspace(10)** %5, align 8, !tbaa !2, !nonnull !7
%6 = addrspacecast %jl_value_t addrspace(10)* %value_phi.i to %jl_value_t addrspace(11)*
%7 = icmp eq %jl_value_t addrspace(11)* %6, addrspacecast (%jl_value_t* inttoptr (i64 140437181828360 to %jl_value_t*) to %jl_value_t addrspace(11)*)
br i1 %7, label %julia_kernel_28.exit, label %L8.i
fail.i: ; preds = %L19.i
call fastcc void @ptx_report_exception(i64 ptrtoint ([13 x i8]* @exception to i64))
call void asm sideeffect "trap;", ""() JuliaGPU/CUDAnative.jl#1
br label %L26.i
julia_kernel_28.exit: ; preds = %L26.i, %L8.i, %entry
ret void
}
```
Nore the `inttoptr` operations. This ends up with a:
```
ERROR: error in running finalizer: CUDAdrv.CuError(code=700, meta=nothing)
CUDA error: an illegal memory access was encountered (code #700, ERROR_ILLEGAL_ADDRESS)
```
and `cuda-memcheck` reports a global load. Took me a while to figure out where this was coming from.
cc: @simonbyrne
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.