CodeCache should check that the UnlinkedCodeBlock was successfully created before...
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog-2015-11-21
1 2015-11-20  Andreas Kling  <akling@apple.com>
2
3         REGRESSION(r192536): Null pointer dereference in JSPropertyNameEnumerator::visitChildren().
4         <https://webkit.org/b/151495>
5
6         Reviewed by Mark Lam.
7
8         The copied space allocation in JSPropertyNameEnumerator::finishCreation()
9         may end up triggering a GC, and so JSPropertyNameEnumerator::visitChildren()
10         would get called while m_propertyNames was still null.
11
12         This patch fixes that by having visitChildren() check for pointer nullity
13         instead of the number of names, since that is non-zero even before the
14         allocation is made.
15
16         Added a test that induces GC during JSPropertyNameEnumerator construction
17         to cover this bug.
18
19         Test: property-name-enumerator-gc-151495.js
20
21         * runtime/JSPropertyNameEnumerator.cpp:
22         (JSC::JSPropertyNameEnumerator::visitChildren):
23
24 2015-11-20  Andreas Kling  <akling@apple.com>
25
26         GC timers should carry on gracefully when Heap claims it grew from GC.
27         <https://webkit.org/b/151521>
28
29         Reviewed by Mark Lam.
30
31         TL;DR the Heap "extra memory" reporting APIs are hard to use 100% correctly
32         and GC scheduling shouldn't break if someone makes a mistake with it.
33
34         The JSC::Heap allows you to report an extra memory cost for any GC object.
35         This is reported first when allocating the memory, and then each time the
36         object is visited during the marking phase.
37
38         When reporting an allocation, it's added to the Heap's "bytes allocated in
39         this cycle" counter. This contributes to the computed heap size at the start
40         of a collection.
41
42         When visiting a GC object that reports extra memory, it's added to the Heap's
43         "extra memory visited in this collection" counter. This contributes to the
44         computed heap size at the end of a collection.
45
46         As you can see, this means that visiting more memory than we said we allocated
47         can lead to the Heap thinking it's bigger after a collection than it was before.
48
49         Clients of this API do some sketchy things to compute costs, for instance
50         StringImpl cost is determined by dividing the number of bytes used for the
51         characters, and dividing it by the StringImpl's ref count. Since a JSString
52         could be backed by any StringImpl, any code that modifies a StringImpl's
53         ref count during collection will change the extra memory reported by all
54         JSString objects that wrap that StringImpl.
55
56         So anyways...
57
58         The object death rate, which is the basis for when to schedule the next
59         collection is computed like so:
60
61             deathRate = (sizeBeforeGC - sizeAfterGC) / sizeBeforeGC
62
63         This patch adds a safety mechanism that returns a zero death rate when the Heap
64         claims it grew from collection.
65
66         * heap/EdenGCActivityCallback.cpp:
67         (JSC::EdenGCActivityCallback::deathRate):
68         * heap/FullGCActivityCallback.cpp:
69         (JSC::FullGCActivityCallback::deathRate):
70
71 2015-11-20  Mark Lam  <mark.lam@apple.com>
72
73         New JSC tests introduced in r192664 fail on ARM.
74         https://bugs.webkit.org/show_bug.cgi?id=151485
75
76         Reviewed by Geoffrey Garen.
77
78         The newly added tests are exposing some pre-existing bugs.  The bugs are tracked here:
79             https://bugs.webkit.org/show_bug.cgi?id=151514
80             https://bugs.webkit.org/show_bug.cgi?id=151515
81
82         Skipping the tests for now.
83
84         * tests/stress/op_div.js:
85         * tests/stress/op_rshift.js:
86         * tests/stress/op_urshift.js:
87
88 2015-11-20  Filip Pizlo  <fpizlo@apple.com>
89
90         B3 should have a Select opcode
91         https://bugs.webkit.org/show_bug.cgi?id=150762
92
93         Reviewed by Benjamin Poulain.
94
95         This cleans up our conditional move implementation - specifically so that it distinguishes between
96         comparing the low 32 bits of a GPR and all bits of a GPR - and fixes bugs with operand ordering. It
97         then adds a Select opcode to B3 and adds all of the strength reduction and lowering magic that it
98         needs. Finally this change implements FTL::Output::select() in terms of B3::Select.
99
100         This patch lets us run Kraken/imaging-gaussian-blur. Running that benchmark using FTL+B3 is a 17%
101         speed-up. The compile times go down dramatically (by about 7x) and code quality stays about the same.
102
103         * assembler/MacroAssembler.h:
104         (JSC::MacroAssembler::moveDoubleConditionally32):
105         (JSC::MacroAssembler::moveDoubleConditionally64):
106         (JSC::MacroAssembler::moveDoubleConditionallyTest32):
107         (JSC::MacroAssembler::moveDoubleConditionallyTest64):
108         (JSC::MacroAssembler::moveDoubleConditionallyDouble):
109         (JSC::MacroAssembler::lea):
110         * assembler/MacroAssemblerX86Common.h:
111         (JSC::MacroAssemblerX86Common::move):
112         (JSC::MacroAssemblerX86Common::moveConditionallyDouble):
113         (JSC::MacroAssemblerX86Common::zeroExtend32ToPtr):
114         (JSC::MacroAssemblerX86Common::moveConditionally32):
115         (JSC::MacroAssemblerX86Common::moveConditionallyTest32):
116         (JSC::MacroAssemblerX86Common::set32):
117         (JSC::MacroAssemblerX86Common::cmov):
118         (JSC::MacroAssemblerX86Common::moveConditionally): Deleted.
119         (JSC::MacroAssemblerX86Common::moveConditionallyTest): Deleted.
120         * assembler/MacroAssemblerX86_64.h:
121         (JSC::MacroAssemblerX86_64::branchNeg64):
122         (JSC::MacroAssemblerX86_64::moveConditionally64):
123         (JSC::MacroAssemblerX86_64::moveConditionallyTest64):
124         (JSC::MacroAssemblerX86_64::abortWithReason):
125         * assembler/X86Assembler.h:
126         (JSC::X86Assembler::cmovl_rr):
127         (JSC::X86Assembler::cmovl_mr):
128         (JSC::X86Assembler::cmovel_rr):
129         (JSC::X86Assembler::cmovnel_rr):
130         (JSC::X86Assembler::cmovpl_rr):
131         (JSC::X86Assembler::cmovnpl_rr):
132         (JSC::X86Assembler::cmovq_rr):
133         (JSC::X86Assembler::cmovq_mr):
134         (JSC::X86Assembler::cmoveq_rr):
135         (JSC::X86Assembler::cmovneq_rr):
136         (JSC::X86Assembler::cmovpq_rr):
137         (JSC::X86Assembler::cmovnpq_rr):
138         * b3/B3LowerToAir.cpp:
139         (JSC::B3::Air::LowerToAir::createCompare):
140         (JSC::B3::Air::LowerToAir::createSelect):
141         (JSC::B3::Air::LowerToAir::marshallCCallArgument):
142         (JSC::B3::Air::LowerToAir::lower):
143         * b3/B3MoveConstants.cpp:
144         * b3/B3Opcode.cpp:
145         (WTF::printInternal):
146         * b3/B3Opcode.h:
147         * b3/B3ReduceStrength.cpp:
148         * b3/B3Validate.cpp:
149         * b3/B3Value.cpp:
150         (JSC::B3::Value::effects):
151         (JSC::B3::Value::key):
152         (JSC::B3::Value::checkOpcode):
153         (JSC::B3::Value::typeFor):
154         * b3/B3Value.h:
155         * b3/B3ValueKey.cpp:
156         (JSC::B3::ValueKey::dump):
157         (JSC::B3::ValueKey::materialize):
158         * b3/B3ValueKey.h:
159         (JSC::B3::ValueKey::ValueKey):
160         (JSC::B3::ValueKey::hash):
161         (JSC::B3::ValueKey::operator bool):
162         * b3/B3ValueKeyInlines.h:
163         (JSC::B3::ValueKey::ValueKey):
164         (JSC::B3::ValueKey::child):
165         * b3/air/AirOpcode.opcodes:
166         * b3/testb3.cpp:
167         (JSC::B3::testTruncSExt32):
168         (JSC::B3::testBasicSelect):
169         (JSC::B3::testSelectTest):
170         (JSC::B3::testSelectCompareDouble):
171         (JSC::B3::testSelectDouble):
172         (JSC::B3::testSelectDoubleTest):
173         (JSC::B3::testSelectDoubleCompareDouble):
174         (JSC::B3::zero):
175         (JSC::B3::run):
176         * ftl/FTLB3Output.h:
177         (JSC::FTL::Output::testIsZeroPtr):
178         (JSC::FTL::Output::testNonZeroPtr):
179         (JSC::FTL::Output::select):
180         (JSC::FTL::Output::extractValue):
181         (JSC::FTL::Output::fence):
182
183 2015-11-20  Benjamin Poulain  <bpoulain@apple.com>
184
185         [JSC] Add Air lowering to BitNot() for Xor(value, -1)
186         https://bugs.webkit.org/show_bug.cgi?id=151474
187
188         Reviewed by Filip Pizlo.
189
190         * assembler/MacroAssemblerX86Common.h:
191         (JSC::MacroAssemblerX86Common::not32):
192         * assembler/MacroAssemblerX86_64.h:
193         (JSC::MacroAssemblerX86_64::not64):
194         * assembler/X86Assembler.h:
195         (JSC::X86Assembler::notq_r):
196         (JSC::X86Assembler::notq_m):
197         * b3/B3LowerToAir.cpp:
198         (JSC::B3::Air::LowerToAir::createGenericCompare):
199         (JSC::B3::Air::LowerToAir::lower):
200         * b3/B3ReduceStrength.cpp:
201         * b3/air/AirOpcode.opcodes:
202         * b3/testb3.cpp:
203         (JSC::B3::testNegValueSubOne):
204         (JSC::B3::testNegValueSubOne32):
205         (JSC::B3::testBitNotArg):
206         (JSC::B3::testBitNotImm):
207         (JSC::B3::testBitNotMem):
208         (JSC::B3::testBitNotArg32):
209         (JSC::B3::testBitNotImm32):
210         (JSC::B3::testBitNotMem32):
211         (JSC::B3::testBitNotOnBooleanAndBranch32):
212         (JSC::B3::int64Operands):
213         (JSC::B3::int32Operands):
214         (JSC::B3::run):
215         * ftl/FTLB3Output.h:
216         (JSC::FTL::Output::bitNot):
217
218 2015-11-20  Yusuke Suzuki  <utatane.tea@gmail.com>
219
220         Super use should be recorded in per-function scope
221         https://bugs.webkit.org/show_bug.cgi?id=151500
222
223         Reviewed by Geoffrey Garen.
224
225         "super" use is prohibited under the non-constructor / non-class-method-related functions.
226         This "super" use should be recorded in per-function scope to check its incorrect use after
227         parsing a function.
228         Currently, we accidentally record it to a lexical current scope. So when using "super" inside
229         a block scope, our "super" use guard miss it.
230
231         * parser/Parser.cpp:
232         (JSC::Parser<LexerType>::parseMemberExpression):
233         * parser/Parser.h:
234         (JSC::Parser::currentVariableScope):
235         (JSC::Parser::currentFunctionScope):
236         (JSC::Parser::declareVariable):
237         * tests/stress/super-in-lexical-scope.js: Added.
238         (testSyntax):
239         (testSyntaxError):
240         (testSyntaxError.test):
241
242 2015-11-20  Chris Dumez  <cdumez@apple.com>
243
244         Caching of properties on objects that have named property getters is sometimes incorrect
245         https://bugs.webkit.org/show_bug.cgi?id=151453
246         <rdar://problem/23049343>
247
248         Reviewed by Gavin Barraclough.
249
250         Add new GetOwnPropertySlotIsImpureForPropertyAbsence TypeInfo flag to be
251         used by objects that have a non-'OverrideBuiltins' named property getter.
252         This flag prevents caching of properties that are missing as a named
253         property with this name may later become available.
254
255         Objects with an 'OverrideBuiltins' named property getter will keep using
256         the GetOwnPropertySlotIsImpure TypeInfo flag, which prevents all property
257         caching since named properties can override own properties or properties
258         on the prototype.
259
260         * bytecode/ComplexGetStatus.cpp:
261         (JSC::ComplexGetStatus::computeFor):
262         * bytecode/PropertyCondition.cpp:
263         (JSC::PropertyCondition::isStillValid):
264         * jit/Repatch.cpp:
265         (JSC::tryCacheGetByID):
266         (JSC::tryRepatchIn):
267         * jsc.cpp:
268         * runtime/JSTypeInfo.h:
269         (JSC::TypeInfo::getOwnPropertySlotIsImpure):
270         (JSC::TypeInfo::getOwnPropertySlotIsImpureForPropertyAbsence):
271         (JSC::TypeInfo::prohibitsPropertyCaching): Deleted.
272         * runtime/Structure.h:
273
274 2015-11-19  Joseph Pecoraro  <pecoraro@apple.com>
275
276         REGRESSION(r189433) Web Inspector: JSContext inspection exceptions should include native call frames by default
277         https://bugs.webkit.org/show_bug.cgi?id=151479
278
279         Reviewed by Brian Burg.
280
281         * inspector/JSGlobalObjectInspectorController.h:
282         Value accidentally got flipped when moving to initializer syntax.
283
284 2015-11-19  Saam barati  <sbarati@apple.com>
285
286         [ES6] Add support for rest parameters
287         https://bugs.webkit.org/show_bug.cgi?id=38408
288
289         Reviewed by Geoffrey Garen.
290
291         This patch implements rest parameters from the ES6 spec.
292         http://www.ecma-international.org/ecma-262/6.0/index.html#sec-function-definitions
293
294         We implement the rest parameter as a new AST node. This AST node
295         lowers to "op_new_array X, op_copy_rest X". Note
296         that the op_copy_rest opcode does not have a result.
297         The bulk of this patch is implementing op_copy_rest.
298         This patch implements this in all four tiers in a straight forward way.
299         The opcode is implemented as a C call that will read the pertinent
300         arguments from the call frame and fill them into the array.
301
302         * bytecode/BytecodeList.json:
303         * bytecode/BytecodeUseDef.h:
304         (JSC::computeUsesForBytecodeOffset):
305         (JSC::computeDefsForBytecodeOffset):
306         * bytecode/CodeBlock.cpp:
307         (JSC::CodeBlock::dumpBytecode):
308         * bytecode/Instruction.h:
309         (JSC::Instruction::Instruction):
310         * bytecompiler/BytecodeGenerator.cpp:
311         (JSC::BytecodeGenerator::generate):
312         (JSC::BytecodeGenerator::BytecodeGenerator):
313         (JSC::BytecodeGenerator::initializeDefaultParameterValuesAndSetupFunctionScopeStack):
314         (JSC::BytecodeGenerator::invalidateForInContextForLocal):
315         (JSC::BytecodeGenerator::emitRestParameter):
316         * bytecompiler/BytecodeGenerator.h:
317         * bytecompiler/NodesCodegen.cpp:
318         (JSC::AssignmentElementNode::toString):
319         (JSC::RestParameterNode::collectBoundIdentifiers):
320         (JSC::RestParameterNode::toString):
321         (JSC::RestParameterNode::bindValue):
322         (JSC::RestParameterNode::emit):
323         (JSC::SpreadExpressionNode::emitBytecode):
324         * dfg/DFGAbstractInterpreterInlines.h:
325         (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
326         * dfg/DFGByteCodeParser.cpp:
327         (JSC::DFG::ByteCodeParser::parseBlock):
328         * dfg/DFGCapabilities.cpp:
329         (JSC::DFG::capabilityLevel):
330         * dfg/DFGClobberize.h:
331         (JSC::DFG::clobberize):
332         * dfg/DFGDoesGC.cpp:
333         (JSC::DFG::doesGC):
334         * dfg/DFGFixupPhase.cpp:
335         (JSC::DFG::FixupPhase::fixupNode):
336         * dfg/DFGNode.h:
337         (JSC::DFG::Node::setEpoch):
338         (JSC::DFG::Node::numberOfArgumentsToSkip):
339         (JSC::DFG::Node::dumpChildren):
340         * dfg/DFGNodeType.h:
341         * dfg/DFGOperations.cpp:
342         * dfg/DFGOperations.h:
343         * dfg/DFGPredictionPropagationPhase.cpp:
344         (JSC::DFG::PredictionPropagationPhase::propagate):
345         * dfg/DFGSafeToExecute.h:
346         (JSC::DFG::safeToExecute):
347         * dfg/DFGSpeculativeJIT.cpp:
348         (JSC::DFG::SpeculativeJIT::compileCreateClonedArguments):
349         (JSC::DFG::SpeculativeJIT::compileCopyRest):
350         (JSC::DFG::SpeculativeJIT::compileNotifyWrite):
351         * dfg/DFGSpeculativeJIT.h:
352         (JSC::DFG::SpeculativeJIT::callOperation):
353         * dfg/DFGSpeculativeJIT32_64.cpp:
354         (JSC::DFG::SpeculativeJIT::compile):
355         * dfg/DFGSpeculativeJIT64.cpp:
356         (JSC::DFG::SpeculativeJIT::compile):
357         * ftl/FTLCapabilities.cpp:
358         (JSC::FTL::canCompile):
359         * ftl/FTLIntrinsicRepository.h:
360         * ftl/FTLLowerDFGToLLVM.cpp:
361         (JSC::FTL::DFG::LowerDFGToLLVM::compileNode):
362         (JSC::FTL::DFG::LowerDFGToLLVM::compileCreateClonedArguments):
363         (JSC::FTL::DFG::LowerDFGToLLVM::compileCopyRest):
364         (JSC::FTL::DFG::LowerDFGToLLVM::compileNewObject):
365         * jit/JIT.cpp:
366         (JSC::JIT::privateCompileMainPass):
367         * jit/JIT.h:
368         * jit/JITOpcodes.cpp:
369         (JSC::JIT::emit_op_create_out_of_band_arguments):
370         (JSC::JIT::emit_op_copy_rest):
371         * jit/JITOperations.h:
372         * llint/LowLevelInterpreter.asm:
373         * parser/ASTBuilder.h:
374         (JSC::ASTBuilder::createBindingLocation):
375         (JSC::ASTBuilder::createRestParameter):
376         (JSC::ASTBuilder::createAssignmentElement):
377         * parser/NodeConstructors.h:
378         (JSC::AssignmentElementNode::AssignmentElementNode):
379         (JSC::RestParameterNode::RestParameterNode):
380         (JSC::DestructuringAssignmentNode::DestructuringAssignmentNode):
381         * parser/Nodes.h:
382         (JSC::DestructuringPatternNode::isBindingNode):
383         (JSC::DestructuringPatternNode::isRestParameter):
384         (JSC::DestructuringPatternNode::emitDirectBinding):
385         (JSC::RestParameterNode::name):
386         * parser/Parser.cpp:
387         (JSC::Parser<LexerType>::parseVariableDeclarationList):
388         (JSC::Parser<LexerType>::declareRestOrNormalParameter):
389         (JSC::Parser<LexerType>::createBindingPattern):
390         (JSC::Parser<LexerType>::parseFormalParameters):
391         * parser/Parser.h:
392         (JSC::Parser::strictMode):
393         (JSC::Parser::isValidStrictMode):
394         (JSC::Parser::declareParameter):
395         (JSC::Parser::breakIsValid):
396         * parser/SyntaxChecker.h:
397         (JSC::SyntaxChecker::operatorStackPop):
398         * runtime/CommonSlowPaths.cpp:
399         (JSC::SLOW_PATH_DECL):
400         * runtime/CommonSlowPaths.h:
401         * tests/es6.yaml:
402         * tests/stress/rest-parameter-and-default-arguments.js: Added.
403         (assert):
404         (shouldThrowTDZ):
405         (foo):
406         (baz):
407         (i.shouldThrowTDZ):
408         * tests/stress/rest-parameter-basics.js: Added.
409         (assert):
410         (foo):
411         (bar):
412         (capture):
413         (baz):
414         (jaz):
415         (kaz):
416         (raz):
417         (restLength):
418         (testArgumentsObject):
419         (strictModeLikeArgumentsObject):
420         * tests/stress/rest-parameter-inlined.js: Added.
421         (assert):
422         (bar):
423         (foo):
424         (baz):
425         (jaz):
426
427 2015-11-19  Filip Pizlo  <fpizlo@apple.com>
428
429         B3 should have a story for Ext/Trunc strength reduction
430         https://bugs.webkit.org/show_bug.cgi?id=151464
431
432         Reviewed by Geoffrey Garen.
433
434         The LLVM shift operations require the shift amount to have the same type as the shift base. The B3
435         shift operations require the shift amount to be an Int32. DFG concurs with this. But the initial
436         lowering should involve pretending the FTLOutput's shift operations still take an LLVM-style shift
437         amount so that we don't regress FTL->LLVM performance. That means emitting an extra Trunc. That means
438         that we want to be able to constant fold Trunc and be able to fold Trunc(ZExt).
439
440         * b3/B3LowerToAir.cpp:
441         (JSC::B3::Air::LowerToAir::lower):
442         * b3/B3ReduceStrength.cpp:
443         * b3/air/AirOpcode.opcodes:
444         * b3/testb3.cpp:
445         (JSC::B3::testSwitchChillDiv):
446         (JSC::B3::testTruncFold):
447         (JSC::B3::testZExt32):
448         (JSC::B3::testZExt32Fold):
449         (JSC::B3::testSExt32):
450         (JSC::B3::testSExt32Fold):
451         (JSC::B3::testTruncZExt32):
452         (JSC::B3::testTruncSExt32):
453         (JSC::B3::zero):
454         (JSC::B3::run):
455         * ftl/FTLB3Output.cpp:
456         (JSC::FTL::Output::store):
457         (JSC::FTL::Output::baseIndex):
458         (JSC::FTL::Output::branch):
459         * ftl/FTLB3Output.h:
460         (JSC::FTL::Output::bitAnd):
461         (JSC::FTL::Output::bitOr):
462         (JSC::FTL::Output::bitXor):
463         (JSC::FTL::Output::shl):
464         (JSC::FTL::Output::aShr):
465         (JSC::FTL::Output::lShr):
466         (JSC::FTL::Output::bitNot):
467         (JSC::FTL::Output::insertElement):
468         (JSC::FTL::Output::address):
469         (JSC::FTL::Output::baseIndex):
470
471 2015-11-19  Mark Lam  <mark.lam@apple.com>
472
473         Create correctness tests for binary snippet operators.
474         https://bugs.webkit.org/show_bug.cgi?id=151465
475
476         Reviewed by Geoffrey Garen.
477
478         Implement a common infrastructure for generating and running tests on binary
479         operators.  Also re-implemented the op_add, op_sub, and op_mul tests to be based
480         on this new infrastructure.
481
482         * tests/stress/op_add.js:
483         * tests/stress/op_mul.js:
484         * tests/stress/op_sub.js:
485         - These were reimplemented using binary-op-test.js.
486
487         * tests/stress/op_div.js: Added.
488         * tests/stress/op_mod.js: Added.
489
490         * tests/stress/op_bitand.js: Added.
491         * tests/stress/op_bitor.js: Added.
492         * tests/stress/op_bitxor.js: Added.
493
494         * tests/stress/op_lshift.js: Added.
495         * tests/stress/op_rshift.js: Added.
496         * tests/stress/op_urshift.js: Added.
497
498         * tests/stress/resources/binary-op-test.js: Added.
499         - Common code for generating and running tests.
500
501 2015-11-19  Caitlin Potter  <caitp@igalia.com>
502
503         [JSC] Fix AssignmentElement parsing
504         https://bugs.webkit.org/show_bug.cgi?id=151026
505
506         Reviewed by Geoffrey Garen.
507
508         When parsing an AssignmentPattern, any LeftHandSideExpression which
509         is a valid assignment target is acceptable.
510
511         Additionally, this change minimizes the amount of time spent
512         re-parsing ObjectLiteral and ArrayLiterals, by parsing as an
513         Expression first (the common case), and re-parsing only if the
514         result is a valid ObjectLiteral or ArrayLiteral followed by an `=`,
515         or if an error specifically indicates that the expression could
516         have been parsed as an AssignmentPattern.
517
518         * bytecompiler/NodesCodegen.cpp:
519         (JSC::AssignmentElementNode::collectBoundIdentifiers):
520         (JSC::AssignmentElementNode::bindValue):
521         (JSC::AssignmentElementNode::toString):
522         * parser/ASTBuilder.h:
523         (JSC::ASTBuilder::isAssignmentLocation):
524         (JSC::ASTBuilder::isObjectLiteral):
525         (JSC::ASTBuilder::isArrayLiteral):
526         (JSC::ASTBuilder::isObjectOrArrayLiteral):
527         (JSC::ASTBuilder::createAssignmentElement):
528         * parser/NodeConstructors.h:
529         (JSC::AssignmentElementNode::AssignmentElementNode):
530         * parser/Nodes.h:
531         (JSC::ExpressionNode::isObjectLiteral):
532         (JSC::ExpressionNode::isArrayLiteral):
533         (JSC::AssignmentElementNode::assignmentTarget):
534         (JSC::AssignmentElementNode::divotStart):
535         (JSC::AssignmentElementNode::divotEnd):
536         * parser/Parser.cpp:
537         (JSC::Parser<LexerType>::Parser):
538         (JSC::Parser<LexerType>::createAssignmentElement):
539         (JSC::Parser<LexerType>::parseBindingOrAssignmentElement):
540         (JSC::Parser<LexerType>::parseAssignmentElement):
541         (JSC::Parser<LexerType>::parseDestructuringPattern):
542         (JSC::Parser<LexerType>::parseAssignmentExpression):
543         (JSC::Parser<LexerType>::parseProperty):
544         * parser/Parser.h:
545         (JSC::Parser::ExpressionErrorClassifier::ExpressionErrorClassifier):
546         (JSC::Parser::ExpressionErrorClassifier::~ExpressionErrorClassifier):
547         (JSC::Parser::ExpressionErrorClassifier::classifyExpressionError):
548         (JSC::Parser::ExpressionErrorClassifier::indicatesPossiblePattern):
549         (JSC::Parser::classifyExpressionError):
550         * parser/SyntaxChecker.h:
551         (JSC::SyntaxChecker::operatorStackPop):
552         * tests/es6.yaml:
553         * tests/es6/destructuring_assignment_non_simple_target.js: Added.
554         (test.):
555         (test):
556         * tests/es6/destructuring_initializer_scoping.js: Added.
557         (test.tester):
558         * tests/stress/destructuring-assignment-syntax.js: Added.
559         (testSyntax):
560         (testSyntaxError):
561         * tests/stress/rest-elements.js:
562         (shouldThrow): Deleted.
563
564 2015-11-19  Filip Pizlo  <fpizlo@apple.com>
565
566         FTL->B3 lowering should support integer comparisons with the opcode abstracted and a few other things
567         https://bugs.webkit.org/show_bug.cgi?id=151463
568
569         Reviewed by Geoffrey Garen.
570
571         * ftl/FTLB3Output.h:
572         (JSC::FTL::Output::signExt):
573         (JSC::FTL::Output::zeroExt):
574         (JSC::FTL::Output::zeroExtPtr):
575         (JSC::FTL::Output::fpToInt):
576         (JSC::FTL::Output::fpToUInt):
577         (JSC::FTL::Output::fpToInt32):
578         (JSC::FTL::Output::baseIndex):
579         (JSC::FTL::Output::absolute):
580         (JSC::FTL::Output::load32NonNegative):
581         (JSC::FTL::Output::equal):
582         (JSC::FTL::Output::notEqual):
583         (JSC::FTL::Output::above):
584         (JSC::FTL::Output::lessThan):
585         (JSC::FTL::Output::lessThanOrEqual):
586         (JSC::FTL::Output::doubleEqual):
587         (JSC::FTL::Output::doubleNotEqualOrUnordered):
588         (JSC::FTL::Output::doubleLessThan):
589         (JSC::FTL::Output::icmp): Deleted.
590         (JSC::FTL::Output::fcmp): Deleted.
591         * ftl/FTLLowerDFGToLLVM.cpp:
592         (JSC::FTL::DFG::LowerDFGToLLVM::compileCompareEq):
593         (JSC::FTL::DFG::LowerDFGToLLVM::compileCompareLess):
594         (JSC::FTL::DFG::LowerDFGToLLVM::compileCompareLessEq):
595         (JSC::FTL::DFG::LowerDFGToLLVM::compileCompareGreater):
596         (JSC::FTL::DFG::LowerDFGToLLVM::compileCompareGreaterEq):
597         (JSC::FTL::DFG::LowerDFGToLLVM::compileLogicalNot):
598         (JSC::FTL::DFG::LowerDFGToLLVM::baseIndex):
599         (JSC::FTL::DFG::LowerDFGToLLVM::compare):
600         (JSC::FTL::DFG::LowerDFGToLLVM::speculateTruthyObject):
601         (JSC::FTL::DFG::LowerDFGToLLVM::nonSpeculativeCompare):
602
603 2015-11-19  Benjamin Poulain  <bpoulain@apple.com>
604
605         [JSC] When the iterated allocator is forced to spill, nuke the Moves that were already proven to be useless
606         https://bugs.webkit.org/show_bug.cgi?id=151461
607
608         Reviewed by Filip Pizlo.
609
610         Previously, when we had to spill, we were just inserting new Spill() and Fill()
611         in code while everything else remained identical.
612
613         Coalescing moves is a big part of the algorithm and takes a non-trivial time.
614         Since we were never removing Moves until reaching a successful coloring, we were
615         paying that cost with every single iteration.
616
617         With this patch, I keep a copy of the coalescing aliases when we make the first
618         potential spill decision. Before doing that, we have only simplified and coalesced
619         vertices that are provably colorable regardless of the other vertices' colors
620         (because their degree is <K, potentially after other edges were removed by simplification).
621
622         If we end up actually spilling, I use the old aliases to simplify the blocks if possible.
623
624         This is a 5% progression on "testComplex(64, 384)".
625
626         * b3/air/AirIteratedRegisterCoalescing.cpp:
627         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::getAliasWhenSpilling):
628         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::coalesce):
629         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::selectSpill):
630         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::assignColors):
631         (JSC::B3::Air::addSpillAndFillToProgram):
632         (JSC::B3::Air::iteratedRegisterCoalescingOnType):
633         (JSC::B3::Air::iteratedRegisterCoalescing):
634
635 2015-11-19  Filip Pizlo  <fpizlo@apple.com>
636
637         Fix FTL->B3 lowering of Phi
638         https://bugs.webkit.org/show_bug.cgi?id=151460
639
640         Reviewed by Geoffrey Garen.
641
642         * ftl/FTLLowerDFGToLLVM.cpp:
643         (JSC::FTL::DFG::LowerDFGToLLVM::compilePhi):
644
645 2015-11-19  Filip Pizlo  <fpizlo@apple.com>
646
647         FTL->B3 lowering should support lazy slow paths, patchpoints, all integer comparisons, and more load/stores
648         https://bugs.webkit.org/show_bug.cgi?id=151459
649
650         Reviewed by Benjamin Poulain.
651
652         * ftl/FTLB3Output.h:
653         (JSC::FTL::Output::absolute):
654         (JSC::FTL::Output::load8SignExt32):
655         (JSC::FTL::Output::load8ZeroExt32):
656         (JSC::FTL::Output::load16SignExt32):
657         (JSC::FTL::Output::load16ZeroExt32):
658         (JSC::FTL::Output::load32):
659         (JSC::FTL::Output::load64):
660         (JSC::FTL::Output::loadPtr):
661         (JSC::FTL::Output::loadDouble):
662         (JSC::FTL::Output::store32):
663         (JSC::FTL::Output::store64):
664         (JSC::FTL::Output::storePtr):
665         (JSC::FTL::Output::storeDouble):
666         (JSC::FTL::Output::ascribeRange):
667         (JSC::FTL::Output::nonNegative32):
668         (JSC::FTL::Output::load32NonNegative):
669         (JSC::FTL::Output::icmp):
670         (JSC::FTL::Output::equal):
671         (JSC::FTL::Output::notEqual):
672         (JSC::FTL::Output::above):
673         (JSC::FTL::Output::aboveOrEqual):
674         (JSC::FTL::Output::below):
675         (JSC::FTL::Output::belowOrEqual):
676         (JSC::FTL::Output::greaterThan):
677         (JSC::FTL::Output::greaterThanOrEqual):
678         (JSC::FTL::Output::lessThan):
679         (JSC::FTL::Output::lessThanOrEqual):
680         (JSC::FTL::Output::fcmp):
681         (JSC::FTL::Output::doubleEqual):
682         (JSC::FTL::Output::speculateMul):
683         (JSC::FTL::Output::patchpoint):
684         (JSC::FTL::Output::trap):
685         (JSC::FTL::Output::anchor):
686         * ftl/FTLLowerDFGToLLVM.cpp:
687         (JSC::FTL::DFG::LowerDFGToLLVM::lazySlowPath):
688
689 2015-11-19  Filip Pizlo  <fpizlo@apple.com>
690
691         FTL->B3 lowering should support absolute(), double comparisons, and intToDouble()
692         https://bugs.webkit.org/show_bug.cgi?id=151457
693
694         Reviewed by Benjamin Poulain.
695
696         * ftl/FTLB3Output.h:
697         (JSC::FTL::Output::fpToInt32):
698         (JSC::FTL::Output::fpToUInt32):
699         (JSC::FTL::Output::intToFP):
700         (JSC::FTL::Output::intToDouble):
701         (JSC::FTL::Output::unsignedToFP):
702         (JSC::FTL::Output::unsignedToDouble):
703         (JSC::FTL::Output::intCast):
704         (JSC::FTL::Output::baseIndex):
705         (JSC::FTL::Output::absolute):
706         (JSC::FTL::Output::load8SignExt32):
707         (JSC::FTL::Output::load8ZeroExt32):
708         (JSC::FTL::Output::lessThanOrEqual):
709         (JSC::FTL::Output::fcmp):
710         (JSC::FTL::Output::doubleEqual):
711         (JSC::FTL::Output::doubleNotEqualOrUnordered):
712         (JSC::FTL::Output::doubleLessThan):
713         (JSC::FTL::Output::doubleLessThanOrEqual):
714         (JSC::FTL::Output::doubleGreaterThan):
715         (JSC::FTL::Output::doubleGreaterThanOrEqual):
716         (JSC::FTL::Output::doubleEqualOrUnordered):
717         (JSC::FTL::Output::doubleNotEqual):
718         (JSC::FTL::Output::doubleLessThanOrUnordered):
719         (JSC::FTL::Output::doubleLessThanOrEqualOrUnordered):
720         (JSC::FTL::Output::doubleGreaterThanOrUnordered):
721         (JSC::FTL::Output::doubleGreaterThanOrEqualOrUnordered):
722         (JSC::FTL::Output::isZero32):
723         (JSC::FTL::Output::notZero32):
724
725 2015-11-19  Filip Pizlo  <fpizlo@apple.com>
726
727         FTL->B3 lowering should support checked int math
728         https://bugs.webkit.org/show_bug.cgi?id=151451
729
730         Reviewed by Saam Barati.
731
732         Adds lowering of ArithAdd/Sub/Mul to CheckAdd/Sub/Mul. Includes a nice refactoring of the OSR exit
733         code that made this a lot easier. Also needed to implement a few other ops in FTL::Output.
734
735         I ended up renaming "check" to "speculate" in FTL::Output, because it already had a thing called
736         "check". The FTL terminology for side-exit is "speculate", so I think that this is appropriate.
737
738         * ftl/FTLB3Output.h:
739         (JSC::FTL::Output::sensibleDoubleToInt):
740         (JSC::FTL::Output::signExt):
741         (JSC::FTL::Output::zeroExt):
742         (JSC::FTL::Output::zeroExtPtr):
743         (JSC::FTL::Output::fpToInt):
744         (JSC::FTL::Output::fpToUInt):
745         (JSC::FTL::Output::unsignedToFP):
746         (JSC::FTL::Output::unsignedToDouble):
747         (JSC::FTL::Output::intCast):
748         (JSC::FTL::Output::castToInt32):
749         (JSC::FTL::Output::fpCast):
750         (JSC::FTL::Output::intToPtr):
751         (JSC::FTL::Output::ptrToInt):
752         (JSC::FTL::Output::unreachable):
753         (JSC::FTL::Output::speculate):
754         (JSC::FTL::Output::speculateAdd):
755         (JSC::FTL::Output::speculateSub):
756         (JSC::FTL::Output::speculateMul):
757         (JSC::FTL::Output::trap):
758         (JSC::FTL::Output::check): Deleted.
759         * ftl/FTLJITFinalizer.cpp:
760         (JSC::FTL::JITFinalizer::finalizeFunction):
761         * ftl/FTLLowerDFGToLLVM.cpp:
762         (JSC::FTL::DFG::LowerDFGToLLVM::compileArithAddOrSub):
763         (JSC::FTL::DFG::LowerDFGToLLVM::compileArithMul):
764         (JSC::FTL::DFG::LowerDFGToLLVM::compileInvalidationPoint):
765         (JSC::FTL::DFG::LowerDFGToLLVM::appendOSRExitArgumentsForPatchpointIfWillCatchException):
766         (JSC::FTL::DFG::LowerDFGToLLVM::appendOSRExit):
767         (JSC::FTL::DFG::LowerDFGToLLVM::blessSpeculation):
768         (JSC::FTL::DFG::LowerDFGToLLVM::emitOSRExitCall):
769         (JSC::FTL::DFG::LowerDFGToLLVM::buildExitArguments):
770
771 2015-11-19  Mark Lam  <mark.lam@apple.com>
772
773         JIT snippet generator JumpLists should be returned as references.
774         https://bugs.webkit.org/show_bug.cgi?id=151445
775
776         Reviewed by Gavin Barraclough.
777
778         The JumpLists were being returned by value.  As a result, new jumps added to
779         them in the client are actually added to a temporary copy and promptly discarded.
780         Those jumps never get linked, resulting in infinite loops in DFG generated code
781         that used the snippets.
782
783         * jit/JITAddGenerator.h:
784         (JSC::JITAddGenerator::endJumpList):
785         (JSC::JITAddGenerator::slowPathJumpList):
786         * jit/JITMulGenerator.h:
787         (JSC::JITMulGenerator::endJumpList):
788         (JSC::JITMulGenerator::slowPathJumpList):
789         * jit/JITSubGenerator.h:
790         (JSC::JITSubGenerator::endJumpList):
791         (JSC::JITSubGenerator::slowPathJumpList):
792
793 2015-11-19  Csaba Osztrogonác  <ossy@webkit.org>
794
795         Unreviewed CLOOP buildfix after r192624.
796
797         * runtime/MemoryStatistics.cpp:
798         (JSC::globalMemoryStatistics):
799         * runtime/MemoryStatistics.h:
800
801 2015-11-19  Csaba Osztrogonác  <ossy@webkit.org>
802
803         Remove unused LLVM API functions
804         https://bugs.webkit.org/show_bug.cgi?id=151184
805
806         Reviewed by Filip Pizlo.
807
808         * ftl/FTLAbbreviations.h:
809         (JSC::FTL::typeOf): Deleted.
810         (JSC::FTL::getElementType): Deleted.
811         (JSC::FTL::getNamedFunction): Deleted.
812         (JSC::FTL::removeFunctionAttr): Deleted.
813         (JSC::FTL::getLinkage): Deleted.
814         (JSC::FTL::setVisibility): Deleted.
815         (JSC::FTL::isDeclaration): Deleted.
816         (JSC::FTL::linkModules): Deleted.
817         (JSC::FTL::getValueName): Deleted.
818         (JSC::FTL::getNamedGlobal): Deleted.
819         (JSC::FTL::getFirstGlobal): Deleted.
820         (JSC::FTL::getNextGlobal): Deleted.
821         (JSC::FTL::createMemoryBufferWithContentsOfFile): Deleted.
822         (JSC::FTL::parseBitcodeInContext): Deleted.
823         (JSC::FTL::disposeMemoryBuffer): Deleted.
824         (JSC::FTL::getParamTypes): Deleted.
825         (JSC::FTL::constIntToPtr): Deleted.
826         (JSC::FTL::constBitCast): Deleted.
827         * llvm/LLVMAPIFunctions.h:
828
829 2015-11-19  Gyuyoung Kim  <gyuyoung.kim@webkit.org>
830
831         Remove unnecessary PLATFORM(EFL) macro in globalMemoryStatistics()
832         https://bugs.webkit.org/show_bug.cgi?id=151301
833
834         Reviewed by Csaba Osztrogonác.
835
836         EXECUTABLE_ALLOCATOR_FIXED is enabled on EFL port. So we don't need to keep
837         PLATFORM(EFL) macro anymore. Besides ENABLE(EXECUTABLE_ALLOCATOR_FIXED) guard
838         isn't related with ExecutableAllocator::committedByteCount() closely. So this patch
839         removes it as well.
840
841         * runtime/MemoryStatistics.cpp:
842         (JSC::globalMemoryStatistics):
843
844 2015-11-19  Benjamin Poulain  <bpoulain@apple.com>
845
846         [JSC] Add bitwise Double-Int conversion to B3
847         https://bugs.webkit.org/show_bug.cgi?id=151432
848
849         Reviewed by Filip Pizlo.
850
851         This is needed for boxing/unboxing doubles.
852
853         * b3/B3Const64Value.cpp:
854         (JSC::B3::Const64Value::bitwiseCastConstant):
855         * b3/B3Const64Value.h:
856         * b3/B3ConstDoubleValue.cpp:
857         (JSC::B3::ConstDoubleValue::bitwiseCastConstant):
858         * b3/B3ConstDoubleValue.h:
859         * b3/B3LowerToAir.cpp:
860         (JSC::B3::Air::LowerToAir::lower):
861         * b3/B3Opcode.cpp:
862         (WTF::printInternal):
863         * b3/B3Opcode.h:
864         * b3/B3ReduceStrength.cpp:
865         * b3/B3Validate.cpp:
866         * b3/B3Value.cpp:
867         (JSC::B3::Value::bitwiseCastConstant):
868         (JSC::B3::Value::effects):
869         (JSC::B3::Value::typeFor):
870         * b3/B3Value.h:
871         * b3/air/AirOpcode.opcodes:
872         * b3/testb3.cpp:
873         (JSC::B3::testDoubleArgToInt64BitwiseCast):
874         (JSC::B3::testDoubleImmToInt64BitwiseCast):
875         (JSC::B3::testTwoBitwiseCastOnDouble):
876         (JSC::B3::testBitwiseCastOnDoubleInMemory):
877         (JSC::B3::testInt64BArgToDoubleBitwiseCast):
878         (JSC::B3::testInt64BImmToDoubleBitwiseCast):
879         (JSC::B3::testTwoBitwiseCastOnInt64):
880         (JSC::B3::testBitwiseCastOnInt64InMemory):
881         (JSC::B3::int64Operands):
882         (JSC::B3::run):
883         * ftl/FTLB3Output.h:
884         (JSC::FTL::Output::bitCast):
885
886 2015-11-18  Benjamin Poulain  <bpoulain@apple.com>
887
888         [JSC] Add some missing load/store to FTLB3Output
889         https://bugs.webkit.org/show_bug.cgi?id=151427
890
891         Reviewed by Filip Pizlo.
892
893         * ftl/FTLB3Output.cpp:
894         (JSC::FTL::Output::load8SignExt32):
895         (JSC::FTL::Output::load8ZeroExt32):
896         (JSC::FTL::Output::load16SignExt32):
897         (JSC::FTL::Output::load16ZeroExt32):
898         (JSC::FTL::Output::loadFloatToDouble):
899         * ftl/FTLB3Output.h:
900         (JSC::FTL::Output::load32):
901         (JSC::FTL::Output::loadPtr):
902         (JSC::FTL::Output::loadDouble):
903         (JSC::FTL::Output::load8SignExt32): Deleted.
904         (JSC::FTL::Output::load8ZeroExt32): Deleted.
905         (JSC::FTL::Output::load16SignExt32): Deleted.
906         (JSC::FTL::Output::load16ZeroExt32): Deleted.
907         (JSC::FTL::Output::loadFloatToDouble): Deleted.
908
909 2015-11-18  Benjamin Poulain  <benjamin@webkit.org>
910
911         Fix typos in r192605
912
913         * ftl/FTLLowerDFGToLLVM.cpp:
914         (JSC::FTL::DFG::LowerDFGToLLVM::compileUpsilon):
915
916 2015-11-18  Filip Pizlo  <fpizlo@apple.com> and Benjamin Poulain  <bpoulain@apple.com>
917
918         FTL should be able to compile a small function with B3
919         https://bugs.webkit.org/show_bug.cgi?id=151423
920
921         Reviewed by Filip Pizlo.
922
923         * b3/B3LowerToAir.cpp:
924         (JSC::B3::Air::LowerToAir::lower):
925         * dfg/DFGPlan.cpp:
926         (JSC::DFG::Plan::compileInThreadImpl):
927         * ftl/FTLAbbreviatedTypes.h:
928         * ftl/FTLB3Output.cpp:
929         (JSC::FTL::Output::Output):
930         (JSC::FTL::Output::~Output):
931         (JSC::FTL::Output::initialize):
932         (JSC::FTL::Output::appendTo):
933         (JSC::FTL::Output::lockedStackSlot):
934         (JSC::FTL::Output::load):
935         (JSC::FTL::Output::store):
936         (JSC::FTL::Output::branch):
937         * ftl/FTLB3Output.h:
938         (JSC::FTL::Output::newBlock):
939         (JSC::FTL::Output::setOrigin):
940         (JSC::FTL::Output::origin):
941         (JSC::FTL::Output::framePointer):
942         (JSC::FTL::Output::constBool):
943         (JSC::FTL::Output::constInt32):
944         (JSC::FTL::Output::constIntPtr):
945         (JSC::FTL::Output::constInt64):
946         (JSC::FTL::Output::constDouble):
947         (JSC::FTL::Output::upsilon):
948         (JSC::FTL::Output::phi):
949         (JSC::FTL::Output::add):
950         (JSC::FTL::Output::sub):
951         (JSC::FTL::Output::mul):
952         (JSC::FTL::Output::neg):
953         (JSC::FTL::Output::doubleAdd):
954         (JSC::FTL::Output::doubleSub):
955         (JSC::FTL::Output::doubleMul):
956         (JSC::FTL::Output::doubleDiv):
957         (JSC::FTL::Output::doubleNeg):
958         (JSC::FTL::Output::bitAnd):
959         (JSC::FTL::Output::bitOr):
960         (JSC::FTL::Output::bitXor):
961         (JSC::FTL::Output::shl):
962         (JSC::FTL::Output::aShr):
963         (JSC::FTL::Output::lShr):
964         (JSC::FTL::Output::load64):
965         (JSC::FTL::Output::store32):
966         (JSC::FTL::Output::store64):
967         (JSC::FTL::Output::storePtr):
968         (JSC::FTL::Output::storeDouble):
969         (JSC::FTL::Output::addPtr):
970         (JSC::FTL::Output::address):
971         (JSC::FTL::Output::below):
972         (JSC::FTL::Output::isZero32):
973         (JSC::FTL::Output::notZero32):
974         (JSC::FTL::Output::isZero64):
975         (JSC::FTL::Output::notZero64):
976         (JSC::FTL::Output::isNull):
977         (JSC::FTL::Output::notNull):
978         (JSC::FTL::Output::testIsZero32):
979         (JSC::FTL::Output::testNonZero32):
980         (JSC::FTL::Output::testIsZero64):
981         (JSC::FTL::Output::testNonZero64):
982         (JSC::FTL::Output::testIsZeroPtr):
983         (JSC::FTL::Output::testNonZeroPtr):
984         (JSC::FTL::Output::call):
985         (JSC::FTL::Output::operation):
986         (JSC::FTL::Output::jump):
987         (JSC::FTL::Output::branch):
988         (JSC::FTL::Output::ret):
989         (JSC::FTL::Output::unreachable):
990         (JSC::FTL::Output::check):
991         (JSC::FTL::Output::anchor):
992         (JSC::FTL::Output::addIncomingToPhi):
993         (JSC::FTL::Output::~Output): Deleted.
994         (JSC::FTL::Output::appendTo): Deleted.
995         (JSC::FTL::Output::param): Deleted.
996         (JSC::FTL::Output::load): Deleted.
997         (JSC::FTL::Output::store): Deleted.
998         (JSC::FTL::Output::store16): Deleted.
999         * ftl/FTLCommonValues.cpp:
1000         (JSC::FTL::CommonValues::CommonValues):
1001         (JSC::FTL::CommonValues::initializeConstants):
1002         * ftl/FTLCommonValues.h:
1003         * ftl/FTLJITFinalizer.cpp:
1004         (JSC::FTL::JITFinalizer::finalizeFunction):
1005         * ftl/FTLLink.cpp:
1006         (JSC::FTL::link):
1007         * ftl/FTLLowerDFGToLLVM.cpp:
1008         (JSC::FTL::DFG::LowerDFGToLLVM::LowerDFGToLLVM):
1009         (JSC::FTL::DFG::LowerDFGToLLVM::lower):
1010         (JSC::FTL::DFG::LowerDFGToLLVM::createPhiVariables):
1011         (JSC::FTL::DFG::LowerDFGToLLVM::compileBlock):
1012         (JSC::FTL::DFG::LowerDFGToLLVM::safelyInvalidateAfterTermination):
1013         (JSC::FTL::DFG::LowerDFGToLLVM::compileNode):
1014         (JSC::FTL::DFG::LowerDFGToLLVM::compileUpsilon):
1015         (JSC::FTL::DFG::LowerDFGToLLVM::compilePhi):
1016         (JSC::FTL::DFG::LowerDFGToLLVM::compileToThis):
1017         (JSC::FTL::DFG::LowerDFGToLLVM::compileValueAdd):
1018         (JSC::FTL::DFG::LowerDFGToLLVM::compileStrCat):
1019         (JSC::FTL::DFG::LowerDFGToLLVM::compileArithAddOrSub):
1020         (JSC::FTL::DFG::LowerDFGToLLVM::compileArrayifyToStructure):
1021         (JSC::FTL::DFG::LowerDFGToLLVM::compileGetById):
1022         (JSC::FTL::DFG::LowerDFGToLLVM::compilePutById):
1023         (JSC::FTL::DFG::LowerDFGToLLVM::compileGetIndexedPropertyStorage):
1024         (JSC::FTL::DFG::LowerDFGToLLVM::compileGetByVal):
1025         (JSC::FTL::DFG::LowerDFGToLLVM::compilePutByVal):
1026         (JSC::FTL::DFG::LowerDFGToLLVM::compilePutAccessorById):
1027         (JSC::FTL::DFG::LowerDFGToLLVM::compilePutGetterSetterById):
1028         (JSC::FTL::DFG::LowerDFGToLLVM::compilePutAccessorByVal):
1029         (JSC::FTL::DFG::LowerDFGToLLVM::compileArrayPush):
1030         (JSC::FTL::DFG::LowerDFGToLLVM::compileArrayPop):
1031         (JSC::FTL::DFG::LowerDFGToLLVM::compileCreateActivation):
1032         (JSC::FTL::DFG::LowerDFGToLLVM::compileNewFunction):
1033         (JSC::FTL::DFG::LowerDFGToLLVM::compileCreateScopedArguments):
1034         (JSC::FTL::DFG::LowerDFGToLLVM::compileCreateClonedArguments):
1035         (JSC::FTL::DFG::LowerDFGToLLVM::compileNewArray):
1036         (JSC::FTL::DFG::LowerDFGToLLVM::compileNewArrayBuffer):
1037         (JSC::FTL::DFG::LowerDFGToLLVM::compileNewArrayWithSize):
1038         (JSC::FTL::DFG::LowerDFGToLLVM::compileToStringOrCallStringConstructor):
1039         (JSC::FTL::DFG::LowerDFGToLLVM::compileToPrimitive):
1040         (JSC::FTL::DFG::LowerDFGToLLVM::compileStringCharAt):
1041         (JSC::FTL::DFG::LowerDFGToLLVM::compileCallOrConstruct):
1042         (JSC::FTL::DFG::LowerDFGToLLVM::compileTailCall):
1043         (JSC::FTL::DFG::LowerDFGToLLVM::compileCallOrConstructVarargs):
1044         (JSC::FTL::DFG::LowerDFGToLLVM::compileLoadVarargs):
1045         (JSC::FTL::DFG::LowerDFGToLLVM::compileSwitch):
1046         (JSC::FTL::DFG::LowerDFGToLLVM::compileInvalidationPoint):
1047         (JSC::FTL::DFG::LowerDFGToLLVM::compileIn):
1048         (JSC::FTL::DFG::LowerDFGToLLVM::compileHasIndexedProperty):
1049         (JSC::FTL::DFG::LowerDFGToLLVM::compileHasGenericProperty):
1050         (JSC::FTL::DFG::LowerDFGToLLVM::compileHasStructureProperty):
1051         (JSC::FTL::DFG::LowerDFGToLLVM::compileGetDirectPname):
1052         (JSC::FTL::DFG::LowerDFGToLLVM::compileGetPropertyEnumerator):
1053         (JSC::FTL::DFG::LowerDFGToLLVM::compileToIndexString):
1054         (JSC::FTL::DFG::LowerDFGToLLVM::didOverflowStack):
1055         (JSC::FTL::DFG::LowerDFGToLLVM::allocatePropertyStorage):
1056         (JSC::FTL::DFG::LowerDFGToLLVM::reallocatePropertyStorage):
1057         (JSC::FTL::DFG::LowerDFGToLLVM::getById):
1058         (JSC::FTL::DFG::LowerDFGToLLVM::nonSpeculativeCompare):
1059         (JSC::FTL::DFG::LowerDFGToLLVM::contiguousPutByValOutOfBounds):
1060         (JSC::FTL::DFG::LowerDFGToLLVM::switchStringSlow):
1061         (JSC::FTL::DFG::LowerDFGToLLVM::doubleToInt32):
1062         (JSC::FTL::DFG::LowerDFGToLLVM::sensibleDoubleToInt32):
1063         (JSC::FTL::DFG::LowerDFGToLLVM::lazySlowPath):
1064         (JSC::FTL::DFG::LowerDFGToLLVM::jsValueToStrictInt52):
1065         (JSC::FTL::DFG::LowerDFGToLLVM::doubleToStrictInt52):
1066         (JSC::FTL::DFG::LowerDFGToLLVM::vmCall):
1067         (JSC::FTL::DFG::LowerDFGToLLVM::callCheck):
1068         (JSC::FTL::DFG::LowerDFGToLLVM::lowBlock):
1069         (JSC::FTL::DFG::LowerDFGToLLVM::appendOSRExit):
1070         (JSC::FTL::DFG::LowerDFGToLLVM::callStackmap):
1071         (JSC::FTL::DFG::LowerDFGToLLVM::probe):
1072         (JSC::FTL::DFG::LowerDFGToLLVM::crash):
1073         (JSC::FTL::lowerDFGToLLVM):
1074         (JSC::FTL::DFG::LowerDFGToLLVM::vmCallNoExceptions): Deleted.
1075         * ftl/FTLOutput.cpp:
1076         (JSC::FTL::Output::sensibleDoubleToInt):
1077         * ftl/FTLOutput.h:
1078         (JSC::FTL::Output::ceil64):
1079         (JSC::FTL::Output::ctlz32):
1080         (JSC::FTL::Output::addWithOverflow32):
1081         (JSC::FTL::Output::subWithOverflow32):
1082         (JSC::FTL::Output::mulWithOverflow32):
1083         (JSC::FTL::Output::addWithOverflow64):
1084         (JSC::FTL::Output::subWithOverflow64):
1085         (JSC::FTL::Output::mulWithOverflow64):
1086         (JSC::FTL::Output::doubleAbs):
1087         (JSC::FTL::Output::doubleSin):
1088         (JSC::FTL::Output::doubleCos):
1089         (JSC::FTL::Output::doublePow):
1090         (JSC::FTL::Output::doublePowi):
1091         (JSC::FTL::Output::doubleSqrt):
1092         (JSC::FTL::Output::doubleLog):
1093         (JSC::FTL::Output::call):
1094         (JSC::FTL::Output::trap):
1095         * ftl/FTLState.cpp:
1096         (JSC::FTL::State::State): Deleted.
1097         * ftl/FTLState.h:
1098         * ftl/FTLWeight.h:
1099         (JSC::FTL::Weight::frequencyClass):
1100
1101 2015-11-18  Saam barati  <sbarati@apple.com>
1102
1103         There is a bug when default parameter values are mixed with destructuring parameter values
1104         https://bugs.webkit.org/show_bug.cgi?id=151369
1105
1106         Reviewed by Geoffrey Garen and Mark Lam.
1107
1108         Relanding this after a rollout.
1109
1110         This patch changes our parser to no longer declare destructuring
1111         parameters as "var"s. This is a weird bug that just happened
1112         to work in a world without default parameter values. In a world with
1113         default parameter values this is just completely wrong. It would
1114         incorrectly transform this program:
1115         ```function foo(a = function() { b = 40; }, {b}) { a(); return b; }; foo(undefined, {b: 42}); // Should return 40```
1116         into
1117         ```function foo(a = function() { b = 40; }, {b}) { var b; a(); return b; }; foo(undefined, {b:42}); // Returns 42, not 40.```
1118         Which is wrong because we end up with two distinct bindings of "b" when
1119         there should only be one.
1120
1121         * parser/Parser.cpp:
1122         (JSC::Parser<LexerType>::parseVariableDeclarationList):
1123         (JSC::Parser<LexerType>::createBindingPattern):
1124         (JSC::Parser<LexerType>::parseDestructuringPattern):
1125         * parser/Parser.h:
1126         (JSC::Scope::declareParameter):
1127         (JSC::Scope::getUsedVariables):
1128         (JSC::Parser::strictMode):
1129         (JSC::Parser::isValidStrictMode):
1130         (JSC::Parser::declareParameter):
1131         (JSC::Parser::breakIsValid):
1132         (JSC::Scope::declareBoundParameter): Deleted.
1133         (JSC::Parser::declareBoundParameter): Deleted.
1134         * tests/stress/es6-default-parameters.js:
1135
1136 2015-11-18  Mark Lam  <mark.lam@apple.com>
1137
1138         Snippefy op_mul for the baseline JIT.
1139         https://bugs.webkit.org/show_bug.cgi?id=151393
1140
1141         Reviewed by Geoffrey Garen.
1142
1143         Benchmarks shows that perf is neutral on x86 and x86_64 with the DFG enabled.
1144
1145         With the DFG disabled (relying on the baseline JIT for perf), LongSpider
1146         3d-morph shows a 7.6% regression.  However, there are other benchmarks that shows
1147         a progression e.g. on Kraken, audio-beat-detection and audio-fft.
1148
1149         Upon inspection of the generated code for 3d-morph, the only differences is the
1150         added use of a scratch register for the result as well as a jump around the
1151         code that handles double types.  It does not look like we're generating bad code.
1152         I'll consider the perf acceptable in aggregate.
1153
1154         * CMakeLists.txt:
1155         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
1156         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
1157         * JavaScriptCore.xcodeproj/project.pbxproj:
1158
1159         * bytecode/PolymorphicAccess.cpp:
1160         (JSC::AccessCase::generate):
1161         * jit/AssemblyHelpers.h:
1162         (JSC::AssemblyHelpers::boxInt32):
1163         * jit/IntrinsicEmitter.cpp:
1164         (JSC::AccessCase::emitIntrinsicGetter):
1165         - Changed AssemblyHelpers::boxInt32() to take a TagRegistersMode.
1166           The pre-existing boxInt32() always assume that the tag registers are not
1167           available.  Since we should assume we have tag registers by default, I also
1168           changed all the other clients to explicitly specify a more of
1169           DoNotHaveTagRegisters.  That is except for the snippet generators that do have
1170           the tag registers.
1171
1172         * jit/JIT.h:
1173         * jit/JITArithmetic.cpp:
1174         (JSC::JIT::compileBinaryArithOpSlowCase):
1175         (JSC::JIT::emit_op_div):
1176         (JSC::JIT::emitSlow_op_add):
1177         (JSC::JIT::emit_op_mul):
1178         (JSC::JIT::emitSlow_op_mul):
1179         (JSC::JIT::emit_op_sub):
1180         (JSC::JIT::compileBinaryArithOp): Deleted.
1181         * jit/JITArithmetic32_64.cpp:
1182         (JSC::JIT::emitBinaryDoubleOp):
1183         (JSC::JIT::emit_op_div):
1184         (JSC::JIT::emit_op_mul): Deleted.
1185         (JSC::JIT::emitSlow_op_mul): Deleted.
1186         * jit/JITMulGenerator.cpp: Added.
1187         (JSC::JITMulGenerator::generateFastPath):
1188         * jit/JITMulGenerator.h: Added.
1189         (JSC::JITMulGenerator::JITMulGenerator):
1190         (JSC::JITMulGenerator::didEmitFastPath):
1191         (JSC::JITMulGenerator::endJumpList):
1192         (JSC::JITMulGenerator::slowPathJumpList):
1193
1194         * tests/stress/op_mul.js: Added.
1195         (o1.valueOf):
1196         (generateScenarios):
1197         (printScenarios):
1198         (testCases.func):
1199         (func):
1200         (initializeTestCases):
1201         (stringifyIfNeeded):
1202         (isIdentical):
1203         (runTest):
1204         - Tests that JIT op_mul results are equivalent to the expected values as
1205           defined by the LLINT.
1206
1207 2015-11-18  Mark Lam  <mark.lam@apple.com>
1208
1209         Remove some unnecessary jumps in snippet code.
1210         https://bugs.webkit.org/show_bug.cgi?id=151415
1211
1212         Reviewed by Geoffrey Garen.
1213
1214         Previously, the snippet generators always emit a jump at the end of the fast
1215         path.  In the baseline JIT and FTL, this results in a jump to the very next
1216         instruction.  I've change it to assume that the fast path will just fall thru,
1217         and let the client decide instead if it wants/needs a jump or not after the fast
1218         path.
1219
1220         I also changed the generators to provide a didEmitFastPath() query explicitly
1221         declare if they actually generated the fast path, instead of having the client
1222         infer it from an empty endJumpList.
1223
1224         Benchmarks show that perf is neutral with this change (tested on x86_64).
1225
1226         * dfg/DFGSpeculativeJIT.cpp:
1227         (JSC::DFG::SpeculativeJIT::compileValueAdd):
1228         (JSC::DFG::SpeculativeJIT::compileArithSub):
1229         * ftl/FTLCompile.cpp:
1230         (JSC::FTL::mmAllocateDataSection):
1231         * jit/JITAddGenerator.cpp:
1232         (JSC::JITAddGenerator::generateFastPath):
1233         * jit/JITAddGenerator.h:
1234         (JSC::JITAddGenerator::didEmitFastPath):
1235         (JSC::JITAddGenerator::endJumpList):
1236         (JSC::JITAddGenerator::slowPathJumpList):
1237         * jit/JITArithmetic.cpp:
1238         (JSC::JIT::emit_op_add):
1239         (JSC::JIT::emit_op_sub):
1240         * jit/JITSubGenerator.cpp:
1241         (JSC::JITSubGenerator::generateFastPath):
1242         * jit/JITSubGenerator.h:
1243         (JSC::JITSubGenerator::didEmitFastPath):
1244         (JSC::JITSubGenerator::endJumpList):
1245         (JSC::JITSubGenerator::slowPathJumpList):
1246
1247 2015-11-18  Commit Queue  <commit-queue@webkit.org>
1248
1249         Unreviewed, rolling out r192436 and r192586.
1250         https://bugs.webkit.org/show_bug.cgi?id=151417
1251
1252         Caused a hang in the inspector and a crash @ google.com.
1253         (Requested by saamyjoon on #webkit).
1254
1255         Reverted changesets:
1256
1257         "Allow any LeftHandSideExpression as a valid
1258         AssignmentElement"
1259         https://bugs.webkit.org/show_bug.cgi?id=151026
1260         http://trac.webkit.org/changeset/192436
1261
1262         "There is a bug when default parameter values are mixed with
1263         destructuring parameter values"
1264         https://bugs.webkit.org/show_bug.cgi?id=151369
1265         http://trac.webkit.org/changeset/192586
1266
1267 2015-11-17  Keith Miller  <keith_miller@apple.com>
1268
1269         [JSC] TailCalls should not trigger assertion failures when running with the jsc profiler on.
1270         https://bugs.webkit.org/show_bug.cgi?id=151359
1271
1272         Reviewed by Geoffrey Garen.
1273
1274         If we have the profiler on when parsing tail calls in the dfg we would emit a CountExecutions node
1275         following a TailCall node as our bytecode for tail calls always emits a op_ret following an op_tail_call.
1276         This trips assertions that no nodes follow a terminal in a basic block. This patch fixes this issue by
1277         not emiting a CountExecutions when we have a tail call that is terminal i.e. the tail caller is not
1278         inlined into another function or the tail caller is inlined but is in tail position itself.
1279
1280         * dfg/DFGByteCodeParser.cpp:
1281         (JSC::DFG::ByteCodeParser::handleCall):
1282         (JSC::DFG::ByteCodeParser::handleVarargsCall):
1283         (JSC::DFG::ByteCodeParser::parseBlock):
1284         * tests/stress/tail-call-profiler.js: Added.
1285         (tail):
1286         (inlineTail):
1287         (inlineTailVarArgs):
1288         (inlineTailTernary):
1289         (body):
1290
1291 2015-11-18  Benjamin Poulain  <bpoulain@apple.com>
1292
1293         [JSC] Make LBasicBlock into an alias for B3::BasicBlock. #ifdef anything that does not compile
1294         https://bugs.webkit.org/show_bug.cgi?id=151381
1295
1296         Reviewed by Filip Pizlo.
1297
1298         * JavaScriptCore.xcodeproj/project.pbxproj:
1299         * ftl/FTLAbbreviatedTypes.h:
1300         * ftl/FTLAbbreviations.h:
1301         * ftl/FTLAbstractHeap.cpp:
1302         (JSC::FTL::AbstractHeap::decorateInstruction):
1303         (JSC::FTL::IndexedAbstractHeap::IndexedAbstractHeap):
1304         * ftl/FTLAbstractHeap.h:
1305         (JSC::FTL::AbstractHeap::AbstractHeap):
1306         * ftl/FTLAbstractHeapRepository.cpp:
1307         (JSC::FTL::AbstractHeapRepository::AbstractHeapRepository):
1308         * ftl/FTLAbstractHeapRepository.h:
1309         * ftl/FTLB3Output.h:
1310         (JSC::FTL::Output::newBlock):
1311         (JSC::FTL::Output::insertNewBlocksBefore):
1312         (JSC::FTL::Output::addIncomingToPhi):
1313         (JSC::FTL::Output::Output): Deleted.
1314         (JSC::FTL::Output::initialize): Deleted.
1315         * ftl/FTLCommonValues.cpp:
1316         (JSC::FTL::CommonValues::CommonValues):
1317         * ftl/FTLCommonValues.h:
1318         * ftl/FTLIntrinsicRepository.cpp:
1319         * ftl/FTLIntrinsicRepository.h:
1320         * ftl/FTLLowerDFGToLLVM.cpp:
1321         (JSC::FTL::DFG::LowerDFGToLLVM::LowerDFGToLLVM):
1322         (JSC::FTL::DFG::LowerDFGToLLVM::lower):
1323         (JSC::FTL::DFG::LowerDFGToLLVM::compileArithAddOrSub):
1324         (JSC::FTL::DFG::LowerDFGToLLVM::compilePutById):
1325         (JSC::FTL::DFG::LowerDFGToLLVM::compileCreateDirectArguments):
1326         (JSC::FTL::DFG::LowerDFGToLLVM::compileNewArrayWithSize):
1327         (JSC::FTL::DFG::LowerDFGToLLVM::compileCallOrConstruct):
1328         (JSC::FTL::DFG::LowerDFGToLLVM::compileTailCall):
1329         (JSC::FTL::DFG::LowerDFGToLLVM::compileCallOrConstructVarargs):
1330         (JSC::FTL::DFG::LowerDFGToLLVM::compileForwardVarargs):
1331         (JSC::FTL::DFG::LowerDFGToLLVM::compileIn):
1332         (JSC::FTL::DFG::LowerDFGToLLVM::compileInstanceOf):
1333         (JSC::FTL::DFG::LowerDFGToLLVM::getById):
1334         (JSC::FTL::DFG::LowerDFGToLLVM::allocateCell):
1335         (JSC::FTL::DFG::LowerDFGToLLVM::buildSwitch):
1336         (JSC::FTL::DFG::LowerDFGToLLVM::lazySlowPath):
1337         (JSC::FTL::DFG::LowerDFGToLLVM::crash):
1338         * ftl/FTLOutput.cpp:
1339         (JSC::FTL::Output::Output):
1340         * ftl/FTLOutput.h:
1341         (JSC::FTL::Output::addIncomingToPhi):
1342         * ftl/FTLState.cpp:
1343         (JSC::FTL::State::dumpState):
1344         * ftl/FTLValueRange.cpp:
1345         (JSC::FTL::ValueRange::decorateInstruction):
1346         * ftl/FTLValueRange.h:
1347         (JSC::FTL::ValueRange::ValueRange):
1348
1349 2015-11-18  Filip Pizlo  <fpizlo@apple.com>
1350
1351         Implement the B3 equivalent of FTLCompile
1352         https://bugs.webkit.org/show_bug.cgi?id=151370
1353
1354         Reviewed by Benjamin Poulain.
1355
1356         This adds a B3 version of FTLCompile and gets the data structures related to installing an FTL
1357         compilation (i.e. the finalizer and JITCode) to be aware of B3. That requires stubbing a lot of stuff
1358         out and also simplifying a lot of code around having everything inside a single contiguous chunk of
1359         JIT code rather than some opaque JIT code handles plus miscellaneous side-codes. This compiles but
1360         crashes because lowering isn't done yet.
1361
1362         * JavaScriptCore.xcodeproj/project.pbxproj:
1363         * b3/B3Procedure.cpp:
1364         (JSC::B3::Procedure::addDataSection):
1365         (JSC::B3::Procedure::calleeSaveRegisters):
1366         (JSC::B3::Procedure::addValueIndex):
1367         * b3/B3Procedure.h:
1368         (JSC::B3::Procedure::code):
1369         * ftl/FTLB3Compile.cpp: Added.
1370         (JSC::FTL::compile):
1371         * ftl/FTLCompile.cpp:
1372         (JSC::FTL::mmAllocateDataSection):
1373         * ftl/FTLExceptionHandlerManager.cpp:
1374         (JSC::FTL::ExceptionHandlerManager::callOperationExceptionTarget):
1375         (JSC::FTL::ExceptionHandlerManager::lazySlowPathExceptionTarget):
1376         (JSC::FTL::ExceptionHandlerManager::getByIdOSRExit):
1377         * ftl/FTLJITCode.cpp:
1378         (JSC::FTL::JITCode::~JITCode):
1379         (JSC::FTL::JITCode::initializeB3Code):
1380         (JSC::FTL::JITCode::initializeExitThunks):
1381         (JSC::FTL::JITCode::addDataSection):
1382         (JSC::FTL::JITCode::initializeAddressForCall):
1383         (JSC::FTL::JITCode::initializeArityCheckEntrypoint):
1384         (JSC::FTL::JITCode::addressForCall):
1385         (JSC::FTL::JITCode::contains):
1386         (JSC::FTL::JITCode::exitThunks):
1387         (JSC::FTL::JITCode::ftl):
1388         * ftl/FTLJITCode.h:
1389         (JSC::FTL::JITCode::b3Code):
1390         (JSC::FTL::JITCode::handles):
1391         (JSC::FTL::JITCode::dataSections):
1392         * ftl/FTLJITFinalizer.cpp:
1393         (JSC::FTL::JITFinalizer::codeSize):
1394         (JSC::FTL::JITFinalizer::finalizeFunction):
1395         * ftl/FTLJITFinalizer.h:
1396         * ftl/FTLLink.cpp:
1397         (JSC::FTL::link):
1398         * ftl/FTLOSRExit.cpp:
1399         (JSC::FTL::OSRExit::codeLocationForRepatch):
1400         (JSC::FTL::OSRExit::gatherRegistersToSpillForCallIfException):
1401
1402 2015-11-18  Saam barati  <sbarati@apple.com>
1403
1404         There is a bug when default parameter values are mixed with destructuring parameter values
1405         https://bugs.webkit.org/show_bug.cgi?id=151369
1406
1407         Reviewed by Geoffrey Garen and Mark Lam.
1408
1409         This patch changes our parser to no longer declare destructuring
1410         parameters as "var"s. This is a weird bug that just happened
1411         to work in a world without default parameter values. In a world with
1412         default parameter values this is just completely wrong. It would
1413         incorrectly transform this program:
1414         ```function foo(a = function() { b = 40; }, {b}) { a(); return b; }; foo(undefined, {b: 42}); // Should return 40```
1415         into
1416         ```function foo(a = function() { b = 40; }, {b}) { var b; a(); return b; }; foo(undefined, {b:42}); // Returns 42, not 40.```
1417         Which is wrong because we end up with two distinct bindings of "b" when
1418         there should only be one.
1419
1420         * parser/Parser.cpp:
1421         (JSC::Parser<LexerType>::parseVariableDeclarationList):
1422         (JSC::Parser<LexerType>::createBindingPattern):
1423         (JSC::Parser<LexerType>::parseDestructuringPattern):
1424         * parser/Parser.h:
1425         (JSC::Scope::declareParameter):
1426         (JSC::Scope::getUsedVariables):
1427         (JSC::Parser::strictMode):
1428         (JSC::Parser::isValidStrictMode):
1429         (JSC::Parser::declareParameter):
1430         (JSC::Parser::breakIsValid):
1431         (JSC::Scope::declareBoundParameter): Deleted.
1432         (JSC::Parser::declareBoundParameter): Deleted.
1433         * tests/stress/es6-default-parameters.js:
1434
1435 2015-11-17  Benjamin Poulain  <bpoulain@apple.com>
1436
1437         [JSC] Untangle the dependencies on FTLAbbreviations a bit
1438         https://bugs.webkit.org/show_bug.cgi?id=151375
1439
1440         Reviewed by Geoffrey Garen.
1441
1442         FTLAbbreviations was included in many places but in most cases
1443         we just need the Abbreviated types. Update the #include accordingly.
1444
1445         Also remove the IntrinsicRepository dependency from the B3Output.
1446
1447         * ftl/FTLAbstractHeap.cpp:
1448         * ftl/FTLAbstractHeap.h:
1449         * ftl/FTLAbstractHeapRepository.cpp:
1450         * ftl/FTLB3Output.h:
1451         (JSC::FTL::Output::Output):
1452         (JSC::FTL::Output::stackmapIntrinsic):
1453         (JSC::FTL::Output::frameAddressIntrinsic):
1454         (JSC::FTL::Output::patchpointInt64Intrinsic):
1455         (JSC::FTL::Output::patchpointVoidIntrinsic):
1456         * ftl/FTLCommonValues.cpp:
1457         * ftl/FTLCommonValues.h:
1458         * ftl/FTLFormattedValue.h:
1459         * ftl/FTLIntrinsicRepository.cpp:
1460         * ftl/FTLOSRExit.h:
1461         * ftl/FTLOSRExitCompilationInfo.h:
1462         * ftl/FTLStackmapArgumentList.h:
1463         * ftl/FTLState.cpp:
1464         * ftl/FTLState.h:
1465         * ftl/FTLTypedPointer.h:
1466
1467 2015-11-17  Filip Pizlo  <fpizlo@apple.com>
1468
1469         B3::generate should separate out the final Air codegen, so that it can be done outside the Graph safepoint
1470         https://bugs.webkit.org/show_bug.cgi?id=151371
1471
1472         Reviewed by Benjamin Poulain.
1473
1474         One of the FTL optimizations is that while the expensive backend is running, we are at a "graph
1475         safepoint" that allows the VM to do GCs and other dangerous and time-sensitive things without
1476         waiting for the compilation thread. While in the safepoint, we cannot do anything that touches
1477         anything other than the backend's state. That means, for example, that we wouldn't be able to run
1478         any of the stackmap generation callbacks, since those need to mess with DFG state.
1479
1480         That means that we need to separate the B3 pipeline into "preparation" and "generation".
1481         Preparation is all of the expensive stuff: all B3 phases, lowering to Air, all Air phases.
1482         Generation is just the part where we turn fully lowered Air into machine code. Generation also
1483         happens to be the part where we call stackmap generation callbacks. In other words, preparation
1484         is exactly the stuff that should go into the graph safepoint, while generation is the stuff that
1485         we want to do after we emerge from the safepoint.
1486
1487         Because the tests were using the higher-level Compilation API, I didn't have to change any test
1488         code. The FTL will not use that high-level API.
1489
1490         * b3/B3Compilation.cpp:
1491         (JSC::B3::Compilation::Compilation):
1492         * b3/B3Generate.cpp:
1493         (JSC::B3::prepareForGeneration):
1494         (JSC::B3::generate):
1495         (JSC::B3::generateToAir):
1496         * b3/B3Generate.h:
1497         * b3/B3LowerToAir.cpp:
1498         (JSC::B3::Air::LowerToAir::LowerToAir):
1499         (JSC::B3::lowerToAir):
1500         * b3/B3LowerToAir.h:
1501         * b3/B3Procedure.cpp:
1502         (JSC::B3::Procedure::Procedure):
1503         * b3/B3Procedure.h:
1504         (JSC::B3::Procedure::takeByproducts):
1505         (JSC::B3::Procedure::code):
1506         * b3/air/AirCode.h:
1507         (JSC::B3::Air::Code::proc):
1508         (JSC::B3::Air::Code::lastPhaseName):
1509         * b3/air/AirGenerate.cpp:
1510         (JSC::B3::Air::prepareForGeneration):
1511         (JSC::B3::Air::generate):
1512         * b3/air/AirGenerate.h:
1513
1514 2015-11-17  Filip Pizlo  <fpizlo@apple.com>
1515
1516         FTL::State should be able to refer to B3::Procedure
1517
1518         Rubber stamped by Benjamin Poulain.
1519
1520         * ftl/FTLState.h:
1521
1522 2015-11-17  Benjamin Poulain  <bpoulain@apple.com>
1523
1524         [JSC] Add an empty FTLOutput for B3 that crashes on any operation
1525         https://bugs.webkit.org/show_bug.cgi?id=151366
1526
1527         Reviewed by Filip Pizlo.
1528
1529         * JavaScriptCore.xcodeproj/project.pbxproj:
1530         * ftl/FTLB3Output.h: Added.
1531         * ftl/FTLAbbreviatedTypes.h:
1532         * ftl/FTLAbstractHeap.cpp:
1533         * ftl/FTLLowerDFGToLLVM.cpp:
1534         (JSC::FTL::DFG::LowerDFGToLLVM::createPhiVariables):
1535         * ftl/FTLOutput.cpp:
1536         * ftl/FTLOutput.h:
1537
1538 2015-11-17  Benjamin Poulain  <bpoulain@apple.com>
1539
1540         [JSC] Do not copy the adjacency list when we just need to manipulate them
1541         https://bugs.webkit.org/show_bug.cgi?id=151343
1542
1543         Reviewed by Geoffrey Garen.
1544
1545         * b3/air/AirIteratedRegisterCoalescing.cpp:
1546         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::precoloredCoalescingHeuristic):
1547         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::conservativeHeuristic):
1548
1549 2015-11-17  Benjamin Poulain  <bpoulain@apple.com>
1550
1551         [JSC] Remove FTLOutput operations that act directly on floats
1552         https://bugs.webkit.org/show_bug.cgi?id=151342
1553
1554         Reviewed by Geoffrey Garen.
1555
1556         * ftl/FTLLowerDFGToLLVM.cpp:
1557         (JSC::FTL::DFG::LowerDFGToLLVM::compileArithFRound):
1558         (JSC::FTL::DFG::LowerDFGToLLVM::compileGetByVal):
1559         (JSC::FTL::DFG::LowerDFGToLLVM::compilePutByVal):
1560         * ftl/FTLOutput.cpp:
1561         (JSC::FTL::Output::store):
1562         * ftl/FTLOutput.h:
1563         (JSC::FTL::Output::loadFloatToDouble):
1564         (JSC::FTL::Output::fround):
1565         (JSC::FTL::Output::loadFloat): Deleted.
1566
1567 2015-11-17  Filip Pizlo  <fpizlo@apple.com>
1568
1569         Add a FTL_USES_B3 compile-time setting and set it to 0.
1570
1571         Rubber stamped by Benjamin Poulain.
1572
1573         * dfg/DFGCommon.h:
1574
1575 2015-11-17  Filip Pizlo  <fpizlo@apple.com>
1576
1577         CheckAdd/Mul should have commutativity optimizations in B3->Air lowering
1578         https://bugs.webkit.org/show_bug.cgi?id=151214
1579
1580         Reviewed by Geoffrey Garen.
1581
1582         This is an overhaul of CheckAdd/CheckSub/CheckMul that fixes bugs, improves codegen, and
1583         simplifies the contract between B3 and its client.
1584
1585         Previously, the idea was that the operands to the Air BranchAdd/Sub/Mul matched the children of
1586         the B3 CheckAdd/Sub/Mul, or at least, that's what the B3::CheckSpecial would make you believe.
1587         This meant that B3/Air had to avoid optimizations that would break this protocol. This prevented
1588         commutativity optimizations on CheckAdd/Mul and it also prevented strength reduction from
1589         CheckMul(x, 2) to CheckAdd(x, x), for example. Those optimizations would break things because the
1590         client's Stackmap generation callback was allowed to assume that the first entry in params.reps
1591         was the first child. Also, there was a contract between B3 and its client that for CheckAdd/Sub,
1592         the client would undo the operation by doing the opposite operation with the params.reps[0] as the
1593         source and params.reps[1] as the destination.
1594
1595         This not only prevented commutativity optimizations, it also led to bugs. Here are two bugs that
1596         we had:
1597
1598         - Add(x, x) would not work. The client would be told to undo the add using %x as both the source
1599           and destination. The client would use a sub() instruction. The result would not be x - it would
1600           be zero.
1601
1602         - Mul where the result got coalesced with one of the sources. You can't undo a multiplication, so
1603           you need to keep the inputs alive until after the result is computed - i.e. the inputs are late
1604           uses. I initially thought I worked around this by using a three-operand form of Mul, but of
1605           course that doesn't actually fix the issue.
1606
1607         This patch fixes these issues comprehensively by introducing the following changes:
1608
1609         The params.reps corresponding to the first two children of CheckAdd/Sub/Mul and the first child of
1610         Check are always garbage: if you want to know the values of those children in the slow path, pass
1611         them as additional stackmap children. This makes it clear to the compiler whose values you
1612         actually care about, and frees the compiler to reorder and commute the non-stackmap children.
1613
1614         The "undo" of an Add or Sub is handled internally by B3: the client doesn't have to know anything
1615         about undoing. B3 does it. The contract is simply that if a B3::Value* is a stackmap child of a
1616         CheckXYZ, then the corresponding entry in params.reps inside the stackmap generator callback will
1617         contain the value of that Value*. For Add and Sub, B3 undoes the operation. For Add(x, x), the
1618         undo uses the carry flag and some shift magic. For Mul, B3 uses LateUse:
1619
1620         A new kind of Arg::Role called Arg::LateUse is introduced: This kind of use means that the use
1621         happens at the start of the execution of the next instruction. None of the built-in Air opcodes
1622         use LateUse, but it is used by B3::CheckSpecial. We use it to implement CheckMul.
1623
1624         Finally, this change fixes testComplex to actually create many live variables. This revealed a
1625         really dumb pathology in allocateStack(), and this patch fixes it. Basically, it's a bad idea to
1626         build interference graphs by repeatedly recreating the same cliques.
1627
1628         * assembler/MacroAssemblerX86Common.h:
1629         (JSC::MacroAssemblerX86Common::test32):
1630         (JSC::MacroAssemblerX86Common::setCarry):
1631         (JSC::MacroAssemblerX86Common::invert):
1632         * b3/B3CheckSpecial.cpp:
1633         (JSC::B3::Air::numB3Args):
1634         (JSC::B3::CheckSpecial::Key::Key):
1635         (JSC::B3::CheckSpecial::Key::dump):
1636         (JSC::B3::CheckSpecial::CheckSpecial):
1637         (JSC::B3::CheckSpecial::forEachArg):
1638         (JSC::B3::CheckSpecial::isValid):
1639         (JSC::B3::CheckSpecial::generate):
1640         (JSC::B3::CheckSpecial::dumpImpl):
1641         (JSC::B3::CheckSpecial::deepDumpImpl):
1642         * b3/B3CheckSpecial.h:
1643         (JSC::B3::CheckSpecial::Key::Key):
1644         (JSC::B3::CheckSpecial::Key::operator==):
1645         (JSC::B3::CheckSpecial::Key::operator!=):
1646         (JSC::B3::CheckSpecial::Key::opcode):
1647         (JSC::B3::CheckSpecial::Key::numArgs):
1648         (JSC::B3::CheckSpecial::Key::stackmapRole):
1649         (JSC::B3::CheckSpecial::Key::hash):
1650         * b3/B3CheckValue.cpp:
1651         (JSC::B3::CheckValue::~CheckValue):
1652         (JSC::B3::CheckValue::convertToAdd):
1653         (JSC::B3::CheckValue::CheckValue):
1654         * b3/B3CheckValue.h:
1655         * b3/B3Const32Value.cpp:
1656         (JSC::B3::Const32Value::checkMulConstant):
1657         (JSC::B3::Const32Value::checkNegConstant):
1658         (JSC::B3::Const32Value::divConstant):
1659         * b3/B3Const32Value.h:
1660         * b3/B3Const64Value.cpp:
1661         (JSC::B3::Const64Value::checkMulConstant):
1662         (JSC::B3::Const64Value::checkNegConstant):
1663         (JSC::B3::Const64Value::divConstant):
1664         * b3/B3Const64Value.h:
1665         * b3/B3LowerToAir.cpp:
1666         (JSC::B3::Air::LowerToAir::appendBinOp):
1667         (JSC::B3::Air::LowerToAir::lower):
1668         * b3/B3Opcode.h:
1669         * b3/B3PatchpointSpecial.cpp:
1670         (JSC::B3::PatchpointSpecial::~PatchpointSpecial):
1671         (JSC::B3::PatchpointSpecial::forEachArg):
1672         (JSC::B3::PatchpointSpecial::isValid):
1673         * b3/B3ReduceStrength.cpp:
1674         * b3/B3StackmapSpecial.cpp:
1675         (JSC::B3::StackmapSpecial::forEachArgImpl):
1676         * b3/B3StackmapSpecial.h:
1677         * b3/B3StackmapValue.cpp:
1678         (JSC::B3::StackmapValue::append):
1679         (JSC::B3::StackmapValue::appendSomeRegister):
1680         (JSC::B3::StackmapValue::setConstrainedChild):
1681         * b3/B3StackmapValue.h:
1682         * b3/B3Validate.cpp:
1683         * b3/B3Value.cpp:
1684         (JSC::B3::Value::checkMulConstant):
1685         (JSC::B3::Value::checkNegConstant):
1686         (JSC::B3::Value::divConstant):
1687         * b3/B3Value.h:
1688         * b3/air/AirAllocateStack.cpp:
1689         (JSC::B3::Air::allocateStack):
1690         * b3/air/AirArg.cpp:
1691         (WTF::printInternal):
1692         * b3/air/AirArg.h:
1693         (JSC::B3::Air::Arg::isAnyUse):
1694         (JSC::B3::Air::Arg::isEarlyUse):
1695         (JSC::B3::Air::Arg::isLateUse):
1696         (JSC::B3::Air::Arg::isDef):
1697         (JSC::B3::Air::Arg::forEachTmp):
1698         (JSC::B3::Air::Arg::isUse): Deleted.
1699         * b3/air/AirGenerate.cpp:
1700         (JSC::B3::Air::generate):
1701         * b3/air/AirIteratedRegisterCoalescing.cpp:
1702         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::build):
1703         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::allocate):
1704         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::InterferenceEdge::hash):
1705         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::InterferenceEdge::dump):
1706         (JSC::B3::Air::addSpillAndFillToProgram):
1707         (JSC::B3::Air::iteratedRegisterCoalescingOnType):
1708         (JSC::B3::Air::iteratedRegisterCoalescing):
1709         * b3/air/AirLiveness.h:
1710         (JSC::B3::Air::Liveness::Liveness):
1711         (JSC::B3::Air::Liveness::LocalCalc::LocalCalc):
1712         (JSC::B3::Air::Liveness::LocalCalc::live):
1713         (JSC::B3::Air::Liveness::LocalCalc::takeLive):
1714         (JSC::B3::Air::Liveness::LocalCalc::execute):
1715         * b3/air/AirOpcode.opcodes:
1716         * b3/air/AirReportUsedRegisters.cpp:
1717         (JSC::B3::Air::reportUsedRegisters):
1718         * b3/air/AirSpillEverything.cpp:
1719         (JSC::B3::Air::spillEverything):
1720         * b3/testb3.cpp:
1721         (JSC::B3::testMulArg):
1722         (JSC::B3::testMulArgStore):
1723         (JSC::B3::testMulAddArg):
1724         (JSC::B3::testMulArgs):
1725         (JSC::B3::testComplex):
1726         (JSC::B3::testSimpleCheck):
1727         (JSC::B3::testCheckLessThan):
1728         (JSC::B3::testCheckMegaCombo):
1729         (JSC::B3::testCheckAddImm):
1730         (JSC::B3::testCheckAddImmCommute):
1731         (JSC::B3::testCheckAddImmSomeRegister):
1732         (JSC::B3::testCheckAdd):
1733         (JSC::B3::testCheckAdd64):
1734         (JSC::B3::testCheckSubImm):
1735         (JSC::B3::testCheckSubBadImm):
1736         (JSC::B3::testCheckSub):
1737         (JSC::B3::testCheckSub64):
1738         (JSC::B3::testCheckNeg):
1739         (JSC::B3::testCheckNeg64):
1740         (JSC::B3::testCheckMul):
1741         (JSC::B3::testCheckMulMemory):
1742         (JSC::B3::testCheckMul2):
1743         (JSC::B3::testCheckMul64):
1744         (JSC::B3::run):
1745
1746 2015-11-17  Filip Pizlo  <fpizlo@apple.com>
1747
1748         Air should lay out code optimally
1749         https://bugs.webkit.org/show_bug.cgi?id=150478
1750
1751         Reviewed by Geoffrey Garen.
1752
1753         This adds a phase that optimizes code layout using something that's worked well for me in the past.
1754         Basically, it just forces pre-ordering on the CFG, except that:
1755
1756         - Blocks that are only reachable by Rare control flow are scheduled separately, all the way at the
1757           end.
1758
1759         - Successors of the same frequency class are pushed in ascending order of frequency, so that the most
1760           frequent successor is scheduled immediately after.
1761
1762         This also adds the requisite branch flipping, so that a branch's taken successor is not the
1763         fall-through block. We want the fall-through to be the not-taken successor if at all possible.
1764
1765         * JavaScriptCore.xcodeproj/project.pbxproj:
1766         * b3/B3BlockWorklist.h:
1767         * b3/B3GenericFrequentedBlock.h:
1768         (JSC::B3::GenericFrequentedBlock::frequency):
1769         (JSC::B3::GenericFrequentedBlock::isRare):
1770         (JSC::B3::GenericFrequentedBlock::dump):
1771         * b3/B3Procedure.h:
1772         * b3/air/AirArg.h:
1773         (JSC::B3::Air::Arg::isDoubleCond):
1774         (JSC::B3::Air::Arg::isCondition):
1775         (JSC::B3::Air::Arg::isSpecial):
1776         (JSC::B3::Air::Arg::asDoubleCondition):
1777         (JSC::B3::Air::Arg::isInvertible):
1778         (JSC::B3::Air::Arg::inverted):
1779         * b3/air/AirBasicBlock.h:
1780         (JSC::B3::Air::BasicBlock::index):
1781         (JSC::B3::Air::BasicBlock::setIndex):
1782         (JSC::B3::Air::BasicBlock::size):
1783         (JSC::B3::Air::BasicBlock::begin):
1784         (JSC::B3::Air::BasicBlock::containsPredecessor):
1785         (JSC::B3::Air::BasicBlock::frequency):
1786         * b3/air/AirBlockWorklist.h: Added.
1787         * b3/air/AirCode.cpp:
1788         (JSC::B3::Air::Code::findNextBlock):
1789         * b3/air/AirCode.h:
1790         (JSC::B3::Air::Code::proc):
1791         (JSC::B3::Air::Code::at):
1792         (JSC::B3::Air::Code::operator[]):
1793         (JSC::B3::Air::Code::blockList):
1794         * b3/air/AirGenerate.cpp:
1795         (JSC::B3::Air::generate):
1796         * b3/air/AirOpcode.opcodes:
1797         * b3/air/AirOptimizeBlockOrder.cpp: Added.
1798         (JSC::B3::Air::optimizeBlockOrder):
1799         * b3/air/AirOptimizeBlockOrder.h: Added.
1800
1801 2015-11-17  Andreas Kling  <akling@apple.com>
1802
1803         [JSC] JSPropertyNameEnumerator could be destructorless.
1804         <https://webkit.org/b/151242>
1805
1806         Reviewed by Mark Lam.
1807
1808         Make JSPropertyNameEnumerator destructorless and have it store the property names
1809         cache in CopiedSpace. This was the most popular occupant of 64-byte destructor cells
1810         in MarkedSpace, so making it destructorless gets rid of some ill-filled MarkedBlocks.
1811
1812         This patch had two issues on 32-bit platforms when first landed:
1813
1814         - Copied space allocations are required to be 8-byte divisible in size.
1815
1816         - WriteBarrier<Unknown> and WriteBarrier<JSString> are not the same size on 32-bit;
1817           the former is a 64-bit EncodedJSValue internally, and the latter is a 32-bit JSCell*.
1818           My patch was reinterpret_cast'ing a WriteBarrier<JSString> to a WriteBarrier<Unknown>
1819           when passing to SlotVisitor::appendValues(), which led to invalid addresses getting
1820           marked and strings getting GC'd prematurely.
1821
1822         * heap/CopyToken.h:
1823         * runtime/JSPropertyNameEnumerator.cpp:
1824         (JSC::JSPropertyNameEnumerator::finishCreation):
1825         (JSC::JSPropertyNameEnumerator::visitChildren):
1826         (JSC::JSPropertyNameEnumerator::copyBackingStore):
1827         (JSC::JSPropertyNameEnumerator::destroy): Deleted.
1828         * runtime/JSPropertyNameEnumerator.h:
1829
1830 2015-11-17  Mark Lam  <mark.lam@apple.com>
1831
1832         Refactoring: move branchMul32's imm arg to the 3rd argument to be consistent.
1833         https://bugs.webkit.org/show_bug.cgi?id=151358
1834
1835         Reviewed by Saam Barati.
1836
1837         branch32, branchAdd32, and branchSub32 all have it as the 3rd argument.
1838         branchMul32 is the odd man out.  This patch makes branchMul32 consistent with
1839         the others.
1840
1841         * assembler/MacroAssembler.h:
1842         (JSC::MacroAssembler::branchAdd32):
1843         (JSC::MacroAssembler::branchMul32):
1844         * assembler/MacroAssemblerARM.h:
1845         (JSC::MacroAssemblerARM::branchMul32):
1846         * assembler/MacroAssemblerARM64.h:
1847         (JSC::MacroAssemblerARM64::branchMul32):
1848         * assembler/MacroAssemblerARMv7.h:
1849         (JSC::MacroAssemblerARMv7::branchMul32):
1850         * assembler/MacroAssemblerMIPS.h:
1851         (JSC::MacroAssemblerMIPS::branchMul32):
1852         * assembler/MacroAssemblerSH4.h:
1853         (JSC::MacroAssemblerSH4::branchNeg32):
1854         (JSC::MacroAssemblerSH4::branchMul32):
1855         * assembler/MacroAssemblerX86Common.h:
1856         (JSC::MacroAssemblerX86Common::branchMul32):
1857         * jit/JITArithmetic.cpp:
1858         (JSC::JIT::emit_op_mul):
1859
1860 2015-11-17  Mark Lam  <mark.lam@apple.com>
1861
1862         Use the JITAddGenerator snippet in the DFG.
1863         https://bugs.webkit.org/show_bug.cgi?id=151266
1864
1865         Reviewed by Geoffrey Garen.
1866
1867         No tests added because the op_add.js stress test already tests for correctness
1868         (using the LLINT as a reference).
1869
1870         Performance-wise, the difference from the pre-existing DFG implementation is
1871         insignificant (at least as measured on x86 and x86_64).  We're moving forward
1872         with adopting this implementation because it unifies the 32-bit and 64-bit
1873         implementations, as well as lays ground work for a repatching inline cache
1874         implementation of op_add later.
1875
1876         * dfg/DFGAbstractValue.cpp:
1877         (JSC::DFG::AbstractValue::resultType):
1878         - Made an assertion less restrictive.  For ValueAdd operands, the DFG thinks that
1879           the operand can also be empty (though we should never see this in practice).
1880
1881         * dfg/DFGFixupPhase.cpp:
1882         (JSC::DFG::FixupPhase::fixupNode):
1883         - Add fallback to unused type operands.
1884
1885         * dfg/DFGSpeculativeJIT.cpp:
1886         (JSC::DFG::SpeculativeJIT::compileValueAdd):
1887         - Introduce a common function to compile the ValueAdd node.
1888
1889         * dfg/DFGSpeculativeJIT.h:
1890         (JSC::DFG::JSValueOperand::JSValueOperand):
1891         - Add the forwarding constructor so that we can use Optional<JSValueOperand>.
1892
1893         * dfg/DFGSpeculativeJIT32_64.cpp:
1894         (JSC::DFG::SpeculativeJIT::compile):
1895         * dfg/DFGSpeculativeJIT64.cpp:
1896         (JSC::DFG::SpeculativeJIT::compile):
1897         - Changed to use the common compileValueAdd().
1898
1899         * jit/AssemblyHelpers.h:
1900         (JSC::AssemblyHelpers::moveValue):
1901         - Similar to moveTrustedValue() but used for untrusted constants.
1902
1903         * jit/JITAddGenerator.cpp:
1904         (JSC::JITAddGenerator::generateFastPath):
1905         * jit/JITAddGenerator.h:
1906         (JSC::JITAddGenerator::JITAddGenerator):
1907         - Updated to take the left or right operand as a constant.  This is necessary
1908           because the client should not be making assumptions about whether the snippet
1909           will determine the operation to be commutative or not.  Instead, the client
1910           should just pass in the operands and let the snippet do any operand order
1911           swapping if necessary.
1912
1913         * jit/JITArithmetic.cpp:
1914         (JSC::JIT::emit_op_add):
1915         - Updated to use the new JITAddGenerator interface.
1916
1917         * tests/stress/op_add.js:
1918         (stringifyIfNeeded):
1919         (runTest):
1920         - Made test output more clear about when string results are expected.
1921
1922 2015-11-17  Filip Pizlo  <fpizlo@apple.com>
1923
1924         It's best for the DFG to always have some guess of basic block frequency
1925         https://bugs.webkit.org/show_bug.cgi?id=151350
1926
1927         Reviewed by Geoffrey Garen.
1928
1929         It'll simplify things for B3 if we always have some estimate of block frequency, even if it's not
1930         a great estimate. Using NaN as an estimate is probably worse than using any non-NaN number.
1931
1932         * dfg/DFGByteCodeParser.cpp:
1933         (JSC::DFG::ByteCodeParser::inlineCall):
1934         (JSC::DFG::ByteCodeParser::handleInlining):
1935         (JSC::DFG::ByteCodeParser::parseCodeBlock):
1936         * dfg/DFGCriticalEdgeBreakingPhase.cpp:
1937         (JSC::DFG::CriticalEdgeBreakingPhase::breakCriticalEdge):
1938         * dfg/DFGLoopPreHeaderCreationPhase.cpp:
1939         (JSC::DFG::createPreHeader):
1940
1941 2015-11-17  Michael Saboff  <msaboff@apple.com>
1942
1943         Reserved VM pool established in r187125 is likely too conservative
1944         https://bugs.webkit.org/show_bug.cgi?id=151351
1945
1946         Reviewed by Filip Pizlo.
1947
1948         Reduce the VM allocation reserved pool from 25% to 15% for ARM32.
1949
1950         * jit/ExecutableAllocator.h:
1951
1952 2015-11-17  Saam barati  <sbarati@apple.com>
1953
1954         FTLLazySlowPaths should be able to handle being passed the zero register as a location
1955         https://bugs.webkit.org/show_bug.cgi?id=151193
1956
1957         Reviewed by Geoffrey Garen.
1958
1959         On arm64, SP and ZR are the same register number. The meaning
1960         of the register number being SP or ZR is dependent on context of
1961         the instruction and the register within the instruction. LLVM may
1962         prove that a value is zero, or sometimes, we will lower a
1963         value as a constant zero (for example, we might compile
1964         CreateDirectArguments of an inlined call frame and we might know
1965         that the arguments have a length of zero). LazySlowPaths should
1966         be able to gracefully handle being passed a stackmap location
1967         with a gpr value of SP by moving zero into another register
1968         and replacing the location's register with the new register.
1969         This way, no lazy slow path will ever have access to a location with a GPR
1970         value of SP.  This patch makes this work by using a scratch register 
1971         allocator when we need to do this maneuver of moving zero into a scratch
1972         register.  Inside FTLCompile, we track if we need to move zero into a register,
1973         and if so, into which register. We actually emit the necessary
1974         instructions to move zero into this register, and to spill reused
1975         registers if necessary, while generating the code for the lazy slow
1976         path itself.
1977
1978         * ftl/FTLCompile.cpp:
1979         (JSC::FTL::mmAllocateDataSection):
1980         * ftl/FTLDWARFRegister.cpp:
1981         (JSC::FTL::DWARFRegister::reg):
1982         * ftl/FTLLazySlowPath.cpp:
1983         (JSC::FTL::LazySlowPath::LazySlowPath):
1984         (JSC::FTL::LazySlowPath::generate):
1985         * ftl/FTLLazySlowPath.h:
1986         (JSC::FTL::LazySlowPath::createGenerator):
1987
1988 2015-11-17  Mark Lam  <mark.lam@apple.com>
1989
1990         [JSC] Support Doubles with B3's Mul.
1991         https://bugs.webkit.org/show_bug.cgi?id=151355
1992
1993         Reviewed by Filip Pizlo.
1994
1995         * b3/B3LowerToAir.cpp:
1996         (JSC::B3::Air::LowerToAir::lower):
1997         * b3/air/AirOpcode.opcodes:
1998         * b3/testb3.cpp:
1999         (JSC::B3::testMulLoadTwice):
2000         (JSC::B3::testMulArgDouble):
2001         (JSC::B3::testMulArgsDouble):
2002         (JSC::B3::testMulArgImmDouble):
2003         (JSC::B3::testMulImmArgDouble):
2004         (JSC::B3::testMulImmsDouble):
2005         (JSC::B3::testDivArgDouble):
2006         (JSC::B3::run):
2007
2008 2015-11-17  Matthew Daiter  <mdaiter8121@gmail.com>
2009
2010         Removed useless variable scriptResult from testExecutionTimeLimit
2011         https://bugs.webkit.org/show_bug.cgi?id=151331
2012
2013         Reviewed by Alex Christensen.
2014
2015         * API/tests/ExecutionTimeLimitTest.cpp: Removed scriptResult
2016         (testExecutionTimeLimit):
2017
2018 2015-11-16  Mark Lam  <mark.lam@apple.com>
2019
2020         [JSC] Support Doubles with B3's Sub.
2021         https://bugs.webkit.org/show_bug.cgi?id=151322
2022
2023         Reviewed by Filip Pizlo.
2024
2025         * b3/B3LowerToAir.cpp:
2026         (JSC::B3::Air::LowerToAir::lower):
2027         * b3/air/AirOpcode.opcodes:
2028
2029         * b3/testb3.cpp:
2030         (JSC::B3::testSubImmArg32):
2031         (JSC::B3::testSubArgDouble):
2032         (JSC::B3::testSubArgsDouble):
2033         (JSC::B3::testSubArgImmDouble):
2034         (JSC::B3::testSubImmArgDouble):
2035         (JSC::B3::testSubImmsDouble):
2036         (JSC::B3::testBitAndArgs):
2037         (JSC::B3::negativeZero):
2038         (JSC::B3::posInfinity):
2039         (JSC::B3::negInfinity):
2040         (JSC::B3::doubleOperands):
2041         (JSC::B3::run):
2042         - Added RUN_UNARY and RUN_BINARY macros to auto generate permutations
2043           of operands for the tests.
2044         - Added SubDouble tests using the new macros.
2045
2046 2015-11-17  Benjamin Poulain  <bpoulain@apple.com>
2047
2048         [JSC] IteratedRegisterCoalescingAllocator's freeze can add zombie Tmps to our coloring algorithm
2049         https://bugs.webkit.org/show_bug.cgi?id=151345
2050
2051         Reviewed by Filip Pizlo.
2052
2053         The extended test of https://bugs.webkit.org/show_bug.cgi?id=151214 revealed a problem with
2054         the Move freezing step of the iterated register allocator.
2055
2056         When freezing a move related Tmp, we go over all the move instructions and update the other
2057         Tmp of the move as needed. If that Tmp is no longer Move related and is of low degree it can
2058         be simplified too.
2059
2060         The problem arise when one of those Tmp was already coalesced. For example, say we have
2061
2062           1: move %tmp42, %tmp43
2063           2: move %tmp42, %tmp44
2064
2065         The first move cannot be coalesced for some reason and is moved to the Active worklist.
2066         The second move is coalesced and %tmp42 is now %tmp44.
2067
2068         When nothing can be simplified or coalesced, we look at freezing a Move-related Tmp.
2069         Let's say we pick %tmp43. The code of freeze() was going to all the Move instructions
2070         to update them. Here you would find @1 above, get %tmp42 as the other Tmp. Since %tmp42
2071         is no longer move related, it is added to the simplify work list.
2072         -> We just added a coalesced Tmp to our worklist!
2073
2074         To fix that, I get the alias of every other Tmp before updating its status.
2075
2076         There is still a problem: multiple Moves instructions may have been coalesced to the same
2077         Tmp. We must not add a Tmp twice to a worklist.
2078         To avoid duplicates, I rely on the fact that the freeze worklist should not contains
2079         aliased Tmps. Before adding something to the simplify worklist, I check that it was
2080         in the freeze worklist.
2081
2082         I cannot find how this problem would have been avoided in the original paper. I suspect
2083         that may have been a bug in the pseudo-code.
2084
2085         * b3/air/AirIteratedRegisterCoalescing.cpp:
2086         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::freeze):
2087         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::freezeMoves):
2088
2089 2015-11-16  Benjamin Poulain  <bpoulain@apple.com>
2090
2091         [JSC] Make FTLOutput's load8() and load16() compatible with B3
2092         https://bugs.webkit.org/show_bug.cgi?id=151336
2093
2094         Reviewed by Filip Pizlo.
2095
2096         B3 does not have 8bit and 16bit types. Make FTLOutput abstract enough
2097         to handle LLVM IR and B3.
2098
2099         * ftl/FTLLowerDFGToLLVM.cpp:
2100         (JSC::FTL::DFG::LowerDFGToLLVM::compileGetArrayLength):
2101         (JSC::FTL::DFG::LowerDFGToLLVM::compileGetByVal):
2102         (JSC::FTL::DFG::LowerDFGToLLVM::compileStringCharAt):
2103         (JSC::FTL::DFG::LowerDFGToLLVM::compileStringCharCodeAt):
2104         (JSC::FTL::DFG::LowerDFGToLLVM::compileNotifyWrite):
2105         (JSC::FTL::DFG::LowerDFGToLLVM::compileSwitch):
2106         (JSC::FTL::DFG::LowerDFGToLLVM::compileCheckHasInstance):
2107         (JSC::FTL::DFG::LowerDFGToLLVM::compileCheckWatchdogTimer):
2108         (JSC::FTL::DFG::LowerDFGToLLVM::speculateTruthyObject):
2109         (JSC::FTL::DFG::LowerDFGToLLVM::boolify):
2110         (JSC::FTL::DFG::LowerDFGToLLVM::equalNullOrUndefined):
2111         (JSC::FTL::DFG::LowerDFGToLLVM::switchStringRecurse):
2112         (JSC::FTL::DFG::LowerDFGToLLVM::isObject):
2113         (JSC::FTL::DFG::LowerDFGToLLVM::isNotObject):
2114         (JSC::FTL::DFG::LowerDFGToLLVM::isArrayType):
2115         (JSC::FTL::DFG::LowerDFGToLLVM::isExoticForTypeof):
2116         (JSC::FTL::DFG::LowerDFGToLLVM::isType):
2117         (JSC::FTL::DFG::LowerDFGToLLVM::speculateNonNullObject):
2118         (JSC::FTL::DFG::LowerDFGToLLVM::loadCellState):
2119         (JSC::FTL::DFG::LowerDFGToLLVM::emitStoreBarrier):
2120         * ftl/FTLOutput.h:
2121         (JSC::FTL::Output::load8SignExt32):
2122         (JSC::FTL::Output::load8ZeroExt32):
2123         (JSC::FTL::Output::load16SignExt32):
2124         (JSC::FTL::Output::load16ZeroExt32):
2125         (JSC::FTL::Output::constInt8): Deleted.
2126         (JSC::FTL::Output::load8): Deleted.
2127         (JSC::FTL::Output::load16): Deleted.
2128         (JSC::FTL::Output::store8): Deleted.
2129         (JSC::FTL::Output::storeFloat): Deleted.
2130         (JSC::FTL::Output::isZero8): Deleted.
2131         (JSC::FTL::Output::notZero8): Deleted.
2132         (JSC::FTL::Output::testIsZero8): Deleted.
2133         (JSC::FTL::Output::testNonZero8): Deleted.
2134
2135 2015-11-16  Benjamin Poulain  <bpoulain@apple.com>
2136
2137         Fix a typo in AirIteratedRegisterCoalescing
2138
2139         I forgot to fix that review comment from Geoff.
2140
2141         * b3/air/AirIteratedRegisterCoalescing.cpp:
2142         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::build):
2143
2144 2015-11-16  Benjamin Poulain  <bpoulain@apple.com>
2145
2146         [JSC] Add support for the extra registers that can be clobbered by Specials
2147         https://bugs.webkit.org/show_bug.cgi?id=151246
2148
2149         Reviewed by Geoffrey Garen.
2150
2151         Specials can clobber arbitrary registers. This was not handled correctly by Air
2152         and nothing was preventing us from re-allocating those registers.
2153
2154         This patch adds support for the extra clobbered registers in the two register allocators.
2155
2156         I also fixed the re-spilling FIXME of the iterated allocator because the test might
2157         not always converge without it. Since we are at maximum register pressure at the patch point,
2158         we could be always spilling the return value, which would loop forever.
2159
2160         To fix the re-spilling, I just kept a Set of every value spilled or filled so far. When selecting
2161         a spill candidate, we never pick a Tmp from that set.
2162
2163         * b3/air/AirGenerate.cpp:
2164         (JSC::B3::Air::generate):
2165         * b3/air/AirHandleCalleeSaves.cpp:
2166         (JSC::B3::Air::handleCalleeSaves):
2167         * b3/air/AirInst.h:
2168         * b3/air/AirInstInlines.h:
2169         (JSC::B3::Air::Inst::forEachDefAndExtraClobberedTmp):
2170         * b3/air/AirIteratedRegisterCoalescing.cpp:
2171         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::IteratedRegisterCoalescingAllocator):
2172         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::build):
2173         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::addEdges):
2174         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::selectSpill):
2175         (JSC::B3::Air::addSpillAndFillToProgram):
2176         (JSC::B3::Air::iteratedRegisterCoalescingOnType):
2177         (JSC::B3::Air::iteratedRegisterCoalescing):
2178         * b3/air/AirSpillEverything.cpp:
2179         (JSC::B3::Air::spillEverything):
2180         * b3/testb3.cpp:
2181         (JSC::B3::testSimplePatchpointWithoutOuputClobbersGPArgs):
2182         (JSC::B3::testSimplePatchpointWithOuputClobbersGPArgs):
2183         (JSC::B3::testSimplePatchpointWithoutOuputClobbersFPArgs):
2184         (JSC::B3::testSimplePatchpointWithOuputClobbersFPArgs):
2185         (JSC::B3::run):
2186         * jit/RegisterSet.h:
2187
2188 2015-11-16  Benjamin Poulain  <benjamin@webkit.org>
2189
2190         Build fix after r192492
2191
2192         Last second change broke the build.
2193
2194         * b3/air/AirIteratedRegisterCoalescing.cpp:
2195         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::OrderedMoveSet::contains):
2196         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::OrderedMoveSet::takeMove):
2197         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::OrderedMoveSet::takeLastMove):
2198
2199 2015-11-16  Benjamin Poulain  <bpoulain@apple.com>
2200
2201         [JSC] Add trivial lowering for B3's Div with doubles
2202         https://bugs.webkit.org/show_bug.cgi?id=151292
2203
2204         Reviewed by Geoffrey Garen.
2205
2206         Filip had already made the constant propagation for it.
2207         The Air Opcode was all we had left.
2208
2209         * b3/B3LowerToAir.cpp:
2210         (JSC::B3::Air::LowerToAir::lower):
2211         * b3/air/AirOpcode.opcodes:
2212         * b3/testb3.cpp:
2213         (JSC::B3::testDivArgDouble):
2214         (JSC::B3::testDivArgsDouble):
2215         (JSC::B3::testDivArgImmDouble):
2216         (JSC::B3::testDivImmArgDouble):
2217         (JSC::B3::testDivImmsDouble):
2218         (JSC::B3::run):
2219
2220 2015-11-16  Benjamin Poulain  <bpoulain@apple.com>
2221
2222         [JSC] Speed up the coalescing-related operation of the iterated register allocator
2223         https://bugs.webkit.org/show_bug.cgi?id=151290
2224
2225         Reviewed by Geoffrey Garen.
2226
2227         One step closer to removing the Hash structures:
2228
2229         For the coalescing operation, we need to keep track of Move instructions. We do not strictly
2230         need those to be the Air Move, just any abstract operation that copy a Tmp into another Tmp.
2231
2232         In this patch, I exploit that to remove the Hash structure related to the Inst. Instead of
2233         using the Move Inst, we just keep track of the Use() and Def() of the instructions.
2234         Those are added in the global list m_coalescingCandidates and the index in that list represent
2235         the move for the remaining of the algorithm.
2236
2237         With Moves transformed into dense indices, we can start using arrays to make fast sets.
2238
2239         The m_activeMoves Set is easy since we only need simple add/remove/contains. It is transformed
2240         into a BitVector.
2241         The bit vector is always fully allocated to allow for quick uniform access. The assumtion is that
2242         activeMoves will contains a few values for non trivial cases.
2243
2244         The worklist m_worklistMoves is more complicated. I want it to be ordered to coalesce moves starting
2245         at the top of blocks. Having a fast remove() operation is also useful for mass coalescing.
2246         It also needs Set operations, especially a fast contains().
2247
2248         For m_worklistMoves, I created a new structure: OrderedMoveSet.
2249         It contains a list of ordered values, and a map of each value to its position in the list.
2250
2251         This resembles Briggs' Sparse Set but it is not exactly the same. When removing a value,
2252         I set a special marker in the map (UINT_MAX). The reason is that I want contains() to be fast
2253         instead of remove(). The marker in the map allows contains() with a single memory operation instead of two.
2254
2255         * b3/air/AirIteratedRegisterCoalescing.cpp:
2256         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::build):
2257         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::allocate):
2258         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::forEachNodeMoves):
2259         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::isMoveRelated):
2260         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::enableMovesOnValue):
2261         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::coalesce):
2262         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::combine):
2263         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::freezeMoves):
2264         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::dumpWorkLists):
2265         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::OrderedMoveSet::addMove):
2266         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::OrderedMoveSet::isEmpty):
2267         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::OrderedMoveSet::contains):
2268         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::OrderedMoveSet::takeMove):
2269         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::OrderedMoveSet::takeLastMove):
2270         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::OrderedMoveSet::returnMove):
2271         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::OrderedMoveSet::clear):
2272         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::assignColors): Deleted.
2273
2274 2015-11-16  Saam barati  <sbarati@apple.com>
2275
2276         DFGEdge's dump method should print "Untyped:" for untyped uses.
2277         https://bugs.webkit.org/show_bug.cgi?id=151314
2278
2279         Rubber stamped by Filip Pizlo.
2280
2281         * dfg/DFGEdge.cpp:
2282         (JSC::DFG::Edge::dump):
2283
2284 2015-11-16  Filip Pizlo  <fpizlo@apple.com>
2285
2286         Make sure that the address matcher correctly handles Shl(x, 1)
2287         https://bugs.webkit.org/show_bug.cgi?id=151316
2288
2289         Reviewed by Geoffrey Garen.
2290
2291         This optimization isn't really that awesome, but the nicest part of the change is just the
2292         testing. If we ever do more cleverness with shifts, these tests will come in handy.
2293
2294         * b3/B3LowerToAir.cpp:
2295         (JSC::B3::Air::LowerToAir::effectiveAddr):
2296         * b3/testb3.cpp:
2297         (JSC::B3::testLoadOffsetUsingAddNotConstant):
2298         (JSC::B3::testLoadAddrShift):
2299         (JSC::B3::testFramePointer):
2300         (JSC::B3::run):
2301
2302 2015-11-16  Carlos Garcia Campos  <cgarcia@igalia.com>
2303
2304         [GTK] Use FTL by default when LLVM 3.7 is available
2305         https://bugs.webkit.org/show_bug.cgi?id=142128
2306
2307         Reviewed by Csaba Osztrogonác.
2308
2309         * PlatformGTK.cmake: Install libllvmForJSC.so.
2310         * llvm/InitializeLLVMLinux.cpp:
2311         (JSC::getLLVMInitializerFunction): For developer build try to load first
2312         libllvmForJSC.so from standard paths since not installed binaries
2313         have the RPATH set. If it fails try the installed one. For
2314         production buils load always the installed one.
2315
2316 2015-11-15  Saam barati  <sbarati@apple.com>
2317
2318         64-bit in the DFG: non tail Calls unnecessarily store the argument count twice on the callee frame and tails calls unnecessarily store it once
2319         https://bugs.webkit.org/show_bug.cgi?id=151297
2320
2321         Reviewed by Geoffrey Garen.
2322
2323         Non tail calls only need to store the count once. Tail calls
2324         never need to store the count on the callee frame because they
2325         will be reusing the caller's frame.
2326
2327         * dfg/DFGSpeculativeJIT64.cpp:
2328         (JSC::DFG::SpeculativeJIT::emitCall):
2329
2330 2015-11-15  Adam Bergkvist  <adam.bergkvist@ericsson.com>
2331
2332         WebRTC: Update RTCPeerConnection API and introduce PeerConnectionBackend
2333         https://bugs.webkit.org/show_bug.cgi?id=150166
2334
2335         Reviewed by Eric Carlson and Youenn Fablet
2336
2337         Added generic isDictionary() function to GlobalObject.js that tests if a
2338         value can be interpreted as a dictionary.
2339
2340         * builtins/GlobalObject.js:
2341         (isDictionary):
2342         * runtime/JSGlobalObject.cpp:
2343         (JSC::JSGlobalObject::init):
2344
2345 2015-11-14  Michael Saboff  <msaboff@apple.com>
2346
2347         REGRESSION (r190370): CrashTracer: [USER] com.apple.WebKit.WebContent at com.apple.JavaScriptCore: JSC::JITCode::execute + 158
2348         https://bugs.webkit.org/show_bug.cgi?id=151279
2349
2350         Reviewed by Geoffrey Garen.
2351
2352         We need to restore callee saves even when we take the slow path in a polymorphic call stub.
2353         Move the restoration to the top of the stub so that it is done for all paths.
2354
2355         * jit/Repatch.cpp:
2356         (JSC::linkPolymorphicCall):
2357
2358 2015-11-13  Commit Queue  <commit-queue@webkit.org>
2359
2360         Unreviewed, rolling out r192416 and r192443.
2361         https://bugs.webkit.org/show_bug.cgi?id=151285
2362
2363         Broke 32-bit in some mysterious way I need to understand
2364         (Requested by kling on #webkit).
2365
2366         Reverted changesets:
2367
2368         "[JSC] JSPropertyNameEnumerator could be destructorless."
2369         https://bugs.webkit.org/show_bug.cgi?id=151242
2370         http://trac.webkit.org/changeset/192416
2371
2372         "Follow-up for 32-bit test failures after..."
2373         https://bugs.webkit.org/show_bug.cgi?id=151242
2374         http://trac.webkit.org/changeset/192443
2375
2376 2015-11-13  Commit Queue  <commit-queue@webkit.org>
2377
2378         Unreviewed, rolling out r192401.
2379         https://bugs.webkit.org/show_bug.cgi?id=151282
2380
2381         "caused crashes on animometer" (Requested by thorton on
2382         #webkit).
2383
2384         Reverted changeset:
2385
2386         "Restore CodeBlock jettison code I accidentally removed"
2387         https://bugs.webkit.org/show_bug.cgi?id=151241
2388         http://trac.webkit.org/changeset/192401
2389
2390 2015-11-13  Andreas Kling  <akling@apple.com>
2391
2392         Follow-up for 32-bit test failures after...
2393         [JSC] JSPropertyNameEnumerator could be destructorless.
2394         <https://webkit.org/b/151242>
2395
2396         Reviewed by Mark Lam
2397
2398         Apparently copied space allocations need to be in multiples of 8 bytes.
2399         Have JSPropertyNameEnumerator do what other copied space clients already do
2400         and round the allocation size up to a multiple of 8.
2401
2402         Added a little helper function to compute the allocation size so this doesn't
2403         have to be repeated everywhere.
2404
2405         * runtime/JSPropertyNameEnumerator.cpp:
2406         (JSC::JSPropertyNameEnumerator::finishCreation):
2407         (JSC::JSPropertyNameEnumerator::visitChildren):
2408         (JSC::JSPropertyNameEnumerator::copyBackingStore):
2409         * runtime/JSPropertyNameEnumerator.h:
2410
2411 2015-11-13  Saam barati  <sbarati@apple.com>
2412
2413         sub IC does not properly handle exception handling now that try/catch is compiled in the FTL
2414         https://bugs.webkit.org/show_bug.cgi?id=151080
2415
2416         Reviewed by Geoffrey Garen.
2417
2418         This patch implements proper exception handling for ArithSubs with binaryUseKind as
2419         UntypedUse inside try/catch.  We implement this in a very similar way as we implement 
2420         exception handling from GetById/PutById/LazySlowPaths callOperation calls. We do the needed 
2421         spilling if the result is the same register as the left/right register because in the event
2422         of an exception, we don't want to do value recovery on the garbage result, we
2423         want to do it on the original lhs/rhs of the operation.
2424
2425         This patch also does some refactoring. No longer does OSRExitDescriptor
2426         have a long list of booleans that correspond to different OSR exit types.
2427         It now just has an enum property called ExceptionType that tells us
2428         what type of exception handler the OSR exit is. Then, we can just ask
2429         interesting questions about the OSR exit and get answers based on its
2430         ExceptionType property.
2431
2432         * ftl/FTLCompile.cpp:
2433         (JSC::FTL::mmAllocateDataSection):
2434         * ftl/FTLExceptionHandlerManager.cpp:
2435         (JSC::FTL::ExceptionHandlerManager::addNewExit):
2436         (JSC::FTL::ExceptionHandlerManager::callOperationExceptionTarget):
2437         (JSC::FTL::ExceptionHandlerManager::lazySlowPathExceptionTarget):
2438         (JSC::FTL::ExceptionHandlerManager::getByIdOSRExit):
2439         (JSC::FTL::ExceptionHandlerManager::subOSRExit):
2440         (JSC::FTL::ExceptionHandlerManager::getCallOSRExitCommon):
2441         (JSC::FTL::ExceptionHandlerManager::getOrPutByIdCallOperationExceptionTarget): Deleted.
2442         * ftl/FTLExceptionHandlerManager.h:
2443         * ftl/FTLExitThunkGenerator.cpp:
2444         (JSC::FTL::ExitThunkGenerator::emitThunk):
2445         * ftl/FTLLowerDFGToLLVM.cpp:
2446         (JSC::FTL::DFG::LowerDFGToLLVM::lower):
2447         (JSC::FTL::DFG::LowerDFGToLLVM::compileArithAddOrSub):
2448         (JSC::FTL::DFG::LowerDFGToLLVM::compilePutById):
2449         (JSC::FTL::DFG::LowerDFGToLLVM::compileCallOrConstruct):
2450         (JSC::FTL::DFG::LowerDFGToLLVM::compileCallOrConstructVarargs):
2451         (JSC::FTL::DFG::LowerDFGToLLVM::compileInvalidationPoint):
2452         (JSC::FTL::DFG::LowerDFGToLLVM::getById):
2453         (JSC::FTL::DFG::LowerDFGToLLVM::lazySlowPath):
2454         (JSC::FTL::DFG::LowerDFGToLLVM::callCheck):
2455         (JSC::FTL::DFG::LowerDFGToLLVM::appendOSRExitArgumentsForPatchpointIfWillCatchException):
2456         (JSC::FTL::DFG::LowerDFGToLLVM::emitBranchToOSRExitIfWillCatchException):
2457         (JSC::FTL::DFG::LowerDFGToLLVM::lowBlock):
2458         (JSC::FTL::DFG::LowerDFGToLLVM::appendOSRExitDescriptor):
2459         (JSC::FTL::DFG::LowerDFGToLLVM::appendOSRExit):
2460         (JSC::FTL::DFG::LowerDFGToLLVM::buildExitArguments):
2461         * ftl/FTLOSRExit.cpp:
2462         (JSC::FTL::OSRExitDescriptor::OSRExitDescriptor):
2463         (JSC::FTL::OSRExitDescriptor::willArriveAtExitFromIndirectExceptionCheck):
2464         (JSC::FTL::OSRExitDescriptor::mightArriveAtOSRExitFromGenericUnwind):
2465         (JSC::FTL::OSRExitDescriptor::mightArriveAtOSRExitFromCallOperation):
2466         (JSC::FTL::OSRExitDescriptor::needsRegisterRecoveryOnGenericUnwindOSRExitPath):
2467         (JSC::FTL::OSRExitDescriptor::isExceptionHandler):
2468         (JSC::FTL::OSRExitDescriptor::validateReferences):
2469         (JSC::FTL::OSRExit::OSRExit):
2470         (JSC::FTL::OSRExit::codeLocationForRepatch):
2471         (JSC::FTL::OSRExit::gatherRegistersToSpillForCallIfException):
2472         (JSC::FTL::OSRExit::spillRegistersToSpillSlot):
2473         (JSC::FTL::OSRExit::recoverRegistersFromSpillSlot):
2474         * ftl/FTLOSRExit.h:
2475         * ftl/FTLOSRExitCompilationInfo.h:
2476         (JSC::FTL::OSRExitCompilationInfo::OSRExitCompilationInfo):
2477         * ftl/FTLOSRExitCompiler.cpp:
2478         (JSC::FTL::compileFTLOSRExit):
2479         * tests/stress/ftl-try-catch-arith-sub-exception.js: Added.
2480         (assert):
2481         (let.o.valueOf):
2482         (baz):
2483         (foo):
2484         (bar):
2485
2486 2015-11-13  Caitlin Potter  <caitpotter88@gmail.com>
2487
2488         Allow any LeftHandSideExpression as a valid AssignmentElement
2489         https://bugs.webkit.org/show_bug.cgi?id=151026
2490
2491         Reviewed by Geoffrey Garen.
2492
2493         * bytecompiler/NodesCodegen.cpp:
2494         (JSC::AssignmentElementNode::collectBoundIdentifiers):
2495         (JSC::AssignmentElementNode::bindValue):
2496         (JSC::AssignmentElementNode::toString):
2497         * parser/ASTBuilder.h:
2498         (JSC::ASTBuilder::isAssignmentLocation):
2499         (JSC::ASTBuilder::createAssignmentElement):
2500         * parser/NodeConstructors.h:
2501         (JSC::AssignmentElementNode::AssignmentElementNode):
2502         * parser/Nodes.h:
2503         (JSC::AssignmentElementNode::assignmentTarget):
2504         (JSC::AssignmentElementNode::divotStart):
2505         (JSC::AssignmentElementNode::divotEnd):
2506         * parser/Parser.cpp:
2507         (JSC::Parser<LexerType>::createAssignmentElement):
2508         (JSC::Parser<LexerType>::parseDestructuringPattern):
2509         * parser/Parser.h:
2510         * parser/SyntaxChecker.h:
2511         (JSC::SyntaxChecker::operatorStackPop):
2512
2513 2015-11-13  Yusuke Suzuki  <utatane.tea@gmail.com>
2514
2515         op_assert should declare that it uses the first register argument
2516         https://bugs.webkit.org/show_bug.cgi?id=151183
2517
2518         Reviewed by Geoffrey Garen.
2519
2520         op_assert(conditionRegister, lineNumber) should declare that it
2521         *uses* (in terms of use-def) the first `conditionRegister` and
2522         it does not define any variables.
2523
2524         * bytecode/BytecodeUseDef.h:
2525         (JSC::computeUsesForBytecodeOffset):
2526
2527 2015-11-13  Andreas Kling  <akling@apple.com>
2528
2529         [JSC] JSPropertyNameEnumerator could be destructorless.
2530         <https://webkit.org/b/151242>
2531
2532         Reviewed by Mark Lam.
2533
2534         Make JSPropertyNameEnumerator destructorless and have it store the property names
2535         cache in CopiedSpace. This was the most popular occupant of 64-byte destructor cells
2536         in MarkedSpace, so making it destructorless gets rid of some ill-filled MarkedBlocks.
2537
2538         * heap/CopyToken.h:
2539         * runtime/JSPropertyNameEnumerator.cpp:
2540         (JSC::JSPropertyNameEnumerator::finishCreation):
2541         (JSC::JSPropertyNameEnumerator::visitChildren):
2542         (JSC::JSPropertyNameEnumerator::copyBackingStore):
2543         (JSC::JSPropertyNameEnumerator::destroy): Deleted.
2544         * runtime/JSPropertyNameEnumerator.h:
2545
2546 2015-11-12  Benjamin Poulain  <bpoulain@apple.com>
2547
2548         [JSC] Do not generate an Add when adding a zero immediate to something
2549         https://bugs.webkit.org/show_bug.cgi?id=151171
2550
2551         Reviewed by Geoffrey Garen.
2552
2553         Avoid generating an add if one of arguments is a zero immediate.
2554
2555         On x86, the add32/64() were also used internally for branchAdd32/64.
2556         I split the code that sets flag to add32AndSetFlags() to make sure
2557         we always force the flags before testing.
2558
2559         I could have used CMp to set the flags but I would gain nothing from
2560         that, cmp is just a SUB.
2561
2562         * assembler/MacroAssemblerARM64.h:
2563         (JSC::MacroAssemblerARM64::add32):
2564         (JSC::MacroAssemblerARM64::add64):
2565         * assembler/MacroAssemblerARMv7.h:
2566         (JSC::MacroAssemblerARMv7::add32):
2567         * assembler/MacroAssemblerX86.h:
2568         (JSC::MacroAssemblerX86::add32):
2569         * assembler/MacroAssemblerX86Common.h:
2570         (JSC::MacroAssemblerX86Common::add32):
2571         (JSC::MacroAssemblerX86Common::branchAdd32):
2572         (JSC::MacroAssemblerX86Common::add32AndSetFlags):
2573         * assembler/MacroAssemblerX86_64.h:
2574         (JSC::MacroAssemblerX86_64::add32):
2575         (JSC::MacroAssemblerX86_64::add64):
2576         (JSC::MacroAssemblerX86_64::branchAdd64):
2577         (JSC::MacroAssemblerX86_64::add64AndSetFlags):
2578
2579 2015-11-12  Geoffrey Garen  <ggaren@apple.com>
2580
2581         Restore CodeBlock jettison code I accidentally removed
2582         https://bugs.webkit.org/show_bug.cgi?id=151241
2583
2584         Reviewed by Andreas Kling.
2585
2586         I meant to add this back in <http://trac.webkit.org/changeset/190827>
2587         but I missed.
2588
2589         * bytecode/CodeBlock.cpp:
2590         (JSC::timeToLive):
2591         (JSC::CodeBlock::shouldJettisonDueToOldAge):
2592
2593 2015-11-12  Filip Pizlo  <fpizlo@apple.com>
2594
2595         B3 should be able to compile programs with CheckAdd, CheckSub, and CheckMul
2596         https://bugs.webkit.org/show_bug.cgi?id=151213
2597
2598         Reviewed by Benjamin Poulain.
2599
2600         This adds lowering code for CheckAdd, CheckSub, and CheckMul along with support for CheckNeg
2601         (i.e. CheckSub with the left child being zero).
2602
2603         This adds tests for these things, by simulating what JS would do: if there is overflow, revert
2604         to double math. To write the test, I needed support for IToD so I added that support.
2605
2606         This also fixes a memory corruption bug in the register allocator.
2607
2608         Also fixes a bug in opcode_generator.rb where we were emitting stray "return" statements inside
2609         switch statements. I think this was benign, but I'm not sure, so I fixed it.
2610
2611         Note that I had to convert CheckMul handling to always use a three-operand form. That's because
2612         there is no other way to tell Air that we need the original value alive. This means that on X86
2613         we'll emit an extra Move just before the checked mul. That's probably fine since that's
2614         necessary anyway.
2615
2616         * assembler/MacroAssemblerX86_64.h:
2617         (JSC::MacroAssemblerX86_64::branchMul64):
2618         (JSC::MacroAssemblerX86_64::branchSub64):
2619         * b3/B3CheckSpecial.cpp:
2620         (JSC::B3::CheckSpecial::generate):
2621         * b3/B3Const32Value.cpp:
2622         (JSC::B3::Const32Value::mulConstant):
2623         (JSC::B3::Const32Value::checkAddConstant):
2624         (JSC::B3::Const32Value::checkSubConstant):
2625         (JSC::B3::Const32Value::checkMulConstant):
2626         (JSC::B3::Const32Value::divConstant):
2627         * b3/B3Const32Value.h:
2628         * b3/B3Const64Value.cpp:
2629         (JSC::B3::Const64Value::mulConstant):
2630         (JSC::B3::Const64Value::checkAddConstant):
2631         (JSC::B3::Const64Value::checkSubConstant):
2632         (JSC::B3::Const64Value::checkMulConstant):
2633         (JSC::B3::Const64Value::divConstant):
2634         * b3/B3Const64Value.h:
2635         * b3/B3LowerToAir.cpp:
2636         (JSC::B3::Air::LowerToAir::appendUnOp):
2637         (JSC::B3::Air::LowerToAir::ensureSpecial):
2638         (JSC::B3::Air::LowerToAir::ensureCheckSpecial):
2639         (JSC::B3::Air::LowerToAir::fillStackmap):
2640         (JSC::B3::Air::LowerToAir::lower):
2641         * b3/B3ReduceStrength.cpp:
2642         * b3/B3Value.cpp:
2643         (JSC::B3::Value::mulConstant):
2644         (JSC::B3::Value::checkAddConstant):
2645         (JSC::B3::Value::checkSubConstant):
2646         (JSC::B3::Value::checkMulConstant):
2647         (JSC::B3::Value::divConstant):
2648         * b3/B3Value.h:
2649         * b3/air/AirIteratedRegisterCoalescing.cpp:
2650         (JSC::B3::Air::iteratedRegisterCoalescing):
2651         * b3/air/AirOpcode.opcodes:
2652         * b3/air/opcode_generator.rb:
2653         * b3/testb3.cpp:
2654         (JSC::B3::testCheckMegaCombo):
2655         (JSC::B3::testCheckAddImm):
2656         (JSC::B3::testCheckAdd):
2657         (JSC::B3::testCheckAdd64):
2658         (JSC::B3::testCheckAddFold):
2659         (JSC::B3::testCheckAddFoldFail):
2660         (JSC::B3::testCheckSubImm):
2661         (JSC::B3::testCheckSub):
2662         (JSC::B3::doubleSub):
2663         (JSC::B3::testCheckSub64):
2664         (JSC::B3::testCheckSubFold):
2665         (JSC::B3::testCheckSubFoldFail):
2666         (JSC::B3::testCheckNeg):
2667         (JSC::B3::testCheckNeg64):
2668         (JSC::B3::testCheckMul):
2669         (JSC::B3::testCheckMul64):
2670         (JSC::B3::testCheckMulFold):
2671         (JSC::B3::testCheckMulFoldFail):
2672         (JSC::B3::genericTestCompare):
2673         (JSC::B3::run):
2674
2675 2015-11-12  Joseph Pecoraro  <pecoraro@apple.com>
2676
2677         Web Inspector: Reduce list of saved console messages
2678         https://bugs.webkit.org/show_bug.cgi?id=151225
2679
2680         Reviewed by Geoffrey Garen.
2681
2682         Inspector saves messages so that when an inspector frontend opens it can report
2683         these messages to the frontend. However we were saving a rather large list of
2684         1000 messages. Most pages do not produce a large number of console messages.
2685         However pages that live for a long time can generate many errors over time,
2686         especially periodic engine issues such as cross-origin access errors. This could
2687         result in a lot of wasted memory for console messages that may never be used.
2688
2689         Likewise when an inspector first open sending all 1000 messages to the frontend
2690         results in a poor experience.
2691
2692         Lets reduce the list of saved messages. Developer will still be able to see
2693         all messages as long as they have Web Inspector open at the time the messages
2694         are generated.
2695
2696         * inspector/agents/InspectorConsoleAgent.cpp:
2697         Reduce the list from 1000 to 100. Also, when expiring
2698         messages from this list, chunk in 10s instead of 100s.
2699
2700 2015-11-12  Mark Lam  <mark.lam@apple.com>
2701
2702         Adjust timeout values in ExecutionTimeLimitTest.
2703         https://bugs.webkit.org/show_bug.cgi?id=151223
2704
2705         Reviewed by Geoffrey Garen.
2706
2707         Some bots were not happy with the existing time out values.  I adjusted them to give
2708         the system a little more time to fire the timer events, and this made the bots happy.
2709
2710         * API/tests/ExecutionTimeLimitTest.cpp:
2711         (testExecutionTimeLimit):
2712
2713 2015-11-12  Filip Pizlo  <fpizlo@apple.com>
2714
2715         B3 should be able to compile Patchpoints with Register and Any constraints
2716         https://bugs.webkit.org/show_bug.cgi?id=151209
2717
2718         Reviewed by Geoffrey Garen.
2719
2720         Most of this patch is about adding tests, since Register constraints already worked but
2721         were untested, and almost all forms of the Any constraint worked.
2722
2723         One change that I'm making is that Patchpoints now default to forCall effects rather
2724         than no effects. I think this is better because if a client of Patchpoint never supplies
2725         any effects, it's best to assume the worst.
2726
2727         My testing uncovered only one real bug: moveConstants() would turn all non-zero double
2728         constants into Loads, so the optimization to fold constants into a Stackmap would stop
2729         working. Instead of telling the Stackmap that the double value it wanted is actually a
2730         constant, we would tell it that it's a register and it would emit code to materialize
2731         the double into that register. I worked around this by having moveConstants() create
2732         ConstDoubleValue's just for the Stackmaps, which lowerToAir() recognizes and does the
2733         right thing with (i.e. folds into the stackmap instead of materializing).
2734
2735         * b3/B3LowerToAir.cpp:
2736         (JSC::B3::Air::LowerToAir::fillStackmap):
2737         (JSC::B3::Air::LowerToAir::lower):
2738         * b3/B3MoveConstants.cpp:
2739         * b3/B3PatchpointValue.cpp:
2740         (JSC::B3::PatchpointValue::PatchpointValue):
2741         * b3/testb3.cpp:
2742         (JSC::B3::testPatchpointCallArg):
2743         (JSC::B3::testPatchpointFixedRegister):
2744         (JSC::B3::testPatchpointAny):
2745         (JSC::B3::testPatchpointAnyImm):
2746         (JSC::B3::testPatchpointManyImms):
2747         (JSC::B3::testSimpleCheck):
2748         (JSC::B3::run):
2749
2750 2015-11-12  Mark Lam  <mark.lam@apple.com>
2751
2752         Move some prototypes to header files.
2753         https://bugs.webkit.org/show_bug.cgi?id=151194
2754
2755         Reviewed by Michael Saboff.
2756
2757         * assembler/MacroAssemblerPrinter.cpp:
2758         (JSC::printIndent):
2759         * assembler/MacroAssemblerPrinter.h:
2760         (JSC::MacroAssembler::print):
2761
2762 2015-11-12  Csaba Osztrogonác  <ossy@webkit.org>
2763
2764         Remove ENABLE(SATURATED_LAYOUT_ARITHMETIC) guards
2765         https://bugs.webkit.org/show_bug.cgi?id=150972
2766
2767         Reviewed by Darin Adler.
2768
2769         * Configurations/FeatureDefines.xcconfig:
2770
2771 2015-11-11  Benjamin Poulain  <bpoulain@apple.com>
2772
2773         [JSC] Air: we have more register than what the allocator believed
2774         https://bugs.webkit.org/show_bug.cgi?id=151182
2775
2776         Reviewed by Michael Saboff.
2777
2778         I was using GPRInfo/FPRInfo to get the number of register while coloring the interference graph.
2779         The problem is, those classes are lying about register availability.
2780
2781         They don't report stuff reserved by the MacroAssembler and reserve some registers.
2782         FPRInfo is the worst, reporting only 6 of the 15 registers we have.
2783
2784         The ground truth in our case is that we can color with all the registers returned
2785         by regsInPriorityOrder(). I changed IteratedRegisterCoalescingAllocator to use that value.
2786
2787         The new test testSpillFP() covers simple spilling of doubles.
2788
2789         * b3/air/AirIteratedRegisterCoalescing.cpp:
2790         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::IteratedRegisterCoalescingAllocator):
2791         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::makeWorkList):
2792         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::decrementDegree):
2793         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::precoloredCoalescingHeuristic):
2794         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::conservativeHeuristic):
2795         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::addWorkList):
2796         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::combine):
2797         (JSC::B3::Air::IteratedRegisterCoalescingAllocator::freezeMoves):
2798         * b3/testb3.cpp:
2799         (JSC::B3::testSpillFP):
2800         (JSC::B3::run):
2801
2802 2015-11-11  Mark Lam  <mark.lam@apple.com>
2803
2804         The BinarySnippetRegisterContext needs to copy the result back from the scratch register.
2805         https://bugs.webkit.org/show_bug.cgi?id=150712
2806
2807         Reviewed by Geoffrey Garen.
2808
2809         If the BinarySnippetRegisterContext had re-assigned the result register to a scratch
2810         before emitting the snippet, it needs to copy the result back from the scratch after
2811         the snippet is done.
2812
2813         This fixes the cdjs-tests.yaml/main.js.ftl failure reported in
2814         https://bugs.webkit.org/show_bug.cgi?id=150687.
2815
2816         Also added an optimization to check for the case where any of the left, right,
2817         or result registers are aliased together, and to map them to the corresponding
2818         allocated scratch register for their alias instead of allocating separate ones.
2819
2820         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
2821         * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj.filters:
2822         - Added JITSubGenerator.h to these project files for completeness.
2823
2824         * ftl/FTLCapabilities.cpp:
2825         (JSC::FTL::canCompile):
2826         - Re-enable ArithSub handling of UntypedUse operands.
2827
2828         * ftl/FTLCompile.cpp:
2829
2830         * ftl/FTLInlineCacheSize.cpp:
2831         (JSC::FTL::sizeOfArithSub):
2832         - Adjusted IC sizes to account for the snippet changes.
2833
2834 2015-11-11  Mark Lam  <mark.lam@apple.com>
2835
2836         Crash in sorting-benchmark.js on ARM64 with full op_sub FTL coverage.
2837         https://bugs.webkit.org/show_bug.cgi?id=150936
2838
2839         Reviewed by Michael Saboff.
2840
2841         The OSR entry thunk does not currently restore the callee saved registers that the baseline
2842         JIT saves but the DFG does not.  As a result, sorting-benchmark.js was crashing with the
2843         following scenario:
2844
2845             1. There exists 2 functions: benchmark() and bottom_up_merge_sort().
2846                Let's call them A() and B() respectively for brevity.
2847             2. A() is FTL compiled.
2848             3. B() is FTL compiled.
2849             4. FTL A() calls FTL B().  FTL B() trashes register x26.
2850             5. FTL B() goes through an OSR exit, and deopts to baseline.  The OSR exit off-ramp
2851                puts x26's original value in the baseline B()'s stash location for x26 in its stack
2852                frame.  It expects baseline B() to restore x26 when it returns.
2853             6. Baseline B() gets DFG optimized, and we OSR enter into DFG B().
2854                The OSR entry thunk does nothing to restore x26's original value.  Hence, x26 contains
2855                whatever value FTL B() left in it.
2856             7. DFG B() returns to FTL A().
2857                x26 is not one of the callee saved registers used by DFG B().  Hence, it does nothing
2858                to restore it.
2859             8. FTL A() tries to use x26 and crashes, because x26 contains FTL B()'s value for it, and
2860                not FTL A()'s.
2861
2862         This patch fixes this issue by having the OSR entry thunk restore all the callee saved
2863         registers before running the DFG code.
2864
2865         No new test needed because this issue will be covered by sorting-benchmark.js as soon as
2866         https://bugs.webkit.org/show_bug.cgi?id=150712 lands.
2867
2868         * dfg/DFGThunks.cpp:
2869         (JSC::DFG::osrEntryThunkGenerator):
2870
2871 2015-11-11  Benjamin Poulain  <bpoulain@apple.com>
2872
2873         [JSC] Add a comment explaining the opcode suffixes on x86
2874         https://bugs.webkit.org/show_bug.cgi?id=151176
2875
2876         Reviewed by Alex Christensen.
2877
2878         * assembler/X86Assembler.h:
2879         I was always confused with the prefixes. Gavin pointed out the Intel documentation
2880         explains everything.
2881         I added a comment to help the next person confused about those suffixes.
2882
2883 2015-11-11  Benjamin Poulain  <bpoulain@apple.com>
2884
2885         [JSC] Support Doubles with B3's Add
2886         https://bugs.webkit.org/show_bug.cgi?id=151164
2887
2888         Reviewed by Filip Pizlo.
2889
2890         I tweaked ReduceStrength a bit to maintain correctness.
2891         Nothing fancy otherwise.
2892
2893         * b3/B3LowerToAir.cpp:
2894         (JSC::B3::Air::LowerToAir::lower):
2895         * b3/B3ReduceStrength.cpp:
2896         * b3/B3Value.h:
2897         * b3/B3ValueInlines.h:
2898         (JSC::B3::Value::isInteger):
2899         * b3/air/AirOpcode.opcodes:
2900         * b3/testb3.cpp:
2901         (JSC::B3::bitWiseEqual):
2902         (JSC::B3::testAddArgDouble):
2903         (JSC::B3::testAddArgsDouble):
2904         (JSC::B3::testAddArgImmDouble):
2905         (JSC::B3::testAddImmArgDouble):
2906         (JSC::B3::testAddImmsDouble):
2907         (JSC::B3::run):
2908
2909 2015-11-11  Filip Pizlo  <fpizlo@apple.com>
2910
2911         B3 should be able to compile a program with Switch
2912         https://bugs.webkit.org/show_bug.cgi?id=151115
2913
2914         Reviewed by Benjamin Poulain.
2915
2916         Adds lowering of Switch to a binary switch. This doesn't require any Air support.
2917
2918         * b3/B3BasicBlock.cpp:
2919         (JSC::B3::BasicBlock::append):
2920         (JSC::B3::BasicBlock::removeLast):
2921         (JSC::B3::BasicBlock::replaceLast):
2922         * b3/B3BasicBlock.h:
2923         * b3/B3BlockInsertionSet.cpp:
2924         (JSC::B3::BlockInsertionSet::insertBefore):
2925         (JSC::B3::BlockInsertionSet::insertAfter):
2926         (JSC::B3::BlockInsertionSet::splitForward):
2927         * b3/B3BlockInsertionSet.h:
2928         * b3/B3ControlValue.h:
2929         * b3/B3Generate.cpp:
2930         (JSC::B3::generateToAir):
2931         * b3/B3LowerMacros.cpp:
2932         * b3/B3SwitchValue.cpp:
2933         (JSC::B3::SwitchValue::dumpMeta):
2934         (JSC::B3::SwitchValue::SwitchValue):
2935         * b3/B3SwitchValue.h:
2936         * b3/testb3.cpp:
2937         (JSC::B3::testChillDiv64):
2938         (JSC::B3::testSwitch):
2939         (JSC::B3::run):
2940
2941 2015-11-11  Filip Pizlo  <fpizlo@apple.com>
2942
2943         Patchpoints with stackArgument constraints should work
2944         https://bugs.webkit.org/show_bug.cgi?id=151177
2945
2946         Reviewed by Saam Barati.
2947
2948         The only thing broken was that StackmapSpecial's isValidForm would reject Arg::addr, so
2949         validation would fail after allocateStack.
2950
2951         In order for StackmapSpecial to validate Arg::addr, it needs to know the frame size. To know
2952         the frame size, it needs access to Code&. So, this changes Air::Special to always have a
2953         pointer back to Code.
2954
2955         Other than this already worked.
2956
2957         * b3/B3StackmapSpecial.cpp:
2958         (JSC::B3::StackmapSpecial::isValidImpl):
2959         * b3/air/AirCode.cpp:
2960         (JSC::B3::Air::Code::addSpecial):
2961         * b3/air/AirSpecial.cpp:
2962         (JSC::B3::Air::Special::Special):
2963         * b3/air/AirSpecial.h:
2964         (JSC::B3::Air::Special::code):
2965         * b3/testb3.cpp:
2966         (JSC::B3::testSimplePatchpoint):
2967         (JSC::B3::testPatchpointCallArg):
2968         (JSC::B3::testSimpleCheck):
2969         (JSC::B3::run):
2970
2971 2015-11-11  Mark Lam  <mark.lam@apple.com>
2972
2973         Add ability to insert probes in LLVM IR that we generate.
2974         https://bugs.webkit.org/show_bug.cgi?id=151159
2975
2976         Reviewed by Geoffrey Garen.
2977
2978         This is done by inserting a stackmap intrinsic and emitting the probe there.
2979
2980         We can now insert probes that take a lambda like so:
2981
2982             probe([] (CCallHelpers::ProbeContext*) {
2983                 dataLog("Hello FTL\n");
2984             });
2985
2986         * ftl/FTLCompile.cpp:
2987         * ftl/FTLInlineCacheDescriptor.h:
2988         (JSC::FTL::ProbeDescriptor::ProbeDescriptor):
2989         (JSC::FTL::ProbeDescriptor::probeFunction):
2990         * ftl/FTLInlineCacheSize.cpp:
2991         (JSC::FTL::sizeOfProbe):
2992         * ftl/FTLInlineCacheSize.h:
2993         * ftl/FTLLowerDFGToLLVM.cpp:
2994         (JSC::FTL::DFG::LowerDFGToLLVM::probe):
2995         * ftl/FTLState.h:
2996
2997 2015-11-11  Mark Lam  <mark.lam@apple.com>
2998
2999         Change probe CPUState gpr() and fpr() to return references.
3000         https://bugs.webkit.org/show_bug.cgi?id=151154
3001
3002         Reviewed by Saam Barati.
3003
3004         This will allow us to set their values as well as reading them.
3005
3006         * assembler/AbstractMacroAssembler.h:
3007         (JSC::AbstractMacroAssembler::CPUState::gpr):
3008         (JSC::AbstractMacroAssembler::CPUState::fpr):
3009         (JSC::AbstractMacroAssembler::ProbeContext::gpr):
3010         (JSC::AbstractMacroAssembler::ProbeContext::fpr):
3011
3012 2015-11-11  Mark Lam  <mark.lam@apple.com>
3013
3014         Add convenience utility to support dataLogging opcodeIDs.
3015         https://bugs.webkit.org/show_bug.cgi?id=151117
3016
3017         Reviewed by Saam Barati.
3018
3019         * bytecode/Opcode.cpp:
3020         (WTF::printInternal):
3021         * bytecode/Opcode.h:
3022
3023 2015-11-10  Keith Miller  <keith_miller@apple.com>
3024
3025         Regression(r191815): 5.3% regression on Dromaeo JS Library Benchmark
3026         https://bugs.webkit.org/show_bug.cgi?id=150945
3027
3028         Reviewed by Filip Pizlo.
3029
3030         This patch fixes a performance regression introduced by r191815. Before adding Symbol.toStringTag
3031         we would cache the value of Object.prototype.toString() in the rareData of the structure.
3032         In order to cache the result of Object.prototype.toString() we now need to ensure that the
3033         value stored in Symbol.toStringTag is a known constant. Thus, in order to ensure the stored Symbol.toStringTag
3034         value remains constant adaptive inferred value watchpoints have been re-factored to be generalizable and
3035         a new version that clears the toString value cache when fired has been added.
3036
3037         * JavaScriptCore.xcodeproj/project.pbxproj:
3038         * bytecode/AdaptiveInferredPropertyValueWatchpointBase.cpp: Copied from Source/JavaScriptCore/dfg/DFGAdaptiveInferredPropertyValueWatchpoint.cpp.
3039         (JSC::AdaptiveInferredPropertyValueWatchpointBase::AdaptiveInferredPropertyValueWatchpointBase):
3040         (JSC::AdaptiveInferredPropertyValueWatchpointBase::install):
3041         (JSC::AdaptiveInferredPropertyValueWatchpointBase::fire):
3042         (JSC::AdaptiveInferredPropertyValueWatchpointBase::StructureWatchpoint::fireInternal):
3043         (JSC::AdaptiveInferredPropertyValueWatchpointBase::PropertyWatchpoint::fireInternal):
3044         * bytecode/AdaptiveInferredPropertyValueWatchpointBase.h: Copied from Source/JavaScriptCore/dfg/DFGAdaptiveInferredPropertyValueWatchpoint.h.
3045         (JSC::AdaptiveInferredPropertyValueWatchpointBase::key):
3046         (JSC::AdaptiveInferredPropertyValueWatchpointBase::StructureWatchpoint::StructureWatchpoint):
3047         (JSC::AdaptiveInferredPropertyValueWatchpointBase::PropertyWatchpoint::PropertyWatchpoint):
3048         * dfg/DFGAdaptiveInferredPropertyValueWatchpoint.cpp:
3049         (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::AdaptiveInferredPropertyValueWatchpoint):
3050         (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::handleFire):
3051         (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::install): Deleted.
3052         (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::fire): Deleted.
3053         (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::StructureWatchpoint::fireInternal): Deleted.
3054         (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::PropertyWatchpoint::fireInternal): Deleted.
3055         * dfg/DFGAdaptiveInferredPropertyValueWatchpoint.h:
3056         (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::key): Deleted.
3057         (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::StructureWatchpoint::StructureWatchpoint): Deleted.
3058         (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::PropertyWatchpoint::PropertyWatchpoint): Deleted.
3059         * runtime/ObjectPrototype.cpp:
3060         (JSC::objectProtoFuncToString):
3061         * runtime/Structure.h:
3062         * runtime/StructureInlines.h:
3063         (JSC::Structure::setObjectToStringValue):
3064         * runtime/StructureRareData.cpp:
3065         (JSC::StructureRareData::StructureRareData):
3066         (JSC::StructureRareData::setObjectToStringValue):
3067         (JSC::StructureRareData::clearObjectToStringValue):
3068         (JSC::ObjectToStringAdaptiveStructureWatchpoint::ObjectToStringAdaptiveStructureWatchpoint):
3069         (JSC::ObjectToStringAdaptiveStructureWatchpoint::install):
3070         (JSC::ObjectToStringAdaptiveStructureWatchpoint::fireInternal):
3071         (JSC::ObjectToStringAdaptiveInferredPropertyValueWatchpoint::ObjectToStringAdaptiveInferredPropertyValueWatchpoint):
3072         (JSC::ObjectToStringAdaptiveInferredPropertyValueWatchpoint::handleFire):
3073         * runtime/StructureRareData.h:
3074         * runtime/StructureRareDataInlines.h:
3075         (JSC::StructureRareData::setObjectToStringValue): Deleted.
3076         * tests/stress/symbol-tostringtag-watchpoints.js: Added.
3077         (Base):
3078
3079         * CMakeLists.txt:
3080         * JavaScriptCore.xcodeproj/project.pbxproj:
3081         * bytecode/AdaptiveInferredPropertyValueWatchpointBase.cpp: Copied from Source/JavaScriptCore/dfg/DFGAdaptiveInferredPropertyValueWatchpoint.cpp.
3082         (JSC::AdaptiveInferredPropertyValueWatchpointBase::AdaptiveInferredPropertyValueWatchpointBase):
3083         (JSC::AdaptiveInferredPropertyValueWatchpointBase::install):
3084         (JSC::AdaptiveInferredPropertyValueWatchpointBase::fire):
3085         (JSC::AdaptiveInferredPropertyValueWatchpointBase::StructureWatchpoint::fireInternal):
3086         (JSC::AdaptiveInferredPropertyValueWatchpointBase::PropertyWatchpoint::fireInternal):
3087         * bytecode/AdaptiveInferredPropertyValueWatchpointBase.h: Copied from Source/JavaScriptCore/dfg/DFGAdaptiveInferredPropertyValueWatchpoint.h.
3088         (JSC::AdaptiveInferredPropertyValueWatchpointBase::key):
3089         (JSC::AdaptiveInferredPropertyValueWatchpointBase::StructureWatchpoint::StructureWatchpoint):
3090         (JSC::AdaptiveInferredPropertyValueWatchpointBase::PropertyWatchpoint::PropertyWatchpoint):
3091         * dfg/DFGAdaptiveInferredPropertyValueWatchpoint.cpp:
3092         (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::AdaptiveInferredPropertyValueWatchpoint):
3093         (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::handleFire):
3094         (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::install): Deleted.
3095         (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::fire): Deleted.
3096         (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::StructureWatchpoint::fireInternal): Deleted.
3097         (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::PropertyWatchpoint::fireInternal): Deleted.
3098         * dfg/DFGAdaptiveInferredPropertyValueWatchpoint.h:
3099         (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::key): Deleted.
3100         (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::StructureWatchpoint::StructureWatchpoint): Deleted.
3101         (JSC::DFG::AdaptiveInferredPropertyValueWatchpoint::PropertyWatchpoint::PropertyWatchpoint): Deleted.
3102         * runtime/ObjectPrototype.cpp:
3103         (JSC::objectProtoFuncToString):
3104         * runtime/Structure.h:
3105         * runtime/StructureInlines.h:
3106         (JSC::Structure::setObjectToStringValue):
3107         * runtime/StructureRareData.cpp:
3108         (JSC::StructureRareData::StructureRareData):
3109         (JSC::StructureRareData::setObjectToStringValue):
3110         (JSC::StructureRareData::clearObjectToStringValue):
3111         (JSC::ObjectToStringAdaptiveStructureWatchpoint::ObjectToStringAdaptiveStructureWatchpoint):
3112         (JSC::ObjectToStringAdaptiveStructureWatchpoint::install):
3113         (JSC::ObjectToStringAdaptiveStructureWatchpoint::fireInternal):
3114         (JSC::ObjectToStringAdaptiveInferredPropertyValueWatchpoint::ObjectToStringAdaptiveInferredPropertyValueWatchpoint):
3115         (JSC::ObjectToStringAdaptiveInferredPropertyValueWatchpoint::handleFire):
3116         * runtime/StructureRareData.h:
3117         * runtime/StructureRareDataInlines.h:
3118         (JSC::StructureRareData::setObjectToStringValue): Deleted.
3119         * tests/stress/symbol-tostringtag-watchpoints.js: Added.
3120         (Base):
3121
3122 2015-11-11  Filip Pizlo  <fpizlo@apple.com>
3123
3124         B3 should be able to compile and canonicalize Mul
3125         https://bugs.webkit.org/show_bug.cgi?id=151124
3126
3127         Reviewed by Geoffrey Garen.
3128
3129         This was a strange trip. I wanted to do a quick patch to implement Mul. But then I realized
3130         that our tradition when adding new lowerings was to also add the corresponding strength
3131         reductions. So then I wrote the Mul->Shl strength reduction. But that reminded me that I needed
3132         to canonicalize between Add(x, x) and Shl(x, 1). I decided that it would probably be better to
3133         use Shl(x, 1), since that only has one use of x. But that means that we should compile
3134         Shl(x, 1) to Add x, x in the backend, since that's what X86 wants. While doing that, I almost
3135         introduced a bug where Shl(Load(x), 1) would cause the compiler to either crash or generate bad
3136         code. That's because I was using Add(x, x) to handle Shl(x, 1), so we'd end up with
3137         Add(Load(x), Load(x)) - i.e. we would try to duplicate the Load.
3138
3139         The instruction selector already defends against this, and the only reason why I would have
3140         created the bug was by using the Add helper when compiling a Shl. Still, this was so close to
3141         a bad bug that I added a ton of new tests that cover the Op(x, x) where x = Load case.
3142
3143         * b3/B3Compilation.cpp:
3144         (JSC::B3::Compilation::Compilation):
3145         * b3/B3Compilation.h:
3146         (JSC::B3::Compilation::code):
3147         * b3/B3Const32Value.cpp:
3148         (JSC::B3::Const32Value::subConstant):
3149         (JSC::B3::Const32Value::mulConstant):
3150         (JSC::B3::Const32Value::bitAndConstant):
3151         * b3/B3Const32Value.h:
3152         * b3/B3Const64Value.cpp:
3153         (JSC::B3::Const64Value::subConstant):
3154         (JSC::B3::Const64Value::mulConstant):
3155         (JSC::B3::Const64Value::bitAndConstant):
3156         * b3/B3Const64Value.h:
3157         * b3/B3ConstDoubleValue.cpp:
3158         (JSC::B3::ConstDoubleValue::subConstant):
3159         (JSC::B3::ConstDoubleValue::mulConstant):
3160         (JSC::B3::ConstDoubleValue::equalConstant):
3161         * b3/B3ConstDoubleValue.h:
3162         * b3/B3Generate.cpp:
3163         (JSC::B3::generate):
3164         (JSC::B3::generateToAir):
3165         * b3/B3Generate.h:
3166         * b3/B3LowerToAir.cpp:
3167         (JSC::B3::Air::LowerToAir::appendBinOp):
3168         (JSC::B3::Air::LowerToAir::createGenericCompare):
3169         (JSC::B3::Air::LowerToAir::lower):
3170         * b3/B3ReduceStrength.cpp:
3171         * b3/B3Value.cpp:
3172         (JSC::B3::Value::subConstant):
3173         (JSC::B3::Value::mulConstant):
3174         (JSC::B3::Value::bitAndConstant):
3175         * b3/B3Value.h:
3176         * b3/air/AirOpcode.opcodes:
3177         * b3/testb3.cpp:
3178         (JSC::B3::compile):
3179         (JSC::B3::testReturnConst64):
3180         (JSC::B3::testAddArg):
3181         (JSC::B3::testAddArgs):
3182         (JSC::B3::testAddArgs32):
3183         (JSC::B3::testAddLoadTwice):
3184         (JSC::B3::testMulArg):
3185         (JSC::B3::testMulArgs):
3186         (JSC::B3::testMulArgImm):
3187         (JSC::B3::testMulImmArg):
3188         (JSC::B3::testMulArgs32):
3189         (JSC::B3::testMulLoadTwice):
3190         (JSC::B3::testSubArg):
3191         (JSC::B3::testSubArgs):
3192         (JSC::B3::testShlArgImm):
3193         (JSC::B3::testShlArg32):
3194         (JSC::B3::testShlArgs32):
3195         (JSC::B3::testSShrArgImm):
3196         (JSC::B3::testSShrArg32):
3197         (JSC::B3::testSShrArgs32):
3198         (JSC::B3::testZShrArgImm):
3199         (JSC::B3::testZShrArg32):
3200         (JSC::B3::testZShrArgs32):
3201         (JSC::B3::genericTestCompare):
3202         (JSC::B3::testCompareLoad):
3203         (JSC::B3::testCompareImpl):
3204         (JSC::B3::run):
3205
3206 2015-11-11  Yusuke Suzuki  <utatane.tea@gmail.com>
3207
3208         Update ES6 Generators' status to "In Development"
3209         https://bugs.webkit.org/show_bug.cgi?id=151142
3210
3211         Reviewed by Saam Barati.
3212
3213         Currently, features.json raises some linting errors.
3214         This should be cleaned up in another patch.
3215
3216         * features.json:
3217
3218 2015-11-10  Filip Pizlo  <fpizlo@apple.com>
3219
3220         B3 should be able to compile a program with ChillDiv
3221         https://bugs.webkit.org/show_bug.cgi?id=151114
3222
3223         Reviewed by Benjamin Poulain.
3224
3225         This change is about a lot more than ChillDiv. I picked that as the next thing to lower
3226         because I knew that it would force me to come up with a sensible idiom for doing
3227         stepwise lowerings that require breaking basic blocks. The idea is that you want to
3228         write a loop that iterates forward over the program, which turns some operations that
3229         currently are just single Values into an entire little sub-CFGs. That requires splitting
3230         the block that contained the original Value. That's tricky if you then want to keep
3231         iterating: the index of the Value you were last looking at has now changed and your
3232         InsertionSets are now invalid.
3233
3234         This introduces an idiom that handles this. It's BlockInsertionSet::splitBefore(). The
3235         idea is that it uses the current block before the split as the continuation after the
3236         split. When you call splitBefore(), you pass it your loop index and your InsertionSet
3237         (if applicable). It makes sure that it changes those auxiliary things in such a way that
3238         you can keep looping.
3239
3240         This uncovered some bugs, since this is the first time that we're compiling cross edges.
3241
3242         Because ChillDiv is really a division, I also had to write a bunch of code to support
3243         the ordinary B3 Div. While doing that, I realized that there was asymmetry to that
3244         constness of the Value constant folding methods, so I fixed that as well.
3245
3246         * JavaScriptCore.xcodeproj/project.pbxproj:<