[turbofan] add some simplifications in the machine operator reducer

Simplify the '+', '-' and '%' operators with some basic constants (0, 1 or NaN).

R=titzer@chromium.org, bmeurer@chromium.org, titzer@google.com

BUG=

Review URL: https://codereview.chromium.org/599383002

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24270 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
Jacob.Bramley@arm.com 2014-09-29 08:30:17 +00:00
parent 40a9b4363e
commit 89ee8ec1b1
2 changed files with 39 additions and 6 deletions

View File

@ -352,6 +352,9 @@ Reduction MachineOperatorReducer::Reduce(Node* node) {
}
case IrOpcode::kFloat64Add: {
Float64BinopMatcher m(node);
if (m.right().IsNaN()) { // x + NaN => NaN
return Replace(m.right().node());
}
if (m.IsFoldable()) { // K + K => K
return ReplaceFloat64(m.left().Value() + m.right().Value());
}
@ -359,6 +362,15 @@ Reduction MachineOperatorReducer::Reduce(Node* node) {
}
case IrOpcode::kFloat64Sub: {
Float64BinopMatcher m(node);
if (m.right().Is(0) && (Double(m.right().Value()).Sign() > 0)) {
return Replace(m.left().node()); // x - 0 => x
}
if (m.right().IsNaN()) { // x - NaN => NaN
return Replace(m.right().node());
}
if (m.left().IsNaN()) { // NaN - x => NaN
return Replace(m.left().node());
}
if (m.IsFoldable()) { // K - K => K
return ReplaceFloat64(m.left().Value() - m.right().Value());
}
@ -391,6 +403,9 @@ Reduction MachineOperatorReducer::Reduce(Node* node) {
}
case IrOpcode::kFloat64Mod: {
Float64BinopMatcher m(node);
if (m.right().Is(0)) { // x % 0 => NaN
return ReplaceFloat64(base::OS::nan_value());
}
if (m.right().IsNaN()) { // x % NaN => NaN
return Replace(m.right().node());
}

View File

@ -687,9 +687,9 @@ static void CheckNans(ReducerTester* R) {
pr != nans.end(); ++pr) {
Node* nan1 = R->Constant<double>(*pl);
Node* nan2 = R->Constant<double>(*pr);
R->CheckBinop(nan1, x, nan1); // x % NaN => NaN
R->CheckBinop(nan1, nan1, x); // NaN % x => NaN
R->CheckBinop(nan1, nan2, nan1); // NaN % NaN => NaN
R->CheckBinop(nan1, x, nan1); // x op NaN => NaN
R->CheckBinop(nan1, nan1, x); // NaN op x => NaN
R->CheckBinop(nan1, nan2, nan1); // NaN op NaN => NaN
}
}
}
@ -706,8 +706,15 @@ TEST(ReduceFloat64Add) {
}
}
FOR_FLOAT64_INPUTS(i) { R.CheckPutConstantOnRight(*i); }
// TODO(titzer): CheckNans(&R);
FOR_FLOAT64_INPUTS(i) {
Double tmp(*i);
if (!tmp.IsSpecial() || tmp.IsInfinite()) {
// Don't check NaNs as they are reduced more.
R.CheckPutConstantOnRight(*i);
}
}
CheckNans(&R);
}
@ -721,7 +728,13 @@ TEST(ReduceFloat64Sub) {
R.CheckFoldBinop<double>(x - y, x, y);
}
}
// TODO(titzer): CheckNans(&R);
Node* zero = R.Constant<double>(0.0);
Node* x = R.Parameter();
R.CheckBinop(x, x, zero); // x - 0.0 => x
CheckNans(&R);
}
@ -783,6 +796,11 @@ TEST(ReduceFloat64Mod) {
}
}
Node* x = R.Parameter();
Node* zero = R.Constant<double>(0.0);
R.CheckFoldBinop<double>(v8::base::OS::nan_value(), x, zero);
CheckNans(&R);
}