<div dir="ltr">I think you realized this now, but to be clear:<div>More likely, you've found some bugs.<div>Unfortunately, not all of these utilities have good unit tests (though they should!).</div><div><br></div><div>This would not be the first set of bugs people have found wrt to very start/end of blocks, or bb == predbb issues.</div><div><br></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Feb 24, 2018 at 12:58 PM, Fedor Indutny via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Update:<br><br>I was able to make progress on it today ( See <a href="https://reviews.llvm.org/D43729" target="_blank">https://reviews.llvm.org/<wbr>D43729</a> ). Apparently my problems were:<div><br></div><div>* Iterating through the instruction/block list after erasing block/instruction</div><div>* Trying to split block after removing one predecessor</div><div><br>Regarding the latter, it appears that semantics of `<wbr>DuplicateInstructionsInSplitBe<wbr>tween` 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.</div><div><br>Is it expected behavior, or am I doing something wrong?<br><br>Thanks,</div><div>Fedor.</div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Feb 24, 2018 at 2:16 AM, Fedor Indutny <span dir="ltr"><<a href="mailto:fedor@indutny.com" target="_blank">fedor@indutny.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hello!<div><br></div><div>I've discovered that `CallSiteSplitting` optimization doesn't support musttail calls. The easiest fix as it stands is disabling it for such call sites: <a href="https://reviews.llvm.org/D43729" target="_blank">https://reviews.llvm.or<wbr>g/D43729</a> . However, I'm not happy with such contribution.</div><div><br></div><div>My more sophisticated attempt has failed due to my poor understanding of llvm internals. Here is the attempted patch: <a href="https://gist.github.com/indutny/240c33522563ebd633613a903479d5e6" target="_blank">https://gist.github.com<wbr>/indutny/240c33522563ebd633613<wbr>a903479d5e6</a></div><div><br></div><div>I'd greatly appreciate any help with it.</div><div><br></div><div>Just in case, there're few questions that I'm trying to find answers for:</div><div><br></div><div>* Why replacing `removeFromParent()` with `eraseFromParent` breaks the code?</div><div>* How to properly remove predecessors from the resulting Tail block?</div><div>* How to remove the Tail block itself when we're done?</div><div><br></div><div>Thank you,</div><div>Fedor.</div></div>
</blockquote></div><br></div>
</div></div><br>______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><br>
<br></blockquote></div><br></div>