Fedor Indutny via llvm-dev
2018-Feb-24 07:16 UTC
[llvm-dev] CallSiteSplitting and musttail calls
Hello! I've discovered that `CallSiteSplitting` optimization doesn't support musttail calls. The easiest fix as it stands is disabling it for such call sites: https://reviews.llvm.org/D43729 . However, I'm not happy with such contribution. My more sophisticated attempt has failed due to my poor understanding of llvm internals. Here is the attempted patch: https://gist.github.com/indutny/240c33522563ebd633613a903479d5e6 I'd greatly appreciate any help with it. Just in case, there're few questions that I'm trying to find answers for: * Why replacing `removeFromParent()` with `eraseFromParent` breaks the code? * How to properly remove predecessors from the resulting Tail block? * How to remove the Tail block itself when we're done? Thank you, Fedor. -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180224/5dfc1a71/attachment.html>
Fedor Indutny via llvm-dev
2018-Feb-24 20:58 UTC
[llvm-dev] CallSiteSplitting and musttail calls
Update: I was able to make progress on it today ( See https://reviews.llvm.org/D43729 ). Apparently my problems were: * Iterating through the instruction/block list after erasing block/instruction * Trying to split block after removing one predecessor Regarding the latter, it appears that semantics of `DuplicateInstructionsInSplitBetween` change significantly in such case, and it starts to loop indefinitely. The `SplitEdge` function that it calls places all of the instructions into the split block, so that the original block becomes empty. Is it expected behavior, or am I doing something wrong? Thanks, Fedor. On Sat, Feb 24, 2018 at 2:16 AM, Fedor Indutny <fedor at indutny.com> wrote:> Hello! > > I've discovered that `CallSiteSplitting` optimization doesn't support > musttail calls. The easiest fix as it stands is disabling it for such call > sites: https://reviews.llvm.org/D43729 . However, I'm not happy with such > contribution. > > My more sophisticated attempt has failed due to my poor understanding of > llvm internals. Here is the attempted patch: https://gist.github. > com/indutny/240c33522563ebd633613a903479d5e6 > > I'd greatly appreciate any help with it. > > Just in case, there're few questions that I'm trying to find answers for: > > * Why replacing `removeFromParent()` with `eraseFromParent` breaks the > code? > * How to properly remove predecessors from the resulting Tail block? > * How to remove the Tail block itself when we're done? > > Thank you, > Fedor. >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180224/452de0ba/attachment.html>
Daniel Berlin via llvm-dev
2018-Feb-27 16:32 UTC
[llvm-dev] CallSiteSplitting and musttail calls
I think you realized this now, but to be clear: More likely, you've found some bugs. Unfortunately, not all of these utilities have good unit tests (though they should!). This would not be the first set of bugs people have found wrt to very start/end of blocks, or bb == predbb issues. On Sat, Feb 24, 2018 at 12:58 PM, Fedor Indutny via llvm-dev < llvm-dev at lists.llvm.org> wrote:> Update: > > I was able to make progress on it today ( See https://reviews.llvm.org/ > D43729 ). Apparently my problems were: > > * Iterating through the instruction/block list after erasing > block/instruction > * Trying to split block after removing one predecessor > > Regarding the latter, it appears that semantics of ` > DuplicateInstructionsInSplitBetween` change significantly in such case, > and it starts to loop indefinitely. The `SplitEdge` function that it calls > places all of the instructions into the split block, so that the original > block becomes empty. > > Is it expected behavior, or am I doing something wrong? > > Thanks, > Fedor. > > On Sat, Feb 24, 2018 at 2:16 AM, Fedor Indutny <fedor at indutny.com> wrote: > >> Hello! >> >> I've discovered that `CallSiteSplitting` optimization doesn't support >> musttail calls. The easiest fix as it stands is disabling it for such call >> sites: https://reviews.llvm.org/D43729 . However, I'm not happy with >> such contribution. >> >> My more sophisticated attempt has failed due to my poor understanding of >> llvm internals. Here is the attempted patch: https://gist.github.com >> /indutny/240c33522563ebd633613a903479d5e6 >> >> I'd greatly appreciate any help with it. >> >> Just in case, there're few questions that I'm trying to find answers for: >> >> * Why replacing `removeFromParent()` with `eraseFromParent` breaks the >> code? >> * How to properly remove predecessors from the resulting Tail block? >> * How to remove the Tail block itself when we're done? >> >> Thank you, >> Fedor. >> > > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev > >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180227/73ccef1b/attachment-0001.html>