[PATCH] D89952: [SelectionDAG] Fine tune CTPOP optimizations
Sanjay Patel via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 22 09:40:53 PDT 2020
spatel added a comment.
This is a bit general/off-topic for the patch review.
> Also, I'm not an expert at LLVM, but it seems like InstCombine is missing boundary optimizations that should have been caught before SelectionDAG. In particular:
>
> ctpop(x) > 0 --> x != 0
I'm not finding an example where this escapes from InstCombine - please file a bug report if you have one. There's no explicit transform for this, but it happens via 2 other transforms: InstCombinerImpl::foldICmpUsingKnownBits() converts the predicate to NE, and we have a fold for ctpop in InstCombinerImpl::foldICmpEqIntrinsicWithConstant(). You can see the sequence of transforms with "opt -instcombine -debug"
> ctpop(x) > (any size >= element size) --> always false
> ctpop(x) < (any size >= element size + 1) --> always true
AFAICT, this always works for scalars, but not vectors. There's a chain reaction of transforms, but that is not triggered for vectors because range metadata doesn't support vectors:
http://llvm.org/docs/LangRef.html#range-metadata
We can add an explicit fold to instsimplify to make this direct/consistent.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D89952/new/
https://reviews.llvm.org/D89952
More information about the llvm-commits
mailing list