-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
CallVarargs should identify that it can read inline call frame argume…
…nts. rdar://112936988 Reviewed by Yusuke Suzuki. Call already does this, but CallVarargs has a special case that forgot. We should not be allowed to push PutStacks below a call of any kind, since it might access our call frame's arguments via foo.arguments, unless we are strict. The only exception is TailCall (but not TailCallForwardVarargsInlinedCaller), because it will destroy the entire frame. We do not un-pessimize TailCall yet to reduce risk, but it could be made to match TailCallForwardVarargs in the future. * JSTests/stress/putstacksinking-callvarargs.js: Added. (main.opt.x): (main.opt.y): (main.opt.z): (main.opt): (main): * JSTests/stress/putstacksinking-tailcallvarargs.js: Added. (main.opt.x): (main.opt.y): (main.opt.z): (main.opt): (main): * Source/JavaScriptCore/dfg/DFGPreciseLocalClobberize.h: (JSC::DFG::PreciseLocalClobberizeAdaptor::readTop): Originally-landed-as: 259548.856@safari-7615-branch (c3d2e36). rdar://111361499 Canonical link: https://commits.webkit.org/266393@main
- Loading branch information
1 parent
9b88dbf
commit e5652c9
Showing
3 changed files
with
78 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
//@ runDefault("--useConcurrentJIT=0") | ||
var iter; | ||
function main() { | ||
function opt(i) { | ||
function x() { | ||
return y(...[1]); | ||
} | ||
|
||
function y() { | ||
return z.apply(this, arguments); | ||
} | ||
|
||
function z() { | ||
if (iter > 10136) { | ||
if (x.arguments[2] != 1.3) | ||
throw "Wrong value" | ||
return x.arguments; | ||
} | ||
} | ||
noInline(z); | ||
|
||
x(1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 1.21, 1.22); | ||
} | ||
|
||
noInline(opt); | ||
for (let i = 0; i < 20000; ++i) { | ||
iter = i; | ||
opt(i); | ||
} | ||
} | ||
noDFG(main); | ||
|
||
main(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
//@ runDefault("--useConcurrentJIT=0") | ||
var iter; | ||
function main() { | ||
function opt(i) { | ||
function x() { | ||
return y(...[1]); | ||
} | ||
|
||
function y() { | ||
"use strict" | ||
return z.apply(this, arguments); | ||
} | ||
|
||
function z() { | ||
if (iter > 10136) { | ||
if (x.arguments[2] != 1.3) | ||
throw "Wrong value" | ||
return x.arguments; | ||
} | ||
} | ||
noInline(z); | ||
|
||
x(1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 1.21, 1.22); | ||
} | ||
|
||
noInline(opt); | ||
for (let i = 0; i < 20000; ++i) { | ||
iter = i; | ||
opt(i); | ||
} | ||
} | ||
noDFG(main); | ||
|
||
main(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters