v8/test
Georg Schmid 7fd1922823 [turbofan] Relax double const store invariant in load elim. for literals
Even when a field is marked const, we may emit multiple consecutive in-literal stores to that field. That is, in 'JSNativeContextSpecialization::BuildPropertyStore', when the access mode is 'kStoreInLiteral' and we are accessing a const field, we may produce a StoreField node, even though another StoreField (that stores something other than 'Uninitialized') to the same const field dominates it. This appears to be sound, since earlier stores to literals cannot be observed anyways.

Unfortunately this behavior conflicts with the double const store invariant in load elimination: Roughly speaking, we assume that load elimination may never observe two consecutive const stores to the same field on the same object.

The apparent solution would be to treat 'kStoreInLiteral' accesses like regular 'kStore' accesses: For consecutive stores to const properties we don't emit StoreField, but instead emit code that checks whether the value about to be written is equivalent to the previously written one, and otherwise deopt ('DeoptimizeReason::kWrongValue'). Unfortunately this turns out impractical, since for 'kStoreInLiteral' accesses we can't easily decide whether we're dealing with the first such store or one of the consecutive ones. Also see this abandoned CL: https://chromium-review.googlesource.com/c/v8/v8/+/1762020.

This CL instead adds an exception to the invariant in load elimination. We track whether a store arose from a 'kStoreInLiteral' access, and use this information when visiting StoreField nodes in load elimination.

R=neis@chromium.org, tebbi@chromium.org

Bug: chromium:987205
Change-Id: I8829752aa0637e9599677d20aad2d706d40d7fe6
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1763535
Reviewed-by: Tobias Tebbi <tebbi@chromium.org>
Reviewed-by: Georg Neis <neis@chromium.org>
Commit-Queue: Georg Schmid <gsps@google.com>
Cr-Commit-Position: refs/heads/master@{#63385}
2019-08-23 17:10:48 +00:00
..
benchmarks [test] Skip flaky test on predictable mode 2019-05-07 13:57:18 +00:00
cctest [wasm-simd] Implement F64x2 eq ne gt ge lt le for arm64 2019-08-23 16:57:18 +00:00
common Use relative paths to OWNERS files 2019-08-12 13:52:52 +00:00
debugger Use relative paths to OWNERS files 2019-08-12 13:52:52 +00:00
fuzzer [regexp] Fix clusterfuzz syntax errors for regexp-builtins 2019-08-22 05:50:35 +00:00
inspector Do not run microtasks when there are scheduled exceptions 2019-08-23 16:17:58 +00:00
intl [Intl] Adding volume units. 2019-07-24 17:16:46 +00:00
js-perf-test [jsperf] Add benchmark for LoadConstantFromPrototype 2019-08-16 09:33:06 +00:00
memory [owners] Remove redundant OWNERS files in test/ 2019-06-24 12:44:32 +00:00
message [scanner] fix bug with reporting invalid numeric separator 2019-08-08 16:36:36 +00:00
mjsunit [turbofan] Relax double const store invariant in load elim. for literals 2019-08-23 17:10:48 +00:00
mkgrokdump Reland "Add postmortem debugging helper library" 2019-07-31 14:30:19 +00:00
mozilla [regexp] Add missing case for EscapeRegExpPattern 2019-07-09 08:11:51 +00:00
preparser Add OWNERS files for src and test 2019-05-30 04:51:21 +00:00
test262 [names] Fix some test262 name tests to conform with spec changes 2019-08-23 15:04:31 +00:00
torque [csa] Add TaggedEqual for comparing tagged values 2019-08-23 14:31:11 +00:00
unittests [turbofan] Further brokerize BytecodeGraphBuilder 2019-08-23 16:04:01 +00:00
wasm-api-tests [wasm-c-api] Roll 7865f7d: Expose possible traps during Instance::make 2019-08-23 09:46:29 +00:00
wasm-js Use relative paths to OWNERS files 2019-08-12 13:52:52 +00:00
wasm-spec-tests [mips][wasm] Correct wasm address space limit. 2019-08-02 14:54:08 +00:00
webkit [regexp] Add missing case for EscapeRegExpPattern 2019-07-09 08:11:51 +00:00
BUILD.gn [wasm-c-api] Add tests and fixes 2019-05-28 09:57:04 +00:00
OWNERS Use relative paths to OWNERS files 2019-08-12 13:52:52 +00:00