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

ssr: register merging not working when value used outside of the basic block #2

Open
huettern opened this issue Jun 14, 2021 · 0 comments
Labels
bug Something isn't working

Comments

@huettern
Copy link

in case the use of an ssr_pop(0) is in a different BB, the register merging just eliminates the pop but doesn't replace the actual use of e.g. ft0.

bb.0:
  %0:fpr = PeudoPop
bb.1:
  # some use of %0

this then leads to a crash of the compiler.

It can be mitigated with -mllvm -ssr-noregmerge but that is not the idea of SSRs

@huettern huettern added the bug Something isn't working label Jun 14, 2021
huettern added a commit that referenced this issue Aug 11, 2021
ssr setup pseudo instruction framework

move ssr pseudo code to RISCVExpandPseudoInsts

revert changes to isellowering

wip: implemented ssr pop

move SSR expansion to a seperate pass

ssr pseudo expansion working

ssr pseudo: cleanup debug

ssr: add bound/stride setup instructions for 1,2,3,4D

builtins and IR intrinsic for ssr setup

WIP ssr: new setup order, add push

ssr: intrinsic working, reverted order of setup

cleanup comment

ssr: pseudo push may load and store

ssr: add pop intrinsic

ssr: add enable/disable pseudo

ssr: add enable/disable intrinsic

ssr: move float reg selection to static function

ssr: move expand pass to preEmit phase and replace push pop with target specific move

ssr: back to pre reg alloc and fmv, add experimental register clobbering

ssr: registers need defining or else, optimization fails to complete

ssr: registers reserved in functions that use SSR

ssr: cleanup

change ssr register offset to word, not byte

builtind pointer type to void

clobber 3 ssr registers

ssr: fix wrong register unpacking

ssr: add test for register reserving

ssr: switch encoding to original

clang: intrinsics for bound stride setup

ssr: first take on register merging

test: fix encoding

ssr: test for register merge

ssr: optional register merging through command line argument

ssr: mark region during register merge path by parsing CSR access

ssr: add intrinsics for read/write/repetition setup

ssr: move debug statement into macro

ssr: remove debug

ssr: mark ssr regs live in in all MBB between en/dis for usage in loops

ssr: mark ssr regs live during merging in all blocks

ssr: make live ins unique before exiting

ssr: reduce liveins to only blocks containing push/pop

ssr: fixing a duplicated entry for repetition pseudo #2
pulp-bot pushed a commit that referenced this issue Sep 4, 2021
ssr setup pseudo instruction framework

move ssr pseudo code to RISCVExpandPseudoInsts

revert changes to isellowering

wip: implemented ssr pop

move SSR expansion to a seperate pass

ssr pseudo expansion working

ssr pseudo: cleanup debug

ssr: add bound/stride setup instructions for 1,2,3,4D

builtins and IR intrinsic for ssr setup

WIP ssr: new setup order, add push

ssr: intrinsic working, reverted order of setup

cleanup comment

ssr: pseudo push may load and store

ssr: add pop intrinsic

ssr: add enable/disable pseudo

ssr: add enable/disable intrinsic

ssr: move float reg selection to static function

ssr: move expand pass to preEmit phase and replace push pop with target specific move

ssr: back to pre reg alloc and fmv, add experimental register clobbering

ssr: registers need defining or else, optimization fails to complete

ssr: registers reserved in functions that use SSR

ssr: cleanup

change ssr register offset to word, not byte

builtind pointer type to void

clobber 3 ssr registers

ssr: fix wrong register unpacking

ssr: add test for register reserving

ssr: switch encoding to original

clang: intrinsics for bound stride setup

ssr: first take on register merging

test: fix encoding

ssr: test for register merge

ssr: optional register merging through command line argument

ssr: mark region during register merge path by parsing CSR access

ssr: add intrinsics for read/write/repetition setup

ssr: move debug statement into macro

ssr: remove debug

ssr: mark ssr regs live in in all MBB between en/dis for usage in loops

ssr: mark ssr regs live during merging in all blocks

ssr: make live ins unique before exiting

ssr: reduce liveins to only blocks containing push/pop

ssr: fixing a duplicated entry for repetition pseudo #2
SamuelRiedel pushed a commit that referenced this issue Nov 1, 2022
We experienced some deadlocks when we used multiple threads for logging
using `scan-builds` intercept-build tool when we used multiple threads by
e.g. logging `make -j16`

```
(gdb) bt
#0  0x00007f2bb3aff110 in __lll_lock_wait () from /lib/x86_64-linux-gnu/libpthread.so.0
#1  0x00007f2bb3af70a3 in pthread_mutex_lock () from /lib/x86_64-linux-gnu/libpthread.so.0
#2  0x00007f2bb3d152e4 in ?? ()
#3  0x00007ffcc5f0cc80 in ?? ()
#4  0x00007f2bb3d2bf5b in ?? () from /lib64/ld-linux-x86-64.so.2
#5  0x00007f2bb3b5da27 in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#6  0x00007f2bb3b5dbe0 in exit () from /lib/x86_64-linux-gnu/libc.so.6
#7  0x00007f2bb3d144ee in ?? ()
#8  0x746e692f706d742f in ?? ()
#9  0x692d747065637265 in ?? ()
#10 0x2f653631326b3034 in ?? ()
#11 0x646d632e35353532 in ?? ()
#12 0x0000000000000000 in ?? ()
```

I think the gcc's exit call caused the injected `libear.so` to be unloaded
by the `ld`, which in turn called the `void on_unload() __attribute__((destructor))`.
That tried to acquire an already locked mutex which was left locked in the
`bear_report_call()` call, that probably encountered some error and
returned early when it forgot to unlock the mutex.

All of these are speculation since from the backtrace I could not verify
if frames 2 and 3 are in fact corresponding to the `libear.so` module.
But I think it's a fairly safe bet.

So, hereby I'm releasing the held mutex on *all paths*, even if some failure
happens.

PS: I would use lock_guards, but it's C.

Reviewed-by: NoQ

Differential Revision: https://reviews.llvm.org/D118439

(cherry picked from commit d919d02)
SamuelRiedel pushed a commit that referenced this issue Nov 1, 2022
ssr setup pseudo instruction framework

move ssr pseudo code to RISCVExpandPseudoInsts

revert changes to isellowering

wip: implemented ssr pop

move SSR expansion to a seperate pass

ssr pseudo expansion working

ssr pseudo: cleanup debug

ssr: add bound/stride setup instructions for 1,2,3,4D

builtins and IR intrinsic for ssr setup

WIP ssr: new setup order, add push

ssr: intrinsic working, reverted order of setup

cleanup comment

ssr: pseudo push may load and store

ssr: add pop intrinsic

ssr: add enable/disable pseudo

ssr: add enable/disable intrinsic

ssr: move float reg selection to static function

ssr: move expand pass to preEmit phase and replace push pop with target specific move

ssr: back to pre reg alloc and fmv, add experimental register clobbering

ssr: registers need defining or else, optimization fails to complete

ssr: registers reserved in functions that use SSR

ssr: cleanup

change ssr register offset to word, not byte

builtind pointer type to void

clobber 3 ssr registers

ssr: fix wrong register unpacking

ssr: add test for register reserving

ssr: switch encoding to original

clang: intrinsics for bound stride setup

ssr: first take on register merging

test: fix encoding

ssr: test for register merge

ssr: optional register merging through command line argument

ssr: mark region during register merge path by parsing CSR access

ssr: add intrinsics for read/write/repetition setup

ssr: move debug statement into macro

ssr: remove debug

ssr: mark ssr regs live in in all MBB between en/dis for usage in loops

ssr: mark ssr regs live during merging in all blocks

ssr: make live ins unique before exiting

ssr: reduce liveins to only blocks containing push/pop

ssr: fixing a duplicated entry for repetition pseudo #2

(cherry picked from commit 925e044)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

1 participant