v8/test
Benedikt Meurer f19c4a594f [turbofan] ReceiverOrNullOrUndefined feedback for JSEqual.
This changes the ReceiverOrOddball feedback on JSStrictEqual to
ReceiverOrNullOrUndefined feedback, which can also safely be
consumed by JSEqual (we cannot generally accept any oddball here
since booleans trigger implicit conversions, unfortunately).
Thus we replace the previously introduced CheckReceiverOrOddball
with CheckReceiverOrNullOrUndefined, and drop CheckOddball, since
we will no longer collect Oddball feedback separately.

TurboFan will then turn a JSEqual[ReceiverOrNullOrUndefined] into
a sequence like this:

```
left = CheckReceiverOrNullOrUndefined(left);
right = CheckReceiverOrNullOrUndefined(right);
result = if ObjectIsUndetectable(left) then
           ObjectIsUndetectable(right)
         else
           ReferenceEqual(left, right);
```

This significantly improves the peak performance of abstract equality
with Receiver, Null or Undefined inputs. On the test case outlined in
http://crbug.com/v8/8356 we go from

  naive: 2946 ms.
  tenary: 2134 ms.

to

  naive: 2230 ms.
  tenary: 2250 ms.

which corresponds to a 25% improvement on the abstract equality case.
For regular code this will probably yield more performance, since we
get rid of the JSEqual operator, which might have arbitrary side
effects and thus blocks all kinds of TurboFan optimizations. The
JSStrictEqual case is slightly slower now, since it has to rule out
booleans as well (even though that's not strictly necessary, but
consistency is key here).

This way developers can safely use `a == b` instead of doing a dance
like `a == null ? b == null : a === b` (which is what dart2js does
right now) when both `a` and `b` are known to be Receiver, Null or
Undefined. The abstract equality is not only faster to parse than
the tenary, but also generates a shorter bytecode sequence. In the
test case referenced in http://crbug.com/v8/8356 the bytecode for
`naive` is

```
StackCheck
Ldar a1
TestEqual a0, [0]
JumpIfFalse [5]
LdaSmi [1]
Return
LdaSmi [2]
Return
```

which is 14 bytes, whereas the `tenary` function generates

```
StackCheck
Ldar a0
TestUndetectable
JumpIfFalse [7]
Ldar a1
TestUndetectable
Jump [7]
Ldar a1
TestEqualStrict a0, [0]
JumpIfToBooleanFalse [5]
LdaSmi [1]
Return
LdaSmi [2]
Return
```

which is 24 bytes. So the `naive` version is 40% smaller and requires
fewer bytecode dispatches.

Bug: chromium:898455, v8:8356
Change-Id: If3961b2518b4438700706b3bd6071d546305e233
Reviewed-on: https://chromium-review.googlesource.com/c/1297315
Reviewed-by: Jaroslav Sevcik <jarin@chromium.org>
Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#56948}
2018-10-24 13:45:22 +00:00
..
benchmarks [test] Share resource-fetching logic with all d8 test cases 2018-08-29 17:51:43 +00:00
cctest Reland "[heap] Clean-up MemoryChunk allocation area constants." 2018-10-24 13:27:41 +00:00
common [wasm] Use getter for WasmResult::value 2018-10-19 14:32:02 +00:00
debugger [test] Skip slow tests on arm simulators 2018-10-17 08:52:47 +00:00
fuzzer [wasm] Do not store ModuleEnv 2018-10-23 12:47:14 +00:00
inspector [heap profiler] Plumb samples through the protocol. 2018-10-23 00:12:01 +00:00
intl [Intl] Add more tests for Intl.Segmenter 2018-10-19 22:59:26 +00:00
js-perf-test Fix StringToList to set right length of the new array. 2018-10-24 13:30:51 +00:00
memory [snapshot] Add tracking for read-only snapshot size. 2018-10-23 13:34:13 +00:00
message [parser] Token-range-check for callable identifier tokens 2018-10-17 10:21:44 +00:00
mjsunit [turbofan] ReceiverOrNullOrUndefined feedback for JSEqual. 2018-10-24 13:45:22 +00:00
mkgrokdump [cleanup] Cleanup IMMORTAL_IMMOVABLE_ROOT_LIST 2018-10-09 09:05:37 +00:00
mozilla [test] Add more test suites to Android testing 2018-09-07 09:53:15 +00:00
preparser [test] Share resource-fetching logic with all d8 test cases 2018-08-29 17:51:43 +00:00
test262 [d8] only add arguments object if arguments are provided 2018-10-23 11:46:53 +00:00
torque [torque] add test for loop that only exits from the middle 2018-10-24 10:05:42 +00:00
unittests [turbofan] ReceiverOrNullOrUndefined feedback for JSEqual. 2018-10-24 13:45:22 +00:00
wasm-js Reland "[wasm] Add a new wasm-js testsuite to run js-api tests" 2018-10-18 20:18:55 +00:00
wasm-spec-tests [wasm] Update wasm spec tests 2018-10-23 08:57:08 +00:00
webkit [class] Ship instance and static public class fields 2018-10-18 18:14:52 +00:00
BUILD.gn Reland "[wasm] Add a new wasm-js testsuite to run js-api tests" 2018-10-18 20:18:55 +00:00