Michael Kruse via llvm-dev
2020-Feb-03 17:28 UTC
[llvm-dev] Questions about jump threading optimization and what we can do
How does the code you would like to have look like? I don't see a relevant difference compared to gcc: https://godbolt.org/z/F-oah4 (clang unnecessarily introduces another temporary register, but that seems unrelated) Michael Am So., 2. Feb. 2020 um 18:24 Uhr schrieb Karl Rehm via llvm-dev <llvm-dev at lists.llvm.org>:> > Here's a better example. https://godbolt.org/z/fpTyFS > I don't know what exactly you would need to change in JumpThreading to improve this, but I'm open to ideas. > > On Sun, Feb 2, 2020 at 12:45 PM Karl Rehm <klrehm123 at gmail.com> wrote: >> >> Holy crap, I completely missed that. I'm sorry! That's my fault. >> >> On Sun, Feb 2, 2020 at 12:15 PM Johannes Doerfert <jdoerfert at anl.gov> wrote: >>> >>> On 01/30, Karl Rehm via llvm-dev wrote: >>> > Since the bug report here: https://bugs.llvm.org/show_bug.cgi?id=44679 I've >>> > been thinking about cases like it, such as: https://godbolt.org/z/Fwq8mn >>> > >>> > I wonder what we can do about this in a general sense. As far as I can >>> > tell, the jump threading algorithm is *really* conservative, which is one >>> > reason this isn't working as well as I'd hope; however, we don't want to >>> > produce irreducible control flow that the other passes would work less >>> > effectively on. Thoughts? >>> >>> I'm confused. In your godbold link you run it with O0 which disables >>> almost all transformations. If we take the IR, remove the optnone >>> attribute, run mem2reg and jump-threading we get what I think is >>> reasonable: >>> https://godbolt.org/z/u3fcTZ >>> >>> Please correct me if I misunderstand anything here. >>> >>> Cheers, >>> Johannes > > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
Karl Rehm via llvm-dev
2020-Feb-03 17:55 UTC
[llvm-dev] Questions about jump threading optimization and what we can do
Well ideally it'd do the same thing as before (with two if statements). Something like: ret i64 4 It's not really about needing to be as good as gcc, it's more that I wonder why the same concept with just two if-else blocks gets optimized yet more doesn't. An interesting point to make is that I don't think it's jump threading optimizing the original example fully: https://godbolt.org/z/rGvHJk -Karl On Mon, Feb 3, 2020 at 12:29 PM Michael Kruse <llvmdev at meinersbur.de> wrote:> How does the code you would like to have look like? I don't see a > relevant difference compared to gcc: > https://godbolt.org/z/F-oah4 > (clang unnecessarily introduces another temporary register, but that > seems unrelated) > > Michael > > Am So., 2. Feb. 2020 um 18:24 Uhr schrieb Karl Rehm via llvm-dev > <llvm-dev at lists.llvm.org>: > > > > Here's a better example. https://godbolt.org/z/fpTyFS > > I don't know what exactly you would need to change in JumpThreading to > improve this, but I'm open to ideas. > > > > On Sun, Feb 2, 2020 at 12:45 PM Karl Rehm <klrehm123 at gmail.com> wrote: > >> > >> Holy crap, I completely missed that. I'm sorry! That's my fault. > >> > >> On Sun, Feb 2, 2020 at 12:15 PM Johannes Doerfert <jdoerfert at anl.gov> > wrote: > >>> > >>> On 01/30, Karl Rehm via llvm-dev wrote: > >>> > Since the bug report here: > https://bugs.llvm.org/show_bug.cgi?id=44679 I've > >>> > been thinking about cases like it, such as: > https://godbolt.org/z/Fwq8mn > >>> > > >>> > I wonder what we can do about this in a general sense. As far as I > can > >>> > tell, the jump threading algorithm is *really* conservative, which > is one > >>> > reason this isn't working as well as I'd hope; however, we don't > want to > >>> > produce irreducible control flow that the other passes would work > less > >>> > effectively on. Thoughts? > >>> > >>> I'm confused. In your godbold link you run it with O0 which disables > >>> almost all transformations. If we take the IR, remove the optnone > >>> attribute, run mem2reg and jump-threading we get what I think is > >>> reasonable: > >>> https://godbolt.org/z/u3fcTZ > >>> > >>> Please correct me if I misunderstand anything here. > >>> > >>> Cheers, > >>> Johannes > > > > _______________________________________________ > > LLVM Developers mailing list > > llvm-dev at lists.llvm.org > > https://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/20200203/a7a72572/attachment.html>
Michael Kruse via llvm-dev
2020-Feb-03 18:35 UTC
[llvm-dev] Questions about jump threading optimization and what we can do
I am not convinced this is a jump-threading issue, but in the domain of ScalarEvolution. ScEv would need to find out which of the exits are taken or whether it loops infinitely. One can see that it exits after 10000 iterations, but ScalarEvolution cannot tell: https://godbolt.org/z/dCqdvv Michael Am Mo., 3. Feb. 2020 um 11:56 Uhr schrieb Karl Rehm <klrehm123 at gmail.com>:> > Well ideally it'd do the same thing as before (with two if statements). Something like: > ret i64 4 > > It's not really about needing to be as good as gcc, it's more that I wonder why the same concept with just two if-else blocks gets optimized yet more doesn't. > An interesting point to make is that I don't think it's jump threading optimizing the original example fully: https://godbolt.org/z/rGvHJk > > -Karl > > On Mon, Feb 3, 2020 at 12:29 PM Michael Kruse <llvmdev at meinersbur.de> wrote: >> >> How does the code you would like to have look like? I don't see a >> relevant difference compared to gcc: >> https://godbolt.org/z/F-oah4 >> (clang unnecessarily introduces another temporary register, but that >> seems unrelated) >> >> Michael >> >> Am So., 2. Feb. 2020 um 18:24 Uhr schrieb Karl Rehm via llvm-dev >> <llvm-dev at lists.llvm.org>: >> > >> > Here's a better example. https://godbolt.org/z/fpTyFS >> > I don't know what exactly you would need to change in JumpThreading to improve this, but I'm open to ideas. >> > >> > On Sun, Feb 2, 2020 at 12:45 PM Karl Rehm <klrehm123 at gmail.com> wrote: >> >> >> >> Holy crap, I completely missed that. I'm sorry! That's my fault. >> >> >> >> On Sun, Feb 2, 2020 at 12:15 PM Johannes Doerfert <jdoerfert at anl.gov> wrote: >> >>> >> >>> On 01/30, Karl Rehm via llvm-dev wrote: >> >>> > Since the bug report here: https://bugs.llvm.org/show_bug.cgi?id=44679 I've >> >>> > been thinking about cases like it, such as: https://godbolt.org/z/Fwq8mn >> >>> > >> >>> > I wonder what we can do about this in a general sense. As far as I can >> >>> > tell, the jump threading algorithm is *really* conservative, which is one >> >>> > reason this isn't working as well as I'd hope; however, we don't want to >> >>> > produce irreducible control flow that the other passes would work less >> >>> > effectively on. Thoughts? >> >>> >> >>> I'm confused. In your godbold link you run it with O0 which disables >> >>> almost all transformations. If we take the IR, remove the optnone >> >>> attribute, run mem2reg and jump-threading we get what I think is >> >>> reasonable: >> >>> https://godbolt.org/z/u3fcTZ >> >>> >> >>> Please correct me if I misunderstand anything here. >> >>> >> >>> Cheers, >> >>> Johannes >> > >> > _______________________________________________ >> > LLVM Developers mailing list >> > llvm-dev at lists.llvm.org >> > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev