1. [InstCombine] canonicalize shift+logic+shift to reduce dependency chain (details)
Commit d9ccb6367a1089fd61bd85be6b0fbb0d6a590e05 by spatel
[InstCombine] canonicalize shift+logic+shift to reduce dependency chain
shift (logic (shift X, C0), Y), C1 --> logic (shift X, C0+C1), (shift Y,
This is an IR translation of an existing SDAG transform added here:
So we again have 9 possible patterns with a commuted IR variant of each
Part of the motivation is to allow easier recognition and subsequent
canonicalization of bswap patterns as discussed in PR43146:
We had to delay this transform because it used to allow the SLP
vectorizer to create awful reductions out of simple load-combines. That
problem was fixed with: rL375025
(we'll bring back load combining in IR someday...)
The backend is also better equipped to deal with these patterns now
using hooks like TLI.getShiftAmountThreshold().
The only remaining potential controversy is that the -reassociate pass
tends to reverse this kind of pattern (to help GVN?). But since
-reassociate doesn't do anything with these specific patterns, there is
no conflict currently.
Finally, there's a new pass proposal at D67383 for general
tree-height-reduction reassociation, and it could use a cost model to
decide how to optimally rearrange these kinds of ops for a target. That
patch appears to be stalled.
Differential Revision:
The file was modifiedllvm/test/Transforms/InstCombine/bswap.ll
The file was modifiedllvm/lib/Transforms/InstCombine/InstCombineShifts.cpp
The file was modifiedllvm/test/Transforms/InstCombine/shift-logic.ll