Commit 7b935859 authored by Benedikt Meurer's avatar Benedikt Meurer Committed by Commit Bot

[turbofan] Use cheaper Float64 hole checks.

Holes in double arrays are encoded using a signaling NaN bit pattern.
Previously when checking for Float64 holes we did an expensive bit
check always, but most values aren't even NaNs in reality. So we changed
the CheckFloat64Hole operator to first check if the value is a NaN at
all and only if so, perform the concrete bit check (in deferred code).

This improves the array copying test case mentioned in the bug from

  copyPacked: 123 ms.
  copyHoley: 157 ms.

to

  copyPacked: 122 ms.
  copyHoley: 125 ms.

so there's almost no penalty for double holey arrays anymore in case of
copying arrays. This change seems to yield an overall ~1% on the Kraken
benchmark.

Bug: v8:8264
Change-Id: Id7393867ec96fdc080e24d326039f80a9d7b6646
Reviewed-on: https://chromium-review.googlesource.com/c/1261519Reviewed-by: 's avatarJaroslav Sevcik <jarin@chromium.org>
Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#56380}
parent 94b5122a
......@@ -3529,10 +3529,25 @@ Node* EffectControlLinearizer::LowerCheckFloat64Hole(Node* node,
CheckFloat64HoleParameters const& params =
CheckFloat64HoleParametersOf(node->op());
Node* value = node->InputAt(0);
Node* check = __ Word32Equal(__ Float64ExtractHighWord32(value),
__ Int32Constant(kHoleNanUpper32));
__ DeoptimizeIf(DeoptimizeReason::kHole, params.feedback(), check,
frame_state);
auto if_nan = __ MakeDeferredLabel();
auto done = __ MakeLabel();
// First check whether {value} is a NaN at all...
__ Branch(__ Float64Equal(value, value), &done, &if_nan);
__ Bind(&if_nan);
{
// ...and only if {value} is a NaN, perform the expensive bit
// check. See http://crbug.com/v8/8264 for details.
Node* check = __ Word32Equal(__ Float64ExtractHighWord32(value),
__ Int32Constant(kHoleNanUpper32));
__ DeoptimizeIf(DeoptimizeReason::kHole, params.feedback(), check,
frame_state);
__ Goto(&done);
}
__ Bind(&done);
return value;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment