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

AllocOpt: Fix stack lowering where alloca continas boxed and unboxed data #55306

Merged
merged 9 commits into from
Aug 6, 2024

Conversation

wsmoses
Copy link
Contributor

@wsmoses wsmoses commented Jul 29, 2024

…-julia objects

cc @gbaraldi

@wsmoses
Copy link
Contributor Author

wsmoses commented Jul 29, 2024

Fixes #55305

@wsmoses wsmoses added backport 1.6 Change should be backported to release-1.6 backport 1.10 Change should be backported to the 1.10 release backport 1.11 Change should be backported to release-1.11 labels Jul 29, 2024
@gbaraldi gbaraldi added compiler:codegen Generation of LLVM IR and native code compiler:llvm For issues that relate to LLVM and removed compiler:codegen Generation of LLVM IR and native code labels Jul 29, 2024
@wsmoses wsmoses added compiler:codegen Generation of LLVM IR and native code compiler:optimizer Optimization passes (mostly in base/compiler/ssair/) labels Jul 29, 2024
@vchuravy
Copy link
Member

The comments are confusing. The correct terminology is boxed and unboxed not Julia and not-Julia.

Is there an end to end test case?

@vchuravy
Copy link
Member

This also feels like the wrong direction. An Julia object that just contains unboxed fields should be easy to move to the stack. Julia objects that contain pointers on boxed objects need to be carefully handled since we need to potentially root the pointers stored in the fields.

@wsmoses
Copy link
Contributor Author

wsmoses commented Jul 30, 2024

Best end-to-end case we got presently is: EnzymeAD/Enzyme.jl#1652 (comment)

The problem atm is essentially that { i8*, {} addr(10) } cannot be upgraded to a stack alloca. It presently is and causes a segfault, in particular see #55305 for an explanation and demonstration of the segfault caused by the present behavior

@vchuravy
Copy link
Member

But this not an issue in alloc opt. This is an issue with the GC rooting pass? Moving this malloc to an alloca should be legal, but the rooting pass needs to handle it.

@wsmoses
Copy link
Contributor Author

wsmoses commented Jul 30, 2024

Alloca opt doesn't turn a gc alloc of a { i64, {} addr(10)* } to an alloca of { i64, {} addr(10)* }. It turns it into [2 x addr(10)] to be bitcast to { i64, {} addr(10) } . Thus rooting is correct, if the alloca [2 x addr(10)*] can be believed.

@wsmoses
Copy link
Contributor Author

wsmoses commented Aug 1, 2024

@vchuravy @gbaraldi the failures look like an oom on the machine itself and unrelated?

Copy link
Member

@vchuravy vchuravy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please update the comments to refer the correct terminology. There is no such thing as a "non-julia-object" in this context.

I am still unclear if this is just an issue with access to unboxed, boxed fields with unkown indices? Since IIUC the issue is that we make the assumption for use_ref that all fields are references.

if (has_bits && has_ref) { needs a comment explaining this situation in detail.

@wsmoses
Copy link
Contributor Author

wsmoses commented Aug 1, 2024

@vchuravy done

src/llvm-alloc-helpers.h Outdated Show resolved Hide resolved
src/llvm-alloc-helpers.h Outdated Show resolved Hide resolved
@KristofferC KristofferC mentioned this pull request Aug 2, 2024
68 tasks
src/llvm-alloc-opt.cpp Outdated Show resolved Hide resolved
src/llvm-alloc-opt.cpp Outdated Show resolved Hide resolved
Co-authored-by: Valentin Churavy <vchuravy@users.noreply.github.com>
src/llvm-alloc-helpers.cpp Outdated Show resolved Hide resolved
src/llvm-alloc-opt.cpp Outdated Show resolved Hide resolved
@vchuravy vchuravy changed the title AllocOpt: Fix stack lowering where object contains both julia and non… AllocOpt: Fix stack lowering where alloca continas boxed and unboxed data Aug 4, 2024
Co-authored-by: Mosè Giordano <giordano@users.noreply.github.com>
@vchuravy vchuravy removed the backport 1.6 Change should be backported to release-1.6 label Aug 4, 2024
@vchuravy
Copy link
Member

vchuravy commented Aug 4, 2024

Doesn't need backport to 1.6 since #47076 was never backported.

@vchuravy
Copy link
Member

vchuravy commented Aug 4, 2024

    ANALYZE src/clang-tidy-llvm-alloc-opt
Error while processing /cache/build/tester-amdci5-15/julialang/julia-master/src/llvm-alloc-opt.cpp.
/cache/build/tester-amdci5-15/julialang/julia-master/src/llvm-alloc-opt.cpp:255:37: error: no member named 'has_unknown_bits' in 'jl_alloc::AllocUseInfo'; did you mean 'has_unknown_objref'? [clang-diagnostic-error]
  255 |         bool has_unboxed = use_info.has_unknown_bits;
      |                                     ^~~~~~~~~~~~~~~~
      |                                     has_unknown_objref
/cache/build/tester-amdci5-15/julialang/julia-master/src/llvm-alloc-helpers.h:97:14: note: 'has_unknown_objref' declared here
   97 |         bool has_unknown_objref:1;
      |              ^
/cache/build/tester-amdci5-15/julialang/julia-master/src/llvm-alloc-opt.cpp:260:34: error: no member named 'hasbits' in 'jl_alloc::Field' [clang-diagnostic-error]
  260 |             has_unboxed |= field.hasbits;
      |                            ~~~~~ ^
make: *** [Makefile:535: clang-tidy-llvm-alloc-opt] Error 1

@wsmoses
Copy link
Contributor Author

wsmoses commented Aug 5, 2024

@vchuravy this all seems to pass, if it looks good to merge?

@gbaraldi gbaraldi added the merge me PR is reviewed. Merge when all tests are passing label Aug 5, 2024
@vchuravy vchuravy merged commit 1e1e710 into JuliaLang:master Aug 6, 2024
8 checks passed
@wsmoses wsmoses deleted the ao branch August 6, 2024 14:42
wsmoses added a commit to wsmoses/julia that referenced this pull request Aug 6, 2024
…data (JuliaLang#55306)

Co-authored-by: Valentin Churavy <vchuravy@users.noreply.github.com>
Co-authored-by: Mosè Giordano <giordano@users.noreply.github.com>
Co-authored-by: Gabriel Baraldi <baraldigabriel@gmail.com>
wsmoses added a commit to wsmoses/julia that referenced this pull request Aug 6, 2024
…data (JuliaLang#55306)

Co-authored-by: Valentin Churavy <vchuravy@users.noreply.github.com>
Co-authored-by: Mosè Giordano <giordano@users.noreply.github.com>
Co-authored-by: Gabriel Baraldi <baraldigabriel@gmail.com>
wsmoses added a commit to wsmoses/julia that referenced this pull request Aug 6, 2024
…data (JuliaLang#55306)

Co-authored-by: Valentin Churavy <vchuravy@users.noreply.github.com>
Co-authored-by: Mosè Giordano <giordano@users.noreply.github.com>
Co-authored-by: Gabriel Baraldi <baraldigabriel@gmail.com>
@DilumAluthge DilumAluthge removed the merge me PR is reviewed. Merge when all tests are passing label Aug 6, 2024
oscardssmith pushed a commit that referenced this pull request Aug 7, 2024
…data (#55306) (#55397)

…data (#55306)

Co-authored-by: Valentin Churavy <vchuravy@users.noreply.github.com>
Co-authored-by: Mosè Giordano <giordano@users.noreply.github.com>
Co-authored-by: Gabriel Baraldi <baraldigabriel@gmail.com>
KristofferC pushed a commit that referenced this pull request Aug 8, 2024
…data (#55306)

Co-authored-by: Valentin Churavy <vchuravy@users.noreply.github.com>
Co-authored-by: Mosè Giordano <giordano@users.noreply.github.com>
Co-authored-by: Gabriel Baraldi <baraldigabriel@gmail.com>
(cherry picked from commit 1e1e710)
lazarusA pushed a commit to lazarusA/julia that referenced this pull request Aug 17, 2024
…data (JuliaLang#55306)

Co-authored-by: Valentin Churavy <vchuravy@users.noreply.github.com>
Co-authored-by: Mosè Giordano <giordano@users.noreply.github.com>
Co-authored-by: Gabriel Baraldi <baraldigabriel@gmail.com>
KristofferC added a commit that referenced this pull request Aug 26, 2024
Backported PRs:
- [x] #54962 <!-- Add timing to precompile trace compile -->
- [x] #55180 <!-- compress jit debuginfo for easy memory savings -->
- [x] #54919 <!-- Fix annotated join with non-concrete eltype iters -->
- [x] #55013 <!-- [docs] change docstring to match code -->
- [x] #55017 <!-- TOML: Make `Dates` a type parameter -->
- [x] #54033 <!-- Fix a bug in `stack`'s DimensionMismatch error message
-->
- [x] #55242 <!-- fix at-main docstring to not code quote a compat box
-->
- [x] #55261 <!-- Make `jl_*affinity` tests more portable -->
- [x] #54736 <!-- specificity: ensure fast-path in `sub/eq_msp` handle
missing `UnionAll` wrapper correctly. -->
- [x] #55299 <!-- typeintersect: fix bounds merging during inner
`intersect_all`. -->
- [x] #55302 <!-- Add `lbt_forwarded_funcs()` to debug LBT forwarding
issues -->
- [x] #55148 <!-- Random: Mark unexported public symbols as public -->
- [x] #55303 <!-- avoid overflowing show for OffsetArrays around typemax
-->
- [x] #55317 <!-- Restrict argument to `isleapyear(::Integer)` -->
- [x] #55327 <!-- Profile: Fix stdlib paths -->
- [x] #55330 <!-- [libblastrampoline] Bump to v5.11.0 -->
- [x] #55310 <!-- Preserve structure in scaling triangular matrices by
NaN -->
- [x] #55329 <!-- mapreduce: don't inbounds unknown functions -->
- [x] #55356 <!-- Profile: close files when assembling heap snapshot -->
- [x] #55371 <!-- Fix tr for block SymTridiagonal -->
- [x] #55307 <!-- Make REPL.TerminalMenus public -->
- [x] #55362 <!-- inference: fix missing LimitedAccuracy markers -->
- [x] #55306 <!-- AllocOpt: Fix stack lowering where alloca continas
boxed and unboxed data -->
- [x] #55395 <!-- fix #55389: type-unstable `join` -->
- [x] #55226 <!-- re-add `unsafe_convert` for Reinterpret and Reshaped
array -->
- [x] #55405 <!-- handle unbound vars in NTuple fields -->
- [x] #55365 <!-- ml-matches: ensure all methods are included -->
- [x] #55428 <!-- codegen: move undef freeze before promotion point -->
- [x] #55419 <!-- `stale_cachefile`: handle if the expected cache file
is missing -->
- [x] #55470 <!-- Add push! implementation for AbstractArray depending
only on resize! -->
- [x] #55483 <!-- fix hierarchy level of "API reference" in `Dates`
documentation -->
- [x] #55268 <!-- simplify complex atanh and remove singularity
perturbation -->
- [x] #55441 <!-- fix Event to use normal Condition variable -->
- [x] #55413 <!-- subtyping: fast path for lhs union and rhs typevar -->
- [x] #55492 <!-- build: add missing dependencies for expmap -->
- [x] #55507 <!-- Fix fast getptls ccall lowering. -->
- [x] #55424 <!-- add missing clamp function for IOBuffer -->
- [x] #55504 <!-- Update symmetric docstring to reflect the type of uplo
-->
- [x] #55107 <!-- Make the memory GEP an inbounds GEP since the bounds
check has happened somewhere else -->
- [x] #55411 <!-- Vendor the terminfo database for use with
base/terminfo.jl -->
- [x] #55452 <!-- Do not load `ScopedValues` with `using` -->
- [x] #55407 <!-- Remove deprecated non string API for LLVM pass
pipeline and parse all options -->
- [x] #55461 <!-- 🤖 [master] Bump the StyledStrings stdlib from d7496d2
to f6035eb -->
- [x] #55433 <!-- Backport #55407
to 1.11 -->
- [x] #55225 <!-- [1.11 backport] trace-compile: don't generate
`precompile` statements for OpaqueClosure methods (#55072) -->
- [x] #55212 <!-- Make `Base.depwarn()` public -->
- [x] #552
- [x] #55052 <!-- Fix `(l/r)mul!` with `Diagonal`/`Bidiagonal` -->
- [x] #55251 <!-- Restrict binary ops for Diagonal and Symmetric to
Number eltypes -->95 <!-- LAPACK: Aggressive constprop to concretely
infer syev!/syevd! -->
- [x] #55522 <!-- Fix tr for Symmetric/Hermitian block matrices -->

Need manual backport:
- [x] #55342 <!-- Ensure bidiagonal setindex! does not read indices in
error message -->

Contains multiple commits, manual intervention needed:

- [ ] #55336 <!-- codegen: take gc roots (and alloca alignment) more
seriously -->


Non-merged PRs with backport label:
- [ ] #55506 <!-- Fix indexing in _mapreducedim for OffsetArrays -->
- [ ] #55500 <!-- make jl_thread_suspend_and_get_state safe -->
- [ ] #55499 <!-- propagate the terminal's `displaysize` to the
`IOContext` used by the REPL -->
- [ ] #55458 <!-- Allow for generically extracting unannotated string
-->
- [ ] #55457 <!-- Make AnnotateChar equality consider annotations -->
- [ ] #55453 <!-- Privatise the annotations API, for StyledStrings -->
- [ ] #55443 <!-- Add test for upper/lower/titlecase and fix call -->
- [ ] #55355 <!-- relocation: account for trailing path separator in
depot paths -->
- [ ] #55220 <!-- `isfile_casesensitive` fixes on Windows -->
- [ ] #55169 <!-- `propertynames` for SVD respects private argument -->
- [ ] #54457 <!-- Make `String(::Memory)` copy -->
- [ ] #53957 <!-- tweak how filtering is done for what packages should
be precompiled -->
- [ ] #51479 <!-- prevent code loading from lookin in the versioned
environment when building Julia -->
- [ ] #50813 <!-- More doctests for Sockets and capitalization fix -->
- [ ] #50157 <!-- improve docs for `@inbounds` and
`Base.@propagate_inbounds` -->
- [ ] #41244 <!-- Fix shell `cd` error when working dir has been deleted
-->
@KristofferC KristofferC removed the backport 1.11 Change should be backported to release-1.11 label Aug 26, 2024
@KristofferC KristofferC mentioned this pull request Sep 12, 2024
63 tasks
@KristofferC
Copy link
Member

There is some merge conflict in the alloc opt LLVM test here when backporting to 1.10.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backport 1.10 Change should be backported to the 1.10 release compiler:codegen Generation of LLVM IR and native code compiler:llvm For issues that relate to LLVM compiler:optimizer Optimization passes (mostly in base/compiler/ssair/)
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants