[llvm-bugs] [Bug 33336] New: Regression with builtin_expect over multiple predicates
llvm-bugs at lists.llvm.org
Tue Jun 6 17:52:07 PDT 2017
Bug ID: 33336
Summary: Regression with builtin_expect over multiple
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
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
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
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
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...
More information about the llvm-bugs