[PATCH] D42260: [JumpThreading] Don't select an edge that we know we can't thread

Keno Fischer via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 18 12:38:59 PST 2018


loladiro created this revision.
loladiro added reviewers: hfinkel, kparzysz.

In r312664 (https://reviews.llvm.org/D36404), JumpThreading stopped threading edges into
loop headers. Unfortunately, I observed a significant performance
regression as a result of this change. Upon further investigation,
the problematic pattern looked something like this (after
many high level optimizations):

  while (true) {
      bool cond = ...;
      if (!cond) {
          <body>
      }
      if (cond)
          break;
  }

Now, naturally we want jump threading to essentially eliminate the
second if check and hook up the edges appropriately. However, the
above mentioned change, prevented it from doing this because it would
have to thread an edge into the loop header.

Upon further investigation, what is happening is that since both branches
are threadable, JumpThreading picks one of them at arbitrarily. In my
case, because of the way that the IR ended up, it tended to pick
the one to the loop header, bailing out immediately after. However,
if it had picked the one to the exit block, everything would have
worked out fine (because the only remaining branch would then be folded,
not thraded which is acceptable).

Thus, to fix this problem, we can simply eliminate loop headers from
consideration as possible threading targets earlier, to make sure that
if there are multiple eligible branches, we can still thread one of
the ones that don't target a loop header.


Repository:
  rL LLVM

https://reviews.llvm.org/D42260

Files:
  lib/Transforms/Scalar/JumpThreading.cpp
  test/Transforms/JumpThreading/header-succ.ll

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D42260.130477.patch
Type: text/x-patch
Size: 2997 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180118/3e063c50/attachment.bin>


More information about the llvm-commits mailing list