[llvm-bugs] [Bug 33336] New: Regression with builtin_expect over multiple predicates

via llvm-bugs llvm-bugs at lists.llvm.org
Tue Jun 6 17:52:07 PDT 2017


            Bug ID: 33336
           Summary: Regression with builtin_expect over multiple
           Product: libraries
           Version: trunk
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: Common Code Generator Code
          Assignee: unassignedbugs at nondot.org
          Reporter: zamsden at cloudera.com
                CC: llvm-bugs at lists.llvm.org

Created attachment 18584
  --> https://bugs.llvm.org/attachment.cgi?id=18584&action=edit
Reproducing case

Testing using an UNLIKELY macro built around builtin_expect found a regression
from 3.7 -> 3.8 that is still present in the 4.0 and likely trunk (untested)
branches of llvm.  The unlikely condition is not propagated to both
sub-expressions when combined with an OR clause.  Using multiple invocations of
such a macro gives the expected result.

Apparently the branch probabilities are no longer being propagated correctly to
child expressions.

I bisected llvm and clang in parallel on release_37 and release_38 branches to
find the responsible change and found this change to be responsible.  Seems
entirely plausible as it introduces a new branch:

    [JumpThreading] Split select that has constant conditions coming from the
PHI node

    Look for PHI/Select in the same BB of the form

      %p = phi [false, %bb1], [true, %bb2], [false, %bb3], [true, %bb4], ...
      %s = select p, trueval, falseval

    And expand the select into a branch structure. This later enables
    jump-threading over bb in this pass.

    Using the similar approach of SimplifyCFG::FoldCondBranchOnPHI(), unfold
    select if the associated PHI has at least one constant.  If the unfolded
    select is not jump-threaded, it will be folded again in the later

    git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@257198

Attached code which generates a reproduction - you can see the sub-optimal
branch generated in the asm output.  Let me know if you want IR output as well,
but this reproduces quite easily.  I copied my reproducing case verbatim, there
is almost certainly a more minimal case that doesn't involve floating point,
but this works reliably - Godbolt link: https://godbolt.org/g/vBwwQU

You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20170607/254533e2/attachment.html>

More information about the llvm-bugs mailing list