Skip to content

Commit

Permalink
JSTests:
Browse files Browse the repository at this point in the history
Object allocation sinking is missing PutHint for allocations unreachable in the graph
https://bugs.webkit.org/show_bug.cgi?id=203799
<rdar://problem/56852162>

Reviewed by Saam Barati.

* stress/allocation-sinking-puthint-control-flow-2.js: Added.
(f.handler.construct):
(f):

Source/JavaScriptCore:
Object allocation sinking is missing PutHint for sunken allocations
https://bugs.webkit.org/show_bug.cgi?id=203799
<rdar://problem/56852162>

Reviewed by Saam Barati.

Consider the following graph:

    Block #0:
      1: PhantomCreateActivation()
      2: PhantomNewFunction()
      PutHint(@2, @1, FunctionActivationPLoc)
      Branch(#1, #2)

    Block #1:
      3: MaterializeCreateActivation()
      PutHint(@2, @3, FunctionActivationPLoc)
      Upsilon(@3, ^5)
      Jump(#3)

    Block #2:
      4: MaterializeCreateActivation()
      PutHint(@2, @4, FunctionActivationPLoc)
      Upsilon(@4, ^5)
      Jump(#3)

    Block #3:
      5: Phi()
      ExitOK()

On Block #3, we need to emit a PutHint after the Phi, since we might exit after it. However,
object allocation sinking skipped this Phi because it was checking whether the base of the
location that caused us to create this Phi (@2) was live, but it's dead in the graph (there
are no pointers to it).  The issue is that, even though there are no pointers to the base, the
location `PromotedHeapLocation(@2, FunctionActivationPLoc)` is still live, so we should PutHint
to it. We fix it by checking for liveness of the location rather than its base.

* dfg/DFGObjectAllocationSinkingPhase.cpp:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@254725 268f45cc-cd09-0410-ab3c-d52691b4dbfc
  • Loading branch information
tzagallo@apple.com committed Jan 17, 2020
1 parent da72c99 commit df3b07e
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 2 deletions.
12 changes: 12 additions & 0 deletions JSTests/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
2020-01-16 Tadeu Zagallo <tzagallo@apple.com>

Object allocation sinking is missing PutHint for allocations unreachable in the graph
https://bugs.webkit.org/show_bug.cgi?id=203799
<rdar://problem/56852162>

Reviewed by Saam Barati.

* stress/allocation-sinking-puthint-control-flow-2.js: Added.
(f.handler.construct):
(f):

2020-01-16 Robin Morisset <rmorisset@apple.com>

Teach the bytecode that arithmetic operations can return bigints
Expand Down
16 changes: 16 additions & 0 deletions JSTests/stress/allocation-sinking-puthint-control-flow-2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//@ runDefault("--useConcurrentJIT=0", "--jitPolicyScale=0")

function f() {
var x = {};
x = 0;
var handler = {
construct: function () {
x;
}
};
for (let i = 0; i < 1; i++)
(function () { i });
new Proxy(function() { }, handler);
}
f();
f();
41 changes: 41 additions & 0 deletions Source/JavaScriptCore/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,44 @@
2020-01-16 Tadeu Zagallo <tzagallo@apple.com>

Object allocation sinking is missing PutHint for sunken allocations
https://bugs.webkit.org/show_bug.cgi?id=203799
<rdar://problem/56852162>

Reviewed by Saam Barati.

Consider the following graph:

Block #0:
1: PhantomCreateActivation()
2: PhantomNewFunction()
PutHint(@2, @1, FunctionActivationPLoc)
Branch(#1, #2)

Block #1:
3: MaterializeCreateActivation()
PutHint(@2, @3, FunctionActivationPLoc)
Upsilon(@3, ^5)
Jump(#3)

Block #2:
4: MaterializeCreateActivation()
PutHint(@2, @4, FunctionActivationPLoc)
Upsilon(@4, ^5)
Jump(#3)

Block #3:
5: Phi()
ExitOK()

On Block #3, we need to emit a PutHint after the Phi, since we might exit after it. However,
object allocation sinking skipped this Phi because it was checking whether the base of the
location that caused us to create this Phi (@2) was live, but it's dead in the graph (there
are no pointers to it). The issue is that, even though there are no pointers to the base, the
location `PromotedHeapLocation(@2, FunctionActivationPLoc)` is still live, so we should PutHint
to it. We fix it by checking for liveness of the location rather than its base.

* dfg/DFGObjectAllocationSinkingPhase.cpp:

2020-01-16 Robin Morisset <rmorisset@apple.com>

Try to simplify the template deduction used by callOperation in DFGSpeculativeJIT
Expand Down
6 changes: 4 additions & 2 deletions Source/JavaScriptCore/dfg/DFGObjectAllocationSinkingPhase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -409,8 +409,10 @@ class LocalHeap {
Node* follow(PromotedHeapLocation location) const
{
const Allocation& base = m_allocations.find(location.base())->value;
auto iter = base.fields().find(location.descriptor());
if (base.isEscapedAllocation())
return nullptr;

auto iter = base.fields().find(location.descriptor());
if (iter == base.fields().end())
return nullptr;

Expand Down Expand Up @@ -1946,7 +1948,7 @@ class ObjectAllocationSinkingPhase : public Phase {
availabilityCalculator.m_availability, identifier, phiDef->value());

for (PromotedHeapLocation location : hintsForPhi[variable->index()]) {
if (m_heap.onlyLocalAllocation(location.base())) {
if (m_heap.onlyLocalAllocation(location)) {
m_insertionSet.insert(0,
location.createHint(m_graph, block->at(0)->origin.withInvalidExit(), phiDef->value()));
m_localMapping.set(location, phiDef->value());
Expand Down

0 comments on commit df3b07e

Please sign in to comment.