Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Buffer types for array backend #48728

Closed
wants to merge 87 commits into from
Closed
Changes from 1 commit
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
3b4bfb8
SimpleBuffer type modeled after SimpleVector
Tokazama Feb 9, 2023
af35dd8
initialize type
Tokazama Feb 9, 2023
c6cd7fd
add tags for buffer type
Tokazama Feb 10, 2023
c50f5b7
Fix codegen
Tokazama Feb 10, 2023
7e8ea0c
add dedicated hash
Tokazama Feb 10, 2023
cf00f92
fix typo
Tokazama Feb 10, 2023
2965d18
apply for sbuf
Tokazama Feb 10, 2023
97167e5
builds but doesn't work
Tokazama Feb 10, 2023
b2093ea
Add Julia side code
Tokazama Feb 10, 2023
2c0e068
enforce 8-bit values for SimpleBuffer
Tokazama Feb 18, 2023
5c7c7cf
internal 8-bit methods
Tokazama Feb 19, 2023
0172e85
Support eltype for SimpleBuffer
Tokazama Feb 20, 2023
7bd19bb
proper size for gc and more constructors
Tokazama Feb 20, 2023
3424c11
Merge branch 'master' into buffers
Tokazama Feb 20, 2023
4604d77
escape analysis on buffers
Tokazama Feb 21, 2023
17b0b11
mutable vs immutable buffers
Tokazama Feb 21, 2023
f702552
julia implimentation of immutable instantiation
Tokazama Feb 21, 2023
7231a62
Merge branch 'master' into buffers
Tokazama Feb 21, 2023
a4d55c5
Merge branch 'master' into buffers
Tokazama Feb 23, 2023
ad66f13
support malloced buffers
Tokazama Feb 24, 2023
0d6f1f4
remove ImmutableBuffer
Tokazama Feb 24, 2023
b6fe4dc
Fix malloc assigned set and ref
Tokazama Feb 25, 2023
6134dfe
Initial GC code for malloced buffers
Tokazama Feb 25, 2023
645670f
Merge branch 'master' into buffers
Tokazama Feb 25, 2023
86a4164
try to make buffer fxns names similar to arrays
Tokazama Feb 25, 2023
83e05c5
fix some typos
Tokazama Feb 25, 2023
494e418
fix bufset
Tokazama Feb 25, 2023
f015c52
fix malloc gc
Tokazama Feb 25, 2023
33acdd4
delete unsafe_freeze!
Tokazama Mar 2, 2023
5f16c17
Merge branch 'master' into buffers
Tokazama Mar 6, 2023
7bf1658
Placeholder code for codegen and cgutils
Tokazama Mar 6, 2023
5cf285a
buflen -> bufferlen and make it Core.Intrinsics.bufferlen
Tokazama Mar 10, 2023
f66a109
Merge branch 'master' into buffers
Tokazama Mar 10, 2023
b397ce3
preliminary work on buffer ptr codegen
Tokazama Mar 12, 2023
ea7fc86
Merge branch 'master' into buffers
Tokazama Mar 12, 2023
13f5954
Fixes for union types
Tokazama Mar 12, 2023
5b041b5
try fixing more codegen
Tokazama Mar 13, 2023
26dd306
Pull out escape analysis for buffer in own file
Tokazama Mar 13, 2023
2e9d985
Don't mess with includes in compiler module
Tokazama Mar 13, 2023
7ef4010
Fix subtyping for Buffer and LLVMPtr
Tokazama Mar 15, 2023
30da4e7
fix alignment issues
Tokazama Mar 15, 2023
29a8316
Cleanup/fix alignment code
Tokazama Mar 15, 2023
27b510b
Fix malloced object size
Tokazama Mar 15, 2023
af7803a
Fix fix isassigned for Buffer and bufset codegen
Tokazama Mar 15, 2023
0b7c6cf
Fix summarysize now that gc should be working
Tokazama Mar 16, 2023
5ee9b9c
jl_buffer_any_type and tests
Tokazama Mar 17, 2023
a04cec5
Merge branch 'master' into buffers
Tokazama Mar 17, 2023
6717a09
Fix copy
Tokazama Mar 17, 2023
5df4eca
fix typos
Tokazama Mar 17, 2023
29bd0b3
move more to buffers.c and fix accidental array methods in buffer met…
Tokazama Mar 18, 2023
39ce1db
grow buffer
Tokazama Mar 18, 2023
206c18b
add basics for buffer resizing methods
Tokazama Mar 19, 2023
35220ba
Merge branch 'master' into buffers
Tokazama Mar 20, 2023
88e3283
Support resizeable buffer
Tokazama Mar 21, 2023
7bf413d
Make sure effect is eventually fixed
Tokazama Mar 22, 2023
5b0ccd8
Fix bufferlen effects and support unsafe_copyto!
Tokazama Mar 23, 2023
0f1b236
add windows malloc
Tokazama Mar 23, 2023
9991d57
mark bits for shared and newly allocated data field
Tokazama Mar 25, 2023
52b8072
Can use limited number of resizing methods for raw buffers
Tokazama Mar 29, 2023
4dd43e1
Merge branch 'master' into buffers
Tokazama Mar 29, 2023
004f3e5
Start moving more functionality to Julia
Tokazama Apr 10, 2023
3dd2b4c
Merge branch 'master' into buffers
Tokazama Apr 10, 2023
dc3ac72
Fix more commit conflicts
Tokazama Apr 10, 2023
ff5e422
Merge branch 'master' into buffers
Tokazama Apr 10, 2023
d68892a
`get_buffer_value` is a pure Julia version of getindex and allocate m…
Tokazama Apr 10, 2023
b1bc8c7
improve temporary assumed effects hack for buffer pointers
Tokazama Apr 11, 2023
c2f7ba5
Merge branch 'master' into buffers
Tokazama Apr 11, 2023
eb550f5
Fix recent changes to codegen.cpp
Tokazama Apr 11, 2023
7ad80dd
Merge branch 'master' into buffers
Tokazama Apr 11, 2023
d8a40bf
Significant performance improvement on Julia implementation of getters
Tokazama Apr 12, 2023
a3bef23
Merge branch 'master' into buffers
Tokazama Apr 12, 2023
18da8a2
Fix buffer size calculation
Tokazama Apr 12, 2023
5904b3f
setting values that contain pointers
Tokazama Apr 15, 2023
0099b36
Restructure layout stuff
Tokazama Apr 16, 2023
5abe6c4
Merge branch 'master' into buffers
Tokazama Apr 16, 2023
5ad2f66
Directly allocate buffers from Julia
Tokazama Apr 17, 2023
89b1bf3
Fix moving pointers when copying
Tokazama Apr 20, 2023
b672ce4
Merge branch 'master' into buffers
Tokazama Apr 20, 2023
a517561
All Julia unsafe_copyto!
Tokazama Apr 20, 2023
e6b3be6
copy for boxed types and begin native resizing
Tokazama Apr 21, 2023
b26baf4
Remove C code that is fully replaced by Julia impl
Tokazama Apr 21, 2023
2668d1a
Retry resizing methods
Tokazama Apr 25, 2023
e2ace7f
Merge branch 'master' into buffers
Tokazama Apr 25, 2023
649e500
Remove `bufref` and `bufset` codegen
Tokazama Apr 26, 2023
cbf5b2c
More tests for resizing
Tokazama Apr 27, 2023
654ac8f
Merge branch 'master' into buffers
Tokazama Apr 27, 2023
0652811
Remove unintended find/replace changes in flisp
Tokazama Apr 27, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Merge branch 'master' into buffers
Tokazama authored Apr 10, 2023
commit 3dd2b4c087142c20be0445cab5eaf6ffd9adc1d5
43 changes: 26 additions & 17 deletions base/compiler/tfuncs.jl
Original file line number Diff line number Diff line change
@@ -2141,7 +2141,7 @@ end
# Additionally check element type compatibility
return arrayset_typecheck(argtypes[2], argtypes[3])
elseif f === arrayref || f === const_arrayref
return array_builtin_common_nothrow(argtypes, 3)
return array_builtin_common_nothrow(argtypes, 3, #=isarrayref=#true)
elseif f === Core.bufset
buffer_builtin_common_nothrow(argtypes, 4) || return false
# Additionally check element type compatibility
@@ -2231,14 +2231,12 @@ end
end

# known to be always effect-free (in particular nothrow)
const _PURE_BUILTINS = Any[tuple, svec, ===, typeof, nfields, applicable]

# known to be effect-free (but not necessarily nothrow)
const _EFFECT_FREE_BUILTINS = [
fieldtype, apply_type, isa, UnionAll,
getfield, arrayref, const_arrayref, Core.bufref, isdefined, Core.sizeof,
Core.ifelse, Core._typevar, (<:),
typeassert, throw, arraysize, Core.bufferlen, getglobal, compilerbarrier
const _PURE_BUILTINS = Any[
tuple,
svec,
===,
typeof,
nfields,
]

const _CONSISTENT_BUILTINS = Any[
@@ -2268,7 +2266,9 @@ const _EFFECT_FREE_BUILTINS = [
getfield,
arrayref,
arraysize,
Core.bufferlen,
const_arrayref,
Core.bufref,
isdefined,
Core.sizeof,
Core.ifelse,
@@ -2284,8 +2284,6 @@ const _INACCESSIBLEMEM_BUILTINS = Any[
(<:),
(===),
apply_type,
arraysize,
Core.bufferlen,
Core.ifelse,
Core.sizeof,
svec,
@@ -2306,6 +2304,8 @@ const _ARGMEM_BUILTINS = Any[
arrayset,
Core.bufref,
Core.bufset,
arraysize,
Core.bufferlen,
modifyfield!,
replacefield!,
setfield!,
@@ -2314,8 +2314,7 @@ const _ARGMEM_BUILTINS = Any[

const _INCONSISTENT_INTRINSICS = Any[
Intrinsics.pointerref, # this one is volatile
Intrinsics.arraylen, # this one is volatile
#Intrinsics.bufferlen, # Buffer is mutable but it's length is fixed, but DynamicBuffer does not have fixed length.
Intrinsics.sqrt_llvm_fast, # this one may differ at runtime (by a few ulps)
Intrinsics.have_fma, # this one depends on the runtime environment
Intrinsics.cglobal, # cglobal lookup answer changes at runtime
# ... and list fastmath intrinsics:
@@ -2460,9 +2459,16 @@ function builtin_effects(𝕃::AbstractLattice, @nospecialize(f::Builtin), argin
effect_free = get_binding_type_effect_free(argtypes[1], argtypes[2]) ? ALWAYS_TRUE : ALWAYS_FALSE
return Effects(EFFECTS_TOTAL; effect_free)
else
consistent = contains_is(_CONSISTENT_BUILTINS, f) ? ALWAYS_TRUE :
(f === Core._typevar) ? CONSISTENT_IF_NOTRETURNED : ALWAYS_FALSE
if f === setfield! || f === arrayset || f === Core.bufset
if contains_is(_CONSISTENT_BUILTINS, f)
consistent = ALWAYS_TRUE
elseif f === arrayref || f === arrayset || f === arraysize || f === Core.bufset
consistent = CONSISTENT_IF_INACCESSIBLEMEMONLY
elseif f === Core._typevar
consistent = CONSISTENT_IF_NOTRETURNED
else
consistent = ALWAYS_FALSE
end
if f === setfield! || f === arrayset
effect_free = EFFECT_FREE_IF_INACCESSIBLEMEMONLY
elseif contains_is(_EFFECT_FREE_BUILTINS, f) || contains_is(_PURE_BUILTINS, f)
effect_free = ALWAYS_TRUE
@@ -2958,7 +2964,10 @@ function new_buffer_nothrow(@specialize(abstract_eval), args::Vector{Any})
return ccall(:jl_array_validate_dims, Cint,
(Ptr{Csize_t}, Ptr{Csize_t}, UInt32, Ptr{Csize_t}, Csize_t),
#=nel=#RefValue{Csize_t}(), #=tot=#RefValue{Csize_t}(), 1, dims, elsz) == 0

if is_array_resize(name)
return array_resize_effects()
end
return EFFECTS_UNKNOWN
end

function is_array_resize(name::Symbol)
42 changes: 21 additions & 21 deletions src/codegen.cpp
Original file line number Diff line number Diff line change
@@ -1269,27 +1269,27 @@ static const auto &builtin_func_map() {
{ jl_f__call_in_world_total_addr, new JuliaFunction<>{XSTR(jl_f__call_in_world_total), get_func_sig, get_func_attrs} },
{ jl_f_throw_addr, new JuliaFunction<>{XSTR(jl_f_throw), get_func_sig, get_func_attrs} },
{ jl_f_tuple_addr, jltuple_func },
{ jl_f_svec_addr, new JuliaFunction{XSTR(jl_f_svec), get_func_sig, get_func_attrs} },
{ jl_f_applicable_addr, new JuliaFunction{XSTR(jl_f_applicable), get_func_sig, get_func_attrs} },
{ jl_f_invoke_addr, new JuliaFunction{XSTR(jl_f_invoke), get_func_sig, get_func_attrs} },
{ jl_f_isdefined_addr, new JuliaFunction{XSTR(jl_f_isdefined), get_func_sig, get_func_attrs} },
{ jl_f_getfield_addr, new JuliaFunction{XSTR(jl_f_getfield), get_func_sig, get_func_attrs} },
{ jl_f_setfield_addr, new JuliaFunction{XSTR(jl_f_setfield), get_func_sig, get_func_attrs} },
{ jl_f_swapfield_addr, new JuliaFunction{XSTR(jl_f_swapfield), get_func_sig, get_func_attrs} },
{ jl_f_modifyfield_addr, new JuliaFunction{XSTR(jl_f_modifyfield), get_func_sig, get_func_attrs} },
{ jl_f_fieldtype_addr, new JuliaFunction{XSTR(jl_f_fieldtype), get_func_sig, get_func_attrs} },
{ jl_f_nfields_addr, new JuliaFunction{XSTR(jl_f_nfields), get_func_sig, get_func_attrs} },
{ jl_f__expr_addr, new JuliaFunction{XSTR(jl_f__expr), get_func_sig, get_func_attrs} },
{ jl_f__typevar_addr, new JuliaFunction{XSTR(jl_f__typevar), get_func_sig, get_func_attrs} },
{ jl_f_arrayref_addr, new JuliaFunction{XSTR(jl_f_arrayref), get_func_sig, get_func_attrs} },
{ jl_f_const_arrayref_addr, new JuliaFunction{XSTR(jl_f_const_arrayref), get_func_sig, get_func_attrs} },
{ jl_f_arrayset_addr, new JuliaFunction{XSTR(jl_f_arrayset), get_func_sig, get_func_attrs} },
{ jl_f_arraysize_addr, new JuliaFunction{XSTR(jl_f_arraysize), get_func_sig, get_func_attrs} },
{ jl_f_apply_type_addr, new JuliaFunction{XSTR(jl_f_apply_type), get_func_sig, get_func_attrs} },
{ jl_f_donotdelete_addr, new JuliaFunction{XSTR(jl_f_donotdelete), get_donotdelete_sig, get_donotdelete_func_attrs} },
{ jl_f_compilerbarrier_addr, new JuliaFunction{XSTR(jl_f_compilerbarrier), get_func_sig, get_func_attrs} },
{ jl_f_finalizer_addr, new JuliaFunction{XSTR(jl_f_finalizer), get_func_sig, get_func_attrs} },
{ jl_f__svec_ref_addr, new JuliaFunction{XSTR(jl_f__svec_ref), get_func_sig, get_func_attrs} },
{ jl_f_svec_addr, new JuliaFunction<>{XSTR(jl_f_svec), get_func_sig, get_func_attrs} },
{ jl_f_applicable_addr, new JuliaFunction<>{XSTR(jl_f_applicable), get_func_sig, get_func_attrs} },
{ jl_f_invoke_addr, new JuliaFunction<>{XSTR(jl_f_invoke), get_func_sig, get_func_attrs} },
{ jl_f_isdefined_addr, new JuliaFunction<>{XSTR(jl_f_isdefined), get_func_sig, get_func_attrs} },
{ jl_f_getfield_addr, new JuliaFunction<>{XSTR(jl_f_getfield), get_func_sig, get_func_attrs} },
{ jl_f_setfield_addr, new JuliaFunction<>{XSTR(jl_f_setfield), get_func_sig, get_func_attrs} },
{ jl_f_swapfield_addr, new JuliaFunction<>{XSTR(jl_f_swapfield), get_func_sig, get_func_attrs} },
{ jl_f_modifyfield_addr, new JuliaFunction<>{XSTR(jl_f_modifyfield), get_func_sig, get_func_attrs} },
{ jl_f_fieldtype_addr, new JuliaFunction<>{XSTR(jl_f_fieldtype), get_func_sig, get_func_attrs} },
{ jl_f_nfields_addr, new JuliaFunction<>{XSTR(jl_f_nfields), get_func_sig, get_func_attrs} },
{ jl_f__expr_addr, new JuliaFunction<>{XSTR(jl_f__expr), get_func_sig, get_func_attrs} },
{ jl_f__typevar_addr, new JuliaFunction<>{XSTR(jl_f__typevar), get_func_sig, get_func_attrs} },
{ jl_f_arrayref_addr, new JuliaFunction<>{XSTR(jl_f_arrayref), get_func_sig, get_func_attrs} },
{ jl_f_const_arrayref_addr, new JuliaFunction<>{XSTR(jl_f_const_arrayref), get_func_sig, get_func_attrs} },
{ jl_f_arrayset_addr, new JuliaFunction<>{XSTR(jl_f_arrayset), get_func_sig, get_func_attrs} },
{ jl_f_arraysize_addr, new JuliaFunction<>{XSTR(jl_f_arraysize), get_func_sig, get_func_attrs} },
{ jl_f_apply_type_addr, new JuliaFunction<>{XSTR(jl_f_apply_type), get_func_sig, get_func_attrs} },
{ jl_f_donotdelete_addr, new JuliaFunction<>{XSTR(jl_f_donotdelete), get_donotdelete_sig, get_donotdelete_func_attrs} },
{ jl_f_compilerbarrier_addr, new JuliaFunction<>{XSTR(jl_f_compilerbarrier), get_func_sig, get_func_attrs} },
{ jl_f_finalizer_addr, new JuliaFunction<>{XSTR(jl_f_finalizer), get_func_sig, get_func_attrs} },
{ jl_f__svec_ref_addr, new JuliaFunction<>{XSTR(jl_f__svec_ref), get_func_sig, get_func_attrs} },
{ jl_f_bufref_addr, new JuliaFunction{XSTR(jl_f_bufref), get_func_sig, get_func_attrs} },
{ jl_f_bufset_addr, new JuliaFunction{XSTR(jl_f_bufset), get_func_sig, get_func_attrs} },
{ jl_f_bufferlen_addr, new JuliaFunction{XSTR(jl_f_bufferlen), get_func_sig, get_func_attrs} },
4 changes: 4 additions & 0 deletions src/jltypes.c
Original file line number Diff line number Diff line change
@@ -3071,6 +3071,10 @@ void jl_init_types(void) JL_GC_DISABLED
((jl_datatype_t*)jl_unwrap_unionall((jl_value_t*)jl_buffer_type))->ismutationfree = 0;
((jl_datatype_t*)jl_buffer_any_type)->ismutationfree = 0;
((jl_datatype_t*)jl_unwrap_unionall((jl_value_t*)jl_dynbuffer_type))->ismutationfree = 0;
((jl_datatype_t*)jl_array_symbol_type)->ismutationfree = 0;
((jl_datatype_t*)jl_array_uint8_type)->ismutationfree = 0;
((jl_datatype_t*)jl_array_int32_type)->ismutationfree = 0;
((jl_datatype_t*)jl_array_uint64_type)->ismutationfree = 0;

// override the preferred layout for a couple types
jl_lineinfonode_type->name->mayinlinealloc = 0; // FIXME: assumed to be a pointer by codegen
You are viewing a condensed version of this merge commit. You can view the full changes here.