[LLVMdev] RFC: canonical icmp predicates?
Philip Reames
listmail at philipreames.com
Mon Apr 27 16:05:51 PDT 2015
I ran into an issue where we are missing optimization opportunities by
not recognizing that:
$cmp1 = icmp eq i8* %p, null
br i1 %cmp1, label %is_null, label %not_null
Is equivalent to:
$cmp1 = icmp ne i8* %p, null
br i1 %cmp1, label %not_null, label %is_null
We do recognize and exploit this in GVN. However, that leaves us with a
pass ordering problem where other passes are less effective. The biggest
impact in practice appears to be on jump threading (missed
optimizations) and unswitching (wasted compile time unswitching
conditions which are actually known outside the loop).
I can see two ways of approaching this and would value feedback about
which is the right one.
Option 1 - We can teach EarlyCSE, & JumpThreading to specifically
optimize this pattern. This doesn't solve the general pass ordering
problem, but it does give us far more chances to exploit the equivalent
control flow for each run of the optimization pipeline (e.g. each round
of inlining iteration).
Option 2 - We could teach InstCombine to canonicalize one form into the
other. On the surface, this seems like the "right" answer, but it also
seems too easy. I suspect there's a reason this approach hasn't been
done and that I simply don't know what it is. :)
The only thing I could come up with is that inverting the branch
direction might perturb code placement for compilations without
profiling data. Is that the concern?
Philip
More information about the llvm-dev
mailing list