-
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://111361499 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): Canonical link: https://commits.webkit.org/259548.856@safari-7615-branch
- Loading branch information
Justin Michaud
committed
Jun 28, 2023
1 parent
7f4ad44
commit c3d2e36
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