B3ReduceStrength should know that Mul distributes over Add and Sub
authorrmorisset@apple.com <rmorisset@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 30 Mar 2019 00:21:38 +0000 (00:21 +0000)
committerrmorisset@apple.com <rmorisset@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 30 Mar 2019 00:21:38 +0000 (00:21 +0000)
commitf637615750950ff26937391c27e0df613136e0f3
treea682e04e645e4b3a5872b40c29d79b9a6cb2a3d1
parent0c1cef4915383f66d1dc30f4f92ccd45083bb777
B3ReduceStrength should know that Mul distributes over Add and Sub
https://bugs.webkit.org/show_bug.cgi?id=196325

Reviewed by Michael Saboff.

In this patch I add the following patterns to B3ReduceStrength:
- Turn this: Integer Neg(Mul(value, c))
  Into this: Mul(value, -c), as long as -c does not overflow
- Turn these: Integer Mul(value, Neg(otherValue)) and Integer Mul(Neg(value), otherValue)
  Into this: Neg(Mul(value, otherValue))
- For Op==Add or Sub, turn any of these:
     Op(Mul(x1, x2), Mul(x1, x3))
     Op(Mul(x2, x1), Mul(x1, x3))
     Op(Mul(x1, x2), Mul(x3, x1))
     Op(Mul(x2, x1), Mul(x3, x1))
  Into this: Mul(x1, Op(x2, x3))

Also includes a trivial change: a similar reduction for the distributivity of BitAnd over BitOr/BitXor now
emits the arguments to BitAnd in the other order, to minimize the probability that we'll spend a full fixpoint step just to flip them.

* b3/B3ReduceStrength.cpp:
* b3/testb3.cpp:
(JSC::B3::testAddMulMulArgs):
(JSC::B3::testMulArgNegArg):
(JSC::B3::testMulNegArgArg):
(JSC::B3::testNegMulArgImm):
(JSC::B3::testSubMulMulArgs):
(JSC::B3::run):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@243670 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/b3/B3ReduceStrength.cpp
Source/JavaScriptCore/b3/testb3.cpp