Skip to content

Instantly share code, notes, and snippets.

@SimonDanisch
Last active December 2, 2021 14:46
Show Gist options
  • Save SimonDanisch/475064ae102141554f65e926f3070630 to your computer and use it in GitHub Desktop.
Save SimonDanisch/475064ae102141554f65e926f3070630 to your computer and use it in GitHub Desktop.
julia --project=. -e "using Pkg; pkg"add RadeonProRender#sd/moah GeometryBasics RadeonProRender_jll@2.2.7"

executed with:

julia --project=. --check-bounds=(yes|no) rpr_mwe.jl

Diff of the llvm code: https://www.diffchecker.com/chE5Jtim

define nonnull {}* @japi1_shape_299({}* %0, {}** %1, i32 %2) #0 {
top:
%3 = alloca [3 x {}*], align 8
%gcframe29 = alloca [4 x {}*], align 16
%gcframe29.sub = getelementptr inbounds [4 x {}*], [4 x {}*]* %gcframe29, i64 0, i64 0
%.sub = getelementptr inbounds [3 x {}*], [3 x {}*]* %3, i64 0, i64 0
%4 = bitcast [4 x {}*]* %gcframe29 to i8*
call void @llvm.memset.p0i8.i32(i8* nonnull align 16 dereferenceable(32) %4, i8 0, i32 32, i1 false)
%5 = alloca {}**, align 8
store volatile {}** %1, {}*** %5, align 8
%6 = call {}*** inttoptr (i64 33937920 to {}*** ()*)() #3
%7 = bitcast [4 x {}*]* %gcframe29 to i64*
store i64 8, i64* %7, align 16
%8 = getelementptr inbounds [4 x {}*], [4 x {}*]* %gcframe29, i64 0, i64 1
%9 = bitcast {}** %8 to {}***
%10 = load {}**, {}*** %6, align 8
store {}** %10, {}*** %9, align 8
%11 = bitcast {}*** %6 to {}***
store {}** %gcframe29.sub, {}*** %11, align 8
%12 = load {}*, {}** %1, align 8
%13 = getelementptr inbounds {}*, {}** %1, i64 1
%14 = load {}*, {}** %13, align 8
%15 = getelementptr inbounds {}*, {}** %1, i64 2
%16 = load {}*, {}** %15, align 8
%17 = getelementptr inbounds {}*, {}** %1, i64 3
%18 = load {}*, {}** %17, align 8
%19 = getelementptr inbounds {}*, {}** %1, i64 4
%20 = load {}*, {}** %19, align 8
%21 = bitcast {}* %18 to { i8*, i64, i16, i16, i32 }*
%22 = getelementptr inbounds { i8*, i64, i16, i16, i32 }, { i8*, i64, i16,
i16, i32 }* %21, i64 0, i32 1
%23 = load i64, i64* %22, align 8
%24 = udiv i64 %23, 3
%25 = call nonnull {}* inttoptr (i64 33762272 to {}* ({}*, i64)*)({}* inttoptr (i64 292740160 to {}*), i64 %24)
%26 = bitcast {}* %25 to {}**
%27 = getelementptr inbounds {}*, {}** %26, i64 3
%28 = bitcast {}** %27 to i64*
%29 = load i64, i64* %28, align 8
%.not.not = icmp eq i64 %29, 0
br i1 %.not.not, label %L35, label %L17.preheader
L17.preheader: ; preds = %top
%30 = bitcast {}* %25 to i32**
%31 = load i32*, i32** %30, align 8
%min.iters.check = icmp ult i64 %29, 32
br i1 %min.iters.check, label %L17, label %vector.ph
vector.ph: ; preds = %L17.preheader
%n.vec = and i64 %29, 9223372036854775776
%ind.end = or i64 %n.vec, 1
br label %vector.body
vector.body: ; preds = %vector.body, %vector.ph
%index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
%32 = getelementptr inbounds i32, i32* %31, i64 %index
%33 = bitcast i32* %32 to <8 x i32>*
store <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>, <8 x i32>* %33, align 4
%34 = getelementptr inbounds i32, i32* %32, i64 8
%35 = bitcast i32* %34 to <8 x i32>*
store <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>, <8 x i32>* %35, align 4
%36 = getelementptr inbounds i32, i32* %32, i64 16
%37 = bitcast i32* %36 to <8 x i32>*
store <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>, <8 x i32>* %37, align 4
%38 = getelementptr inbounds i32, i32* %32, i64 24
%39 = bitcast i32* %38 to <8 x i32>*
store <8 x i32> <i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3, i32 3>, <8 x i32>* %39, align 4
%index.next = add i64 %index, 32
%40 = icmp eq i64 %index.next, %n.vec
br i1 %40, label %middle.block, label %vector.body
middle.block: ; preds = %vector.body
%cmp.n = icmp eq i64 %29, %n.vec
br i1 %cmp.n, label %L35, label %L17
L17: ; preds = %L17, %middle.block, %L17.preheader
%value_phi3 = phi i64 [ %43, %L17 ], [ %ind.end, %middle.block ], [ 1, %L17.preheader ]
%41 = add nsw i64 %value_phi3, -1
%42 = getelementptr inbounds i32, i32* %31, i64 %41
store i32 3, i32* %42, align 4
%.not = icmp eq i64 %value_phi3, %29
%43 = add nuw nsw i64 %value_phi3, 1
br i1 %.not, label %L35, label %L17
L35: ; preds = %L17, %middle.block, %top
%44 = bitcast {}* %14 to { i8*, i64, i16, i16, i32 }*
%45 = getelementptr inbounds { i8*, i64, i16, i16, i32 }, { i8*, i64, i16,
i16, i32 }* %44, i64 0, i32 1
%46 = load i64, i64* %45, align 8
%47 = bitcast {}* %16 to { i8*, i64, i16, i16, i32 }*
%48 = getelementptr inbounds { i8*, i64, i16, i16, i32 }, { i8*, i64, i16,
i16, i32 }* %47, i64 0, i32 1
%49 = load i64, i64* %48, align 8
%50 = bitcast {}* %20 to { i8*, i64, i16, i16, i32 }*
%51 = getelementptr inbounds { i8*, i64, i16, i16, i32 }, { i8*, i64, i16,
i16, i32 }* %50, i64 0, i32 1
%52 = load i64, i64* %51, align 8
%53 = getelementptr inbounds [4 x {}*], [4 x {}*]* %gcframe29, i64 0, i64 2
store {}* %25, {}** %53, align 16
%54 = call i64 @j_rprContextCreateMesh_300({}* nonnull %12, {}* nonnull %14, i64 signext %46, i64 signext 12, {}* nonnull %16, i64 signext %49, i64 signext 12, {}* nonnull %20, i64 signext %52, i64 signext 8, {}* nonnull %18, i64 signext 4, {}* nonnull %18, i64 signext 4, {}* nonnull %18, i64 signext 4, {}* nonnull %25, i64 signext %24) #4
%ptls_field13 = getelementptr inbounds {}**, {}*** %6, i64 2305843009213693954
%55 = bitcast {}*** %ptls_field13 to i8**
%ptls_load1415 = load i8*, i8** %55, align 8
%56 = call noalias nonnull {}* @jl_gc_pool_alloc(i8* %ptls_load1415, i32 1416, i32 32) #5
%57 = bitcast {}* %56 to i64*
%58 = getelementptr inbounds i64, i64* %57, i64 -1
store atomic i64 224290912, i64* %58 unordered, align 8
%59 = bitcast {}* %56 to {}**
%60 = getelementptr inbounds {}*, {}** %59, i64 1
store {}* null, {}** %60, align 8
store i64 %54, i64* %57, align 8
%61 = bitcast {}* %56 to i8*
%62 = getelementptr inbounds i8, i8* %61, i64 8
%ptls_load111819 = load i8*, i8** %55, align 8
%63 = getelementptr inbounds [4 x {}*], [4 x {}*]* %gcframe29, i64 0, i64 3
store {}* %56, {}** %63, align 8
%64 = call noalias nonnull {}* @jl_gc_pool_alloc(i8* %ptls_load111819, i32
1440, i32 48) #5
%65 = bitcast {}* %64 to i64*
%66 = getelementptr inbounds i64, i64* %65, i64 -1
store atomic i64 1967728656, i64* %66 unordered, align 8
%67 = bitcast {}* %64 to [5 x {}*]*
%.repack = bitcast {}* %64 to {}**
store {}* %14, {}** %.repack, align 8
%.repack20 = getelementptr inbounds [5 x {}*], [5 x {}*]* %67, i64 0, i64 1
store {}* %16, {}** %.repack20, align 8
%.repack22 = getelementptr inbounds [5 x {}*], [5 x {}*]* %67, i64 0, i64 2
store {}* %20, {}** %.repack22, align 8
%.repack24 = getelementptr inbounds [5 x {}*], [5 x {}*]* %67, i64 0, i64 3
store {}* %18, {}** %.repack24, align 8
%.repack26 = getelementptr inbounds [5 x {}*], [5 x {}*]* %67, i64 0, i64 4
store {}* %25, {}** %.repack26, align 8
%68 = bitcast i8* %62 to {}**
store {}* %64, {}** %68, align 8
%69 = load atomic i64, i64* %58 unordered, align 8
%70 = and i64 %69, 3
%71 = icmp eq i64 %70, 3
br i1 %71, label %72, label %73
72: ; preds = %L35
call void @jl_gc_queue_root({}* nonnull %56)
br label %73
73: ; preds = %72, %L35
%74 = bitcast {}* %12 to i8*
%75 = getelementptr inbounds i8, i8* %74, i64 8
%76 = bitcast i8* %75 to {}***
%77 = load atomic {}**, {}*** %76 unordered, align 8
%78 = load atomic {}*, {}** %77 unordered, align 8
store {}* %78, {}** %53, align 16
store {}* %78, {}** %.sub, align 8
%79 = getelementptr inbounds [3 x {}*], [3 x {}*]* %3, i64 0, i64 1
store {}* inttoptr (i64 182976520 to {}*), {}** %79, align 8
%80 = getelementptr inbounds [3 x {}*], [3 x {}*]* %3, i64 0, i64 2
store {}* %56, {}** %80, align 8
%81 = call nonnull {}* @"j1_setindex!_301"({}* inttoptr (i64 346054560 to {}*), {}** nonnull %.sub, i32 3)
%82 = load {}*, {}** %8, align 8
%83 = bitcast {}*** %6 to {}**
store {}* %82, {}** %83, align 8
ret {}* %56
}
define nonnull {}* @japi1_shape_299({}* %0, {}** %1, i32 %2) #0 {
top:
%3 = alloca [3 x {}*], align 8
%gcframe31 = alloca [4 x {}*], align 16
%gcframe31.sub = getelementptr inbounds [4 x {}*], [4 x {}*]* %gcframe31, i64 0, i64 0
%.sub = getelementptr inbounds [3 x {}*], [3 x {}*]* %3, i64 0, i64 0
%4 = bitcast [4 x {}*]* %gcframe31 to i8*
call void @llvm.memset.p0i8.i32(i8* nonnull align 16 dereferenceable(32) %4, i8 0, i32 32, i1 false)
%5 = alloca {}**, align 8
store volatile {}** %1, {}*** %5, align 8
%6 = call {}*** inttoptr (i64 41867776 to {}*** ()*)() #3
%7 = bitcast [4 x {}*]* %gcframe31 to i64*
store i64 8, i64* %7, align 16
%8 = getelementptr inbounds [4 x {}*], [4 x {}*]* %gcframe31, i64 0, i64 1
%9 = bitcast {}** %8 to {}***
%10 = load {}**, {}*** %6, align 8
store {}** %10, {}*** %9, align 8
%11 = bitcast {}*** %6 to {}***
store {}** %gcframe31.sub, {}*** %11, align 8
%12 = load {}*, {}** %1, align 8
%13 = getelementptr inbounds {}*, {}** %1, i64 1
%14 = load {}*, {}** %13, align 8
%15 = getelementptr inbounds {}*, {}** %1, i64 2
%16 = load {}*, {}** %15, align 8
%17 = getelementptr inbounds {}*, {}** %1, i64 3
%18 = load {}*, {}** %17, align 8
%19 = getelementptr inbounds {}*, {}** %1, i64 4
%20 = load {}*, {}** %19, align 8
%21 = bitcast {}* %18 to { i8*, i64, i16, i16, i32 }*
%22 = getelementptr inbounds { i8*, i64, i16, i16, i32 }, { i8*, i64, i16,
i16, i32 }* %21, i64 0, i32 1
%23 = load i64, i64* %22, align 8
%24 = udiv i64 %23, 3
%25 = call nonnull {}* inttoptr (i64 41692128 to {}* ({}*, i64)*)({}* inttoptr (i64 292150336 to {}*), i64 %24)
%26 = bitcast {}* %25 to {}**
%27 = getelementptr inbounds {}*, {}** %26, i64 3
%28 = bitcast {}** %27 to i64*
%29 = load i64, i64* %28, align 8
%.not.not = icmp eq i64 %29, 0
br i1 %.not.not, label %L35, label %L17.preheader
L17.preheader: ; preds = %top
%30 = bitcast {}* %25 to { i8*, i64, i16, i16, i32 }*
%31 = getelementptr inbounds { i8*, i64, i16, i16, i32 }, { i8*, i64, i16,
i16, i32 }* %30, i64 0, i32 1
%32 = load i64, i64* %31, align 8
%33 = bitcast {}* %25 to i32**
%34 = add nuw nsw i64 %32, 1
br label %L17
L17: ; preds = %idxend, %L17.preheader
%value_phi3 = phi i64 [ %79, %idxend ], [ 1, %L17.preheader ]
%exitcond.not = icmp eq i64 %value_phi3, %34
br i1 %exitcond.not, label %oob, label %idxend
L35: ; preds = %idxend, %top
%35 = bitcast {}* %14 to { i8*, i64, i16, i16, i32 }*
%36 = getelementptr inbounds { i8*, i64, i16, i16, i32 }, { i8*, i64, i16,
i16, i32 }* %35, i64 0, i32 1
%37 = load i64, i64* %36, align 8
%38 = bitcast {}* %16 to { i8*, i64, i16, i16, i32 }*
%39 = getelementptr inbounds { i8*, i64, i16, i16, i32 }, { i8*, i64, i16,
i16, i32 }* %38, i64 0, i32 1
%40 = load i64, i64* %39, align 8
%41 = bitcast {}* %20 to { i8*, i64, i16, i16, i32 }*
%42 = getelementptr inbounds { i8*, i64, i16, i16, i32 }, { i8*, i64, i16,
i16, i32 }* %41, i64 0, i32 1
%43 = load i64, i64* %42, align 8
%44 = getelementptr inbounds [4 x {}*], [4 x {}*]* %gcframe31, i64 0, i64 2
store {}* %25, {}** %44, align 16
%45 = call i64 @j_rprContextCreateMesh_300({}* nonnull %12, {}* nonnull %14, i64 signext %37, i64 signext 12, {}* nonnull %16, i64 signext %40, i64 signext 12, {}* nonnull %20, i64 signext %43, i64 signext 8, {}* nonnull %18, i64 signext 4, {}* nonnull %18, i64 signext 4, {}* nonnull %18, i64 signext 4, {}* nonnull %25, i64 signext %24) #4
%ptls_field13 = getelementptr inbounds {}**, {}*** %6, i64 2305843009213693954
%46 = bitcast {}*** %ptls_field13 to i8**
%ptls_load1415 = load i8*, i8** %46, align 8
%47 = call noalias nonnull {}* @jl_gc_pool_alloc(i8* %ptls_load1415, i32 1416, i32 32) #5
%48 = bitcast {}* %47 to i64*
%49 = getelementptr inbounds i64, i64* %48, i64 -1
store atomic i64 229992544, i64* %49 unordered, align 8
%50 = bitcast {}* %47 to {}**
%51 = getelementptr inbounds {}*, {}** %50, i64 1
store {}* null, {}** %51, align 8
store i64 %45, i64* %48, align 8
%52 = bitcast {}* %47 to i8*
%53 = getelementptr inbounds i8, i8* %52, i64 8
%ptls_load111819 = load i8*, i8** %46, align 8
%54 = getelementptr inbounds [4 x {}*], [4 x {}*]* %gcframe31, i64 0, i64 3
store {}* %47, {}** %54, align 8
%55 = call noalias nonnull {}* @jl_gc_pool_alloc(i8* %ptls_load111819, i32
1440, i32 48) #5
%56 = bitcast {}* %55 to i64*
%57 = getelementptr inbounds i64, i64* %56, i64 -1
store atomic i64 1967630592, i64* %57 unordered, align 8
%58 = bitcast {}* %55 to [5 x {}*]*
%.repack = bitcast {}* %55 to {}**
store {}* %14, {}** %.repack, align 8
%.repack20 = getelementptr inbounds [5 x {}*], [5 x {}*]* %58, i64 0, i64 1
store {}* %16, {}** %.repack20, align 8
%.repack22 = getelementptr inbounds [5 x {}*], [5 x {}*]* %58, i64 0, i64 2
store {}* %20, {}** %.repack22, align 8
%.repack24 = getelementptr inbounds [5 x {}*], [5 x {}*]* %58, i64 0, i64 3
store {}* %18, {}** %.repack24, align 8
%.repack26 = getelementptr inbounds [5 x {}*], [5 x {}*]* %58, i64 0, i64 4
store {}* %25, {}** %.repack26, align 8
%59 = bitcast i8* %53 to {}**
store {}* %55, {}** %59, align 8
%60 = load atomic i64, i64* %49 unordered, align 8
%61 = and i64 %60, 3
%62 = icmp eq i64 %61, 3
br i1 %62, label %63, label %64
63: ; preds = %L35
call void @jl_gc_queue_root({}* nonnull %47)
br label %64
64: ; preds = %63, %L35
%65 = bitcast {}* %12 to i8*
%66 = getelementptr inbounds i8, i8* %65, i64 8
%67 = bitcast i8* %66 to {}***
%68 = load atomic {}**, {}*** %67 unordered, align 8
%69 = load atomic {}*, {}** %68 unordered, align 8
store {}* %69, {}** %44, align 16
store {}* %69, {}** %.sub, align 8
%70 = getelementptr inbounds [3 x {}*], [3 x {}*]* %3, i64 0, i64 1
store {}* inttoptr (i64 181338120 to {}*), {}** %70, align 8
%71 = getelementptr inbounds [3 x {}*], [3 x {}*]* %3, i64 0, i64 2
store {}* %47, {}** %71, align 8
%72 = call nonnull {}* @"j1_setindex!_301"({}* inttoptr (i64 345464736 to {}*), {}** nonnull %.sub, i32 3)
%73 = load {}*, {}** %8, align 8
%74 = bitcast {}*** %6 to {}**
store {}* %73, {}** %74, align 8
ret {}* %47
oob: ; preds = %L17
%75 = alloca i64, align 8
store i64 %34, i64* %75, align 8
call void @jl_bounds_error_ints({}* %25, i64* nonnull %75, i64 1)
unreachable
idxend: ; preds = %L17
%76 = add nsw i64 %value_phi3, -1
%77 = load i32*, i32** %33, align 8
%78 = getelementptr inbounds i32, i32* %77, i64 %76
store i32 3, i32* %78, align 4
%.not = icmp eq i64 %value_phi3, %29
%79 = add nuw nsw i64 %value_phi3, 1
br i1 %.not, label %L35, label %L17
}
using RadeonProRender, GeometryBasics
const RPR = RadeonProRender
using InteractiveUtils
using RadeonProRender: Shape, rpr_int
function shape(context::RPR.Context, vraw::Vector{Point3f}, nraw::Vector{Vec3f}, iraw::Vector{RPR.rpr_int},
uvraw::Vector{Vec2f})
nfaces = length(iraw) ÷ 3
facelens = fill(rpr_int(3), nfaces)
rpr_mesh = RPR.RPR.rprContextCreateMesh(context, vraw, length(vraw), sizeof(Point3f), nraw, length(nraw),
sizeof(Vec3f), uvraw, length(uvraw), sizeof(Vec2f), iraw,
sizeof(rpr_int), iraw, sizeof(rpr_int), iraw, sizeof(rpr_int),
facelens, nfaces)
jl_references = (vraw, nraw, uvraw, iraw, facelens)
shape = Shape(rpr_mesh, jl_references)
push!(context.objects, shape)
return shape
end
let
context = RPR.Context(; resource=RPR.RPR_CREATION_FLAGS_ENABLE_CPU)
scene = RPR.Scene(context)
m = uv_normal_mesh(Tesselation(Sphere(Point3f(2, 0, 2), 1.0f0), 100))
v, n, fs, uv = decompose(Point3f, m), normals(m), faces(m), texturecoordinates(m)
uvraw = map(uv -> Vec2f(1 - uv[2], 1 - uv[1]), uv)
f = decompose(TriangleFace{OffsetInteger{-1,rpr_int}}, fs)
iraw = collect(reinterpret(rpr_int, f))
@code_llvm debuginfo = :none shape(context, v, n, iraw, uvraw)
shape(context, v, n, iraw, uvraw)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment