Merge arithmetic with non-trivial constant operands
authorAlan Baker <alanbaker@google.com>
Fri, 16 Feb 2018 21:07:33 +0000 (16:07 -0500)
committerDavid Neto <dneto@google.com>
Tue, 27 Feb 2018 18:02:13 +0000 (13:02 -0500)
commit802cf053c797741008cc35bc3b2a2a926edd463d
tree3edfcfa5ceaa21a97f94583178f70eb75847d530
parent20b8cdb7c6e24e66650e204d28423e11fb0f2de5
Merge arithmetic with non-trivial constant operands

Adding basis of arithmetic merging

* Refactored constant collection in ConstantManager
* New rules:
 * consecutive negates
 * negate of arithmetic op with a constant
 * consecutive muls
 * reciprocal of div

* Removed IRContext::CanFoldFloatingPoint
 * replaced by Instruction::IsFloatingPointFoldingAllowed
* Fixed some bad tests
* added some header comments

Added PerformIntegerOperation

* minor fixes to constants and tests
* fixed IntMultiplyBy1 to work with 64 bit ints
* added tests for integer mul merging

Adding test for vector integer multiply merging

Adding support for merging integer add and sub through negate

* Added tests

Adding rules to merge mult with preceding divide

* Has a couple tests, but needs more
* Added more comments

Fixed bug in integer division folding

* Will no longer merge through integer division if there would be a
remainder in the division
* Added a bunch more tests

Adding rules to merge divide and multiply through divide

* Improved comments
* Added tests

Adding rules to handle mul or div of a negation

* Added tests

Changes for review

* Early exit if no constants are involved in more functions
* fixed some comments
* removed unused declaration
* clarified some logic

Adding new rules for add and subtract

* Fold adds of adds, subtracts or negates
* Fold subtracts of adds, subtracts or negates
* Added tests
source/opt/const_folding_rules.cpp
source/opt/constants.cpp
source/opt/constants.h
source/opt/fold.cpp
source/opt/folding_rules.cpp
source/util/hex_float.h
test/opt/fold_test.cpp