DescriptionSubzero: Strength-reduce mul by certain constants.
These all appear to some degree in spec2k.
This is implemented for i8/i16/i32 types. It is done as part of core lowering, so in theory all optimization levels could benefit, but it is explicitly disabled for Om1/O0 to keep things simple there.
While clang appears to strength-reduce udiv/urem by a constant power of 2, for some reason it does not always strength-reduce multiplies (given that they appear in the spec2k bitcode).
For multiplies by 3, 5, or 9, we can make use of the lea instruction. We can do combinations of shift and lea to multiply by other constants, e.g. 100=5*5*4. If too many operations would be required, just give up and use the mul instruction.
BUG= https://code.google.com/p/nativeclient/issues/detail?id=4095
R=jpp@chromium.org, jvoung@chromium.org
Committed: https://gerrit.chromium.org/gerrit/gitweb?p=native_client/pnacl-subzero.git;a=commit;h=0933c0cfb8183a662e44a61d8671b20987d12c78
Patch Set 1 #Patch Set 2 : Fix existing lit tests #Patch Set 3 : Also optimize for multiplies by 3/5/9 by using lea #Patch Set 4 : Disable for Om1 and O0 #Patch Set 5 : Initial skeleton of a cross test #Patch Set 6 : Fill out the cross test. Cleanup. #
Total comments: 5
Patch Set 7 : Add lit tests. Suppress lea optimization for i8 multiply. #Patch Set 8 : Remove a TODO #
Messages
Total messages: 7 (1 generated)
|