B3 IntRange analysis should know more about shifting
[WebKit-https.git] / Source / JavaScriptCore / ChangeLog
1 2016-01-27  Filip Pizlo  <fpizlo@apple.com>
2
3         B3 IntRange analysis should know more about shifting
4         https://bugs.webkit.org/show_bug.cgi?id=153568
5
6         Reviewed by Benjamin Poulain.
7
8         This teaches the IntRange analysis that the result of a right shift is usually better than
9         the worst-case mask based on the shift amount. In fact, you can reach useful conclusions
10         from looking at the IntRange of the input. This helps because Octane/crypto does something
11         like:
12
13             CheckMul((@x & $268435455) >> 14, @y >> 14, ...)
14
15         If you consider just the shifts, then this may overflow. But if you consider that @x is
16         first masked, then the IntRange coming out of the first shift is tight enough to prove that
17         the CheckMul cannot overflow.
18
19         * b3/B3ReduceStrength.cpp:
20         * b3/testb3.cpp:
21
22 2016-01-27  Benjamin Poulain  <bpoulain@apple.com>
23
24         [JSC] adjustFrameAndStackInOSRExitCompilerThunk() can trash values in FTL
25         https://bugs.webkit.org/show_bug.cgi?id=153536
26
27         Reviewed by Saam Barati.
28
29         Workaround to get B3 working on ARM.
30
31         * dfg/DFGOSRExitCompilerCommon.h:
32         (JSC::DFG::adjustFrameAndStackInOSRExitCompilerThunk):
33         The code was using the scratch registers in a few places.
34
35         I initially tried to make is not use scratch registers anywhere
36         but that looked super fragile.
37
38         Instead, I just preserve the scratch registers. That's easy and
39         it should be relatively cheap compared to everything done on OSR Exits.
40
41 2016-01-27  Konstantin Tokarev  <annulen@yandex.ru>
42
43         [mips] Use reinterpret_cast_ptr to suppress alignment warnings.
44         https://bugs.webkit.org/show_bug.cgi?id=153424
45
46         Reviewed by Darin Adler.
47
48         * runtime/JSGenericTypedArrayView.h:
49         (JSC::JSGenericTypedArrayView::sortFloat):
50
51 2016-01-27  Per Arne Vollan  <peavo@outlook.com>
52
53         [FTL][Win64] Compile fix.
54         https://bugs.webkit.org/show_bug.cgi?id=153555
55
56         Reviewed by Alex Christensen.
57
58         MSVC does not accept preprocessor conditionals in macros.
59
60         * ftl/FTLOSRExitCompiler.cpp:
61         (JSC::FTL::compileStub):
62
63 2016-01-27  Filip Pizlo  <fpizlo@apple.com>
64
65         Air::TmpWidth uses a stale pointer into its HashMap after it calls add()
66         https://bugs.webkit.org/show_bug.cgi?id=153546
67
68         Reviewed by Saam Barati.
69
70         * b3/air/AirTmpWidth.cpp:
71         (JSC::B3::Air::TmpWidth::recompute):
72
73 2016-01-27  Alexey Proskuryakov  <ap@apple.com>
74
75         Remove ENABLE_CURRENTSRC
76         https://bugs.webkit.org/show_bug.cgi?id=153545
77
78         Reviewed by Simon Fraser.
79
80         * Configurations/FeatureDefines.xcconfig:
81
82 2016-01-26  Benjamin Poulain  <benjamin@webkit.org>
83
84         [JSC] When lowering B3 to Air, preferRightForResult() should prefer values from the same block
85         https://bugs.webkit.org/show_bug.cgi?id=153477
86
87         Reviewed by Filip Pizlo.
88
89         In cases like this:
90
91         Block #0
92             @1 = something
93             @2 = Jump #1
94         Block #1
95             @3 = something else
96             @4 = Add(@3, @1)
97             ...
98             @42 = Branch(@x, #1, #2)
99
100         B3LowerToAir would pick @1 for the argument copied
101         for what goes into the UseDef side of Add.
102
103         This created a bunch of moves that could never be coalesced.
104         In Kraken's imaging-desaturate, there were enough Moves to slow
105         down the hot loop.
106
107         Ideally, we should not use UseCount for lowering. We should use
108         the real liveness for preferRightForResult(), and a loop-weighted
109         use-count for effective addresses. The problem is keeping the cost
110         low for those simple helpers.
111
112         In this patch, I went with a simple heuristic: prioritize the value
113         defined in the same block for UseDef.
114
115         There is one other way that would be cheap but a bit invasive:
116         -Get rid of UseDef.
117         -Make every ops, 3 operands.
118         -Tell the register allocator to attempt aliasing of the 2 uses
119          with the def.
120         -If the allocator fails, just add a move as needed.
121
122         For now, the simple heuristic seems okay for the cases have.
123
124         * b3/B3LowerToAir.cpp:
125         (JSC::B3::Air::LowerToAir::preferRightForResult):
126
127 2016-01-26  Filip Pizlo  <fpizlo@apple.com>
128
129         Tail duplication should break critical edges first
130         https://bugs.webkit.org/show_bug.cgi?id=153530
131
132         Reviewed by Benjamin Poulain.
133
134         This speeds up Octane/boyer.
135
136         * b3/B3DuplicateTails.cpp:
137
138 2016-01-26  Joseph Pecoraro  <pecoraro@apple.com>
139
140         Generalize ResourceUsageData gathering to be used outside of ResourceUsageOverlay
141         https://bugs.webkit.org/show_bug.cgi?id=153509
142         <rdar://problem/24354291>
143
144         Reviewed by Andreas Kling.
145
146         * heap/Heap.h:
147         * heap/HeapInlines.h:
148         (JSC::Heap::didAllocateBlock):
149         (JSC::Heap::didFreeBlock):
150         Rename the ENABLE flag.
151
152 2016-01-26  Csaba Osztrogonác  <ossy@webkit.org>
153
154         [B3] Fix control reaches end of non-void function GCC warning after r195139
155         https://bugs.webkit.org/show_bug.cgi?id=153426
156
157         Reviewed by Michael Catanzaro.
158
159         * b3/air/AirArg.h:
160         (JSC::B3::Air::Arg::cooled):
161
162 2016-01-26  Saam barati  <sbarati@apple.com>
163
164         testb3 and testAir should be compiled under -O0
165         https://bugs.webkit.org/show_bug.cgi?id=153520
166
167         Reviewed by Benjamin Poulain.
168
169         * JavaScriptCore.xcodeproj/project.pbxproj:
170
171 2016-01-26  Filip Pizlo  <fpizlo@apple.com>
172
173         B3's integer range analysis should know that Mul'ing two sufficiently small numbers will yield a number that still has a meaningful range
174         https://bugs.webkit.org/show_bug.cgi?id=153518
175
176         Reviewed by Benjamin Poulain.
177
178         Octane/encrypt had an addition overflow check that can be proved away by being sufficiently
179         sneaky about the analysis of adds, multiplies, and shifts.
180
181         I almost added these optimizations to the DFG integer range optimization phase. That phase is
182         very complicated. B3's integer range analysis is trivial. So I added it to B3. Eventually
183         we'll want this same machinery in the DFG also.
184
185         8% speed-up on Octane/encrypt.
186
187         * b3/B3ReduceStrength.cpp:
188         * b3/B3Value.cpp:
189         (JSC::B3::Value::dump): Dumping a constant value's name now dumps its value. This makes a huge difference for reading IR.
190         (JSC::B3::Value::cloneImpl):
191         (JSC::B3::Value::deepDump):
192
193 2016-01-26  Filip Pizlo  <fpizlo@apple.com>
194
195         It should be possible to disable FTL for a range like we disable DFG for a range
196         https://bugs.webkit.org/show_bug.cgi?id=153511
197
198         Reviewed by Geoffrey Garen.
199
200         * dfg/DFGTierUpCheckInjectionPhase.cpp:
201         (JSC::DFG::TierUpCheckInjectionPhase::run):
202         * runtime/Options.h:
203
204 2016-01-26  Filip Pizlo  <fpizlo@apple.com>
205
206         Shifts by an amount computed using BitAnd with a mask that subsumes the shift's own mask should be rewired around the BitAnd
207         https://bugs.webkit.org/show_bug.cgi?id=153505
208
209         Reviewed by Saam Barati.
210
211         Turn this: Shl(@x, BitAnd(@y, 63))
212         Into this: Shl(@x, @y)
213
214         It matters for Octane/crypto.
215
216         We should also stop FTL from generating such code, but even if we did that, we'd still want
217         this optimization in case user code did the BitAnd.
218
219         Also we can't stop the FTL from generating such code yet, because when targetting LLVM, you
220         must mask your shifts this way.
221
222         * b3/B3ReduceStrength.cpp:
223
224 2016-01-26  Filip Pizlo  <fpizlo@apple.com>
225
226         The thing that B3 uses to describe a stack slot should not be a Value
227         https://bugs.webkit.org/show_bug.cgi?id=153491
228         rdar://problem/24349446
229
230         Reviewed by Geoffrey Garen and Saam Barati.
231
232         Prior to this change, B3 represented stack slots by having a StackSlotValue that carried
233         two meanings:
234
235         - It represented a stack slot.
236
237         - It was a kind of Value for getting the base of the stack slot.
238
239         This seems like a good idea until you consider the following issues.
240
241         1) A Value can be killed if it is on an unreachable path, or if it has no effects and
242            nobody refers to it. But the FTL uses StackSlotValue to allocate space on the stack.
243            When it does this, it doesn't want it to be killed. It will dereference the object, so
244            killing it is a bug.
245
246         2) A premise of B3 is that it should be always legal to perform the following
247            transformation on a value:
248
249            value->replaceWithIdentity(insertionSet.insertValue(index, proc.clone(value)));
250
251            This inserts a new value just before the old one. The new value is a clone of the old
252            one. Then the old one is essentially deleted (anything that becomes an identity dies
253            shortly thereafter). Problem (1) prevents this from being legal, which breaks a major
254            premise of B3 IR.
255
256         3) A premise of B3 is that it should be always legal to perform the following
257            transformation on a value:
258
259            Before:
260                    @42 = Thing(...)
261
262            After:
263                    Branch(@doesntMatter, #yes, #no)
264                BB#yes:
265                    @42_one = Thing(...)
266                    Upsilon(@42_one, ^42)
267                    Jump(#done)
268                BB#no:
269                    @42_two = Thing(...)
270                    Upsilon(@42_two, ^42)
271                    Jump(#done)
272                BB#done:
273                    @42 = Phi()
274
275            But prior to this change, such a transformation makes absolutely no sense for
276            StackSlot. It will "work" in the sense that the compiler will proceed undaunted, but
277            it will disable SSA fix-up for the cloned stack slot and we will end up allocating two
278            stack slots instead of one, and then we will assume that they both escape, which will
279            disable efficient stack allocation. Note that the moral equivalent of this
280            transformation could already happen due to tail duplication, and the only reason why
281            it's not a bug right now is that we happen to hoist stack slots to the root block. But
282            the whole point of our stack slots was supposed to be that they do not have to be
283            hoisted.
284
285         This change fixes this issue by splitting StackSlotValue into two things: SlotBaseValue,
286         which is a pure operation for getting the base address of a StackSlot, and StackSlot,
287         which is a representation of the actual stack slot. StackSlot cannot get duplicated and
288         can only be killed if it's anonymous. SlotBaseValue can be killed, moved, cloned,
289         hoisted, etc. Since it has no effects and it has a ValueKey, it's one of the most
290         permissive Values in the IR, just as one would hope (after all, there is actually zero
291         code that needs to execute to evaluate SlotBaseValue).
292
293         This fixes a crash that we saw with GuardMalloc and ASan. It also makes the IR a lot more
294         easy to reason about.
295
296         * CMakeLists.txt:
297         * JavaScriptCore.xcodeproj/project.pbxproj:
298         * b3/B3EliminateCommonSubexpressions.cpp:
299         * b3/B3FixSSA.cpp:
300         (JSC::B3::demoteValues):
301         (JSC::B3::fixSSA):
302         * b3/B3LowerToAir.cpp:
303         (JSC::B3::Air::LowerToAir::run):
304         (JSC::B3::Air::LowerToAir::effectiveAddr):
305         (JSC::B3::Air::LowerToAir::lower):
306         * b3/B3Opcode.cpp:
307         (WTF::printInternal):
308         * b3/B3Opcode.h:
309         * b3/B3Procedure.cpp:
310         (JSC::B3::Procedure::setBlockOrderImpl):
311         (JSC::B3::Procedure::addStackSlot):
312         (JSC::B3::Procedure::addAnonymousStackSlot):
313         (JSC::B3::Procedure::clone):
314         (JSC::B3::Procedure::dump):
315         (JSC::B3::Procedure::blocksInPostOrder):
316         (JSC::B3::Procedure::deleteStackSlot):
317         (JSC::B3::Procedure::deleteValue):
318         (JSC::B3::Procedure::calleeSaveRegisters):
319         (JSC::B3::Procedure::addStackSlotIndex):
320         (JSC::B3::Procedure::addValueIndex):
321         * b3/B3Procedure.h:
322         (JSC::B3::Procedure::setBlockOrder):
323         (JSC::B3::Procedure::StackSlotsCollection::StackSlotsCollection):
324         (JSC::B3::Procedure::StackSlotsCollection::size):
325         (JSC::B3::Procedure::StackSlotsCollection::at):
326         (JSC::B3::Procedure::StackSlotsCollection::operator[]):
327         (JSC::B3::Procedure::StackSlotsCollection::iterator::iterator):
328         (JSC::B3::Procedure::StackSlotsCollection::iterator::operator*):
329         (JSC::B3::Procedure::StackSlotsCollection::iterator::operator++):
330         (JSC::B3::Procedure::StackSlotsCollection::iterator::operator==):
331         (JSC::B3::Procedure::StackSlotsCollection::iterator::operator!=):
332         (JSC::B3::Procedure::StackSlotsCollection::iterator::findNext):
333         (JSC::B3::Procedure::StackSlotsCollection::begin):
334         (JSC::B3::Procedure::StackSlotsCollection::end):
335         (JSC::B3::Procedure::stackSlots):
336         (JSC::B3::Procedure::ValuesCollection::ValuesCollection):
337         * b3/B3ReduceStrength.cpp:
338         * b3/B3SlotBaseValue.cpp: Copied from Source/JavaScriptCore/b3/B3StackSlotValue.cpp.
339         (JSC::B3::SlotBaseValue::~SlotBaseValue):
340         (JSC::B3::SlotBaseValue::dumpMeta):
341         (JSC::B3::SlotBaseValue::cloneImpl):
342         (JSC::B3::StackSlotValue::~StackSlotValue): Deleted.
343         (JSC::B3::StackSlotValue::dumpMeta): Deleted.
344         (JSC::B3::StackSlotValue::cloneImpl): Deleted.
345         * b3/B3SlotBaseValue.h: Copied from Source/JavaScriptCore/b3/B3StackSlotValue.h.
346         * b3/B3StackSlot.cpp: Added.
347         (JSC::B3::StackSlot::~StackSlot):
348         (JSC::B3::StackSlot::dump):
349         (JSC::B3::StackSlot::deepDump):
350         (JSC::B3::StackSlot::StackSlot):
351         * b3/B3StackSlot.h: Added.
352         (JSC::B3::StackSlot::byteSize):
353         (JSC::B3::StackSlot::kind):
354         (JSC::B3::StackSlot::isLocked):
355         (JSC::B3::StackSlot::index):
356         (JSC::B3::StackSlot::offsetFromFP):
357         (JSC::B3::StackSlot::setOffsetFromFP):
358         (JSC::B3::DeepStackSlotDump::DeepStackSlotDump):
359         (JSC::B3::DeepStackSlotDump::dump):
360         (JSC::B3::deepDump):
361         * b3/B3StackSlotValue.cpp: Removed.
362         * b3/B3StackSlotValue.h: Removed.
363         * b3/B3Validate.cpp:
364         * b3/B3Value.cpp:
365         (JSC::B3::Value::effects):
366         (JSC::B3::Value::key):
367         (JSC::B3::Value::checkOpcode):
368         * b3/B3ValueKey.cpp:
369         (JSC::B3::ValueKey::materialize):
370         * b3/air/AirCode.cpp:
371         (JSC::B3::Air::Code::addBlock):
372         (JSC::B3::Air::Code::addStackSlot):
373         (JSC::B3::Air::Code::addSpecial):
374         * b3/air/AirCode.h:
375         * b3/air/AirStackSlot.cpp:
376         (JSC::B3::Air::StackSlot::setOffsetFromFP):
377         (JSC::B3::Air::StackSlot::dump):
378         (JSC::B3::Air::StackSlot::deepDump):
379         (JSC::B3::Air::StackSlot::StackSlot):
380         * b3/air/AirStackSlot.h:
381         (JSC::B3::Air::StackSlot::alignment):
382         (JSC::B3::Air::StackSlot::b3Slot):
383         (JSC::B3::Air::StackSlot::offsetFromFP):
384         (WTF::printInternal):
385         (JSC::B3::Air::StackSlot::value): Deleted.
386         * b3/testb3.cpp:
387         (JSC::B3::testStackSlot):
388         (JSC::B3::testStoreLoadStackSlot):
389         * ftl/FTLB3Compile.cpp:
390         * ftl/FTLB3Output.cpp:
391         (JSC::FTL::Output::appendTo):
392         (JSC::FTL::Output::lockedStackSlot):
393         (JSC::FTL::Output::neg):
394         * ftl/FTLB3Output.h:
395         (JSC::FTL::Output::framePointer):
396         (JSC::FTL::Output::constBool):
397         (JSC::FTL::Output::constInt32):
398         * ftl/FTLLowerDFGToLLVM.cpp:
399         (JSC::FTL::DFG::LowerDFGToLLVM::lower):
400         * ftl/FTLState.h:
401
402 2016-01-26  Benjamin Poulain  <benjamin@webkit.org>
403
404         Remove a useless #include
405         https://bugs.webkit.org/show_bug.cgi?id=153474
406
407         Reviewed by Alexey Proskuryakov.
408
409         * b3/B3ReduceStrength.cpp:
410
411 2016-01-26  Alex Christensen  <achristensen@webkit.org>
412
413         [Win] Fix clean build after r195545.
414         ​https://bugs.webkit.org/show_bug.cgi?id=153434
415
416         * CMakeLists.txt:
417         * PlatformWin.cmake:
418         Derived sources need to be copied after the build, but everything else should be copied before.
419         This should fix ews issues like the one seen in bug 153473.
420
421 2016-01-25  Filip Pizlo  <fpizlo@apple.com>
422
423         FTLB3Output should maintain good block order like the LLVM one does
424         https://bugs.webkit.org/show_bug.cgi?id=152222
425
426         Reviewed by Geoffrey Garen.
427
428         This fixes FTLB3Output to emit an ordered B3 IR. This makes inspecting IR *a lot* easier.
429         It will also be a performance win whenever we use range-based data structures for
430         liveness.
431
432         Also two small other changes:
433         - Added some more dumping in integer range optimization phase.
434         - Refined the disassembler's printing of instruction width suffixes so that "jzl" is not
435           a thing. It was using "l" as the suffix because jumps take a 32-bit immediate.
436
437         * b3/B3Procedure.cpp:
438         (JSC::B3::Procedure::addBlock):
439         (JSC::B3::Procedure::setBlockOrderImpl):
440         (JSC::B3::Procedure::clone):
441         * b3/B3Procedure.h:
442         (JSC::B3::Procedure::frontendData):
443         (JSC::B3::Procedure::setBlockOrder):
444         * dfg/DFGIntegerRangeOptimizationPhase.cpp:
445         * disassembler/udis86/udis86_syn-att.c:
446         (ud_translate_att):
447         * ftl/FTLB3Output.cpp:
448         (JSC::FTL::Output::initialize):
449         (JSC::FTL::Output::newBlock):
450         (JSC::FTL::Output::applyBlockOrder):
451         (JSC::FTL::Output::appendTo):
452         * ftl/FTLB3Output.h:
453         (JSC::FTL::Output::setFrequency):
454         (JSC::FTL::Output::insertNewBlocksBefore):
455         (JSC::FTL::Output::callWithoutSideEffects):
456         (JSC::FTL::Output::newBlock): Deleted.
457         * ftl/FTLLowerDFGToLLVM.cpp:
458         (JSC::FTL::DFG::LowerDFGToLLVM::lower):
459
460 2016-01-25  Skachkov Oleksandr  <gskachkov@gmail.com>
461
462         [ES6] Arrow function syntax. Arrow function specific features. Lexical bind "arguments"
463         https://bugs.webkit.org/show_bug.cgi?id=145132
464
465         Reviewed by Saam Barati.
466         
467         Added support of ES6 arrow function specific feature, lexical bind of arguments. 
468         http://www.ecma-international.org/ecma-262/6.0/#sec-arrow-function-definitions-runtime-semantics-evaluation
469         'arguments' variable in arrow function must resolve to a binding in a lexically enclosing environment.
470         In srict mode it points to arguments object, and in non-stric mode it points to arguments object or varible 
471         with name 'arguments' if it was declared. 
472
473         * bytecompiler/BytecodeGenerator.cpp:
474         (JSC::BytecodeGenerator::BytecodeGenerator):
475         * parser/Parser.h:
476         (JSC::Scope::Scope):
477         (JSC::Scope::setSourceParseMode):
478         (JSC::Scope::isArrowFunction):
479         (JSC::Scope::collectFreeVariables):
480         (JSC::Scope::setIsArrowFunction):
481         * tests/es6.yaml:
482         * tests/stress/arrowfunction-lexical-bind-arguments-non-strict-1.js: Added.
483         * tests/stress/arrowfunction-lexical-bind-arguments-non-strict-2.js: Added.
484         * tests/stress/arrowfunction-lexical-bind-arguments-strict.js: Added.
485
486 2016-01-25  Benjamin Poulain  <bpoulain@apple.com>
487
488         [JSC] We should never use x18 on iOS ARM64
489         https://bugs.webkit.org/show_bug.cgi?id=153461
490
491         Reviewed by Filip Pizlo.
492
493         The register x18 is reserved in the iOS variant of the ARM64 ABI.
494
495         The weird thing is: if you use it, its value will change completely
496         randomly. It looks like it is changed by the system on interrupts.
497
498         This patch adds x18 to the reserved register and add assertions
499         to the assembler to prevent similar problems in the future.
500
501         * assembler/ARM64Assembler.h:
502         (JSC::ARM64Assembler::xOrSp):
503         (JSC::ARM64Assembler::xOrZr):
504         * assembler/AbstractMacroAssembler.h:
505         (JSC::isIOS): Deleted.
506         * assembler/AssemblerCommon.h:
507         (JSC::isIOS):
508         * jit/RegisterSet.cpp:
509         (JSC::RegisterSet::reservedHardwareRegisters):
510
511 2016-01-25  Commit Queue  <commit-queue@webkit.org>
512
513         Unreviewed, rolling out r195550.
514         https://bugs.webkit.org/show_bug.cgi?id=153471
515
516         broke animometer bot (and now we have crash logs!) (Requested
517         by kling on #webkit).
518
519         Reverted changeset:
520
521         "Restore CodeBlock jettison code Geoff accidentally removed"
522         https://bugs.webkit.org/show_bug.cgi?id=151241
523         http://trac.webkit.org/changeset/195550
524
525 2016-01-25  Andreas Kling  <akling@apple.com>
526
527         MarkedSpace should have more precise allocators.
528         <https://webkit.org/b/153448>
529         <rdar://problem/23897477>
530
531         Reviewed by Geoffrey Garen.
532
533         The four classes responsible for the bulk of MarkedBlock allocations today are:
534
535             - FunctionCodeBlock (640 bytes)
536             - UnlinkedFunctionCodeBlock (304 bytes)
537             - FunctionExecutable (168 bytes)
538             - UnlinkedFunctionExecutable (144 bytes)
539
540         Due to the size class distribution in MarkedSpace, we've been wasting quite a lot
541         of heap space on these objects. Our "precise" allocators allowed allocation sizes
542         in 16-byte increments up to 128 bytes, but after that point, we'd only allocate
543         in 256-byte size increments.
544
545         Thus each instance of those classes would waste space as follows:
546
547             - FunctionCodeBlock (768-byte cell, 128 bytes wasted)
548             - UnlinkedFunctionCodeBlock (512-byte cell, 208 bytes wasted)
549             - FunctionExecutable(256-byte cell, 88 bytes wasted)
550             - UnlinkedFunctionExecutable(256-byte cell, 112 bytes wasted)
551
552         This patch raises the limit for precise allocations from 128 to 768, allowing us
553         to allocate these objects with far better space efficiency.
554
555         The cost of this is 7kB worth of MarkedAllocators and 70 (~2x) more allocators to
556         iterate whenever we iterate all the allocators.
557
558         * heap/MarkedSpace.h:
559         * heap/MarkedSpace.cpp:
560         (JSC::MarkedSpace::MarkedSpace):
561         (JSC::MarkedSpace::resetAllocators):
562         (JSC::MarkedSpace::forEachAllocator):
563         (JSC::MarkedSpace::isPagedOut):
564
565 2016-01-25  Filip Pizlo  <fpizlo@apple.com>
566
567         Fix the comment about FTL_USES_B3.
568
569         * dfg/DFGCommon.h:
570
571 2016-01-25  Filip Pizlo  <fpizlo@apple.com>
572
573         Switch FTL to B3 on X86_64/Mac
574         https://bugs.webkit.org/show_bug.cgi?id=153445
575
576         Rubber stamped by Geoffrey Garen.
577
578         This finally switches from LLVM to B3 in the FTL on X86_64 on the Mac. We recommend that other
579         X86_64 platforms make the switch as well. We will be focusing our performance work on B3 rather
580         than LLVM in the future. ARM64 support is also coming soon, so we will be able to remove FTL
581         LLVM code once that lands.
582
583         Right now this mostly appears as perf-neutral on the major tests. However, it does have the
584         following immediate benefits:
585
586         - Dramatic reduction in FTL compile times, on the order of 5x-10x. This means huge speed-ups in
587           shorter-running tests like V8Spider (21%) and JSRegress (8%).
588
589         - It makes the FTL simpler and more robust because we don't have to do stackmap section
590           parsing. This makes it easier to add new FTL features. We are already working on features,
591           like the sampling profiler, which will only have a FTL B3 implementation.
592
593         - Speed-ups on some throughput benchmarks like mandreel, richards, imaging-gaussian-blur. It's
594           still a slow down on other throughput benchmarks, though.
595
596         We started writing B3 in October, so it's pretty awesome that the throughput of the code it
597         generates is already on par with LLVM.
598         
599         This does not fundamentally change how the FTL works. FTL was built to lower DFG IR to a C-like
600         SSA IR, and then rely on powerful SSA optimizations and comprehensive instruction selection and
601         register allocation to turn that code into something that runs fast. B3 also has a C-like SSA
602         IR, has an instruction selector that is in some ways more powerful than LLVM's (B3 does global
603         instruction selection rather than block-local like LLVM), and it has a register allocator that
604         is in some ways more powerful also (B3 uses IRC, a mature graph coloring allocator, while LLVM
605         does not do graph coloring). We expect FTL B3's performance to improve a lot after we turn it
606         on and can focus our efforts on tuning it.
607
608         I didn't find any test regressions after running both JSC tests and layout tests. Basic
609         browsing still works. JetStream performance difference is within the margin of error. EWS is
610         happy.
611
612         * dfg/DFGCommon.h:
613
614 2016-01-25  Andreas Kling  <akling@apple.com>
615
616         Restore CodeBlock jettison code Geoff accidentally removed
617         https://bugs.webkit.org/show_bug.cgi?id=151241
618
619         Rubber-stamped by Geoffrey Garen.
620
621         Geoff meant to add this back in <http://trac.webkit.org/changeset/190827>
622         but missed.
623
624         Then he added it back in, but it was rolled out due to a crash on Animometer.
625         I can no longer produce a crash on Animometer, either with today's version of
626         the benchmark, or the one that existed at the time of the rollout.
627
628         Given this, let's roll it back in and see how it goes.
629
630         * bytecode/CodeBlock.cpp:
631         (JSC::timeToLive):
632         (JSC::CodeBlock::shouldJettisonDueToOldAge):
633
634 2016-01-22  Filip Pizlo  <fpizlo@apple.com>
635
636         mandreel should run just as fast in FTL B3 as FTL LLVM
637         https://bugs.webkit.org/show_bug.cgi?id=153394
638
639         Reviewed by Gavin Barraclough.
640
641         This fixes two performance bugs and one disassembler bug.
642
643         - B3 now turns Branches into Jumps when they are dominated by a Check on the same
644           condition. This is like the opposite of foldPathConstants() was doing.
645
646         - Air now supports adding to 8-bit or 16-bit memory locations on x86. B3 now knows how to
647           lower Store8(Add(Load8Z(...))) and various other things to these new instructions.
648
649         - Disassembler now knows to print out the instruction's width, whenever it has one.
650           Previously, we'd print movb, movw, movl, and movq as "mov", which is unhelpful if
651           you're storing an immediate, for example.
652
653         This adds a bunch of tests for the new instruction forms. This is a big speed-up on
654         mandreel. It makes us just as fast as LLVM on that benchmark.
655
656         * assembler/MacroAssemblerX86Common.h:
657         (JSC::MacroAssemblerX86Common::add32):
658         (JSC::MacroAssemblerX86Common::add8):
659         (JSC::MacroAssemblerX86Common::add16):
660         (JSC::MacroAssemblerX86Common::add32AndSetFlags):
661         (JSC::MacroAssemblerX86Common::clz32AfterBsr):
662         * assembler/X86Assembler.h:
663         (JSC::X86Assembler::addl_rm):
664         (JSC::X86Assembler::addb_rm):
665         (JSC::X86Assembler::addw_rm):
666         (JSC::X86Assembler::addl_ir):
667         (JSC::X86Assembler::addl_im):
668         (JSC::X86Assembler::addb_im):
669         (JSC::X86Assembler::addw_im):
670         (JSC::X86Assembler::addq_rr):
671         * b3/B3LowerToAir.cpp:
672         (JSC::B3::Air::LowerToAir::addr):
673         (JSC::B3::Air::LowerToAir::loadPromiseAnyOpcode):
674         (JSC::B3::Air::LowerToAir::loadPromise):
675         (JSC::B3::Air::LowerToAir::tryAppendStoreBinOp):
676         (JSC::B3::Air::LowerToAir::lower):
677         * b3/B3PureCSE.cpp:
678         (JSC::B3::PureCSE::clear):
679         (JSC::B3::PureCSE::findMatch):
680         (JSC::B3::PureCSE::process):
681         * b3/B3PureCSE.h:
682         * b3/B3ReduceStrength.cpp:
683         * b3/air/AirOpcode.opcodes:
684         * b3/testb3.cpp:
685         (JSC::B3::testNegPtr):
686         (JSC::B3::testStoreAddLoad32):
687         (JSC::B3::testStoreAddLoadImm32):
688         (JSC::B3::testStoreAddLoad8):
689         (JSC::B3::testStoreAddLoadImm8):
690         (JSC::B3::testStoreAddLoad16):
691         (JSC::B3::testStoreAddLoadImm16):
692         (JSC::B3::testStoreAddLoad64):
693         (JSC::B3::testStoreAddLoadImm64):
694         (JSC::B3::testStoreAddLoad32Index):
695         (JSC::B3::testStoreAddLoadImm32Index):
696         (JSC::B3::testStoreAddLoad8Index):
697         (JSC::B3::testStoreAddLoadImm8Index):
698         (JSC::B3::testStoreAddLoad16Index):
699         (JSC::B3::testStoreAddLoadImm16Index):
700         (JSC::B3::testStoreAddLoad64Index):
701         (JSC::B3::testStoreAddLoadImm64Index):
702         (JSC::B3::testStoreSubLoad):
703         (JSC::B3::run):
704         (JSC::B3::testStoreAddLoad): Deleted.
705         * disassembler/udis86/udis86_syn-att.c:
706         (ud_translate_att):
707
708 2016-01-25  Alex Christensen  <achristensen@webkit.org>
709
710         [Win] Copy forwarding headers before building a project
711         https://bugs.webkit.org/show_bug.cgi?id=153434
712
713         Reviewed by Brent Fulgham.
714
715         * CMakeLists.txt:
716         * PlatformWin.cmake:
717
718 2016-01-25  Andreas Kling  <akling@apple.com>
719
720         Reduce number of Structures created at startup.
721         <https://webkit.org/b/153399>
722
723         Reviewed by Darin Adler.
724
725         For *Constructor and *Prototype objects that are only created once per JSGlobalObject,
726         build up the Structures using addPropertyWithoutTransition() helpers to avoid creating
727         tons of transitions that would just end up floating around and never getting used.
728
729         * inspector/JSInjectedScriptHostPrototype.cpp:
730         (Inspector::JSInjectedScriptHostPrototype::finishCreation):
731         * inspector/JSJavaScriptCallFramePrototype.cpp:
732         (Inspector::JSJavaScriptCallFramePrototype::finishCreation):
733         * runtime/ArrayPrototype.cpp:
734         (JSC::ArrayPrototype::finishCreation):
735         * runtime/ConsolePrototype.cpp:
736         (JSC::ConsolePrototype::finishCreation):
737         * runtime/DatePrototype.cpp:
738         (JSC::DatePrototype::finishCreation):
739         * runtime/JSArrayBufferConstructor.cpp:
740         (JSC::JSArrayBufferConstructor::finishCreation):
741         * runtime/JSArrayBufferPrototype.cpp:
742         (JSC::JSArrayBufferPrototype::finishCreation):
743         * runtime/JSObject.cpp:
744         (JSC::JSObject::putDirectNativeFunctionWithoutTransition):
745         (JSC::JSObject::putDirectBuiltinFunctionWithoutTransition): Deleted.
746         * runtime/JSObject.h:
747         * runtime/JSPromiseConstructor.cpp:
748         (JSC::JSPromiseConstructor::addOwnInternalSlots):
749         * runtime/JSPromisePrototype.cpp:
750         (JSC::JSPromisePrototype::addOwnInternalSlots):
751         * runtime/JSTypedArrayViewConstructor.cpp:
752         (JSC::JSTypedArrayViewConstructor::finishCreation):
753         * runtime/JSTypedArrayViewPrototype.cpp:
754         (JSC::JSTypedArrayViewPrototype::finishCreation):
755         * runtime/MapIteratorPrototype.cpp:
756         (JSC::MapIteratorPrototype::finishCreation):
757         * runtime/MapPrototype.cpp:
758         (JSC::MapPrototype::finishCreation):
759         * runtime/NumberPrototype.cpp:
760         (JSC::NumberPrototype::finishCreation):
761         * runtime/ObjectConstructor.cpp:
762         (JSC::ObjectConstructor::finishCreation):
763         * runtime/ObjectPrototype.cpp:
764         (JSC::ObjectPrototype::finishCreation):
765         * runtime/SetIteratorPrototype.cpp:
766         (JSC::SetIteratorPrototype::finishCreation):
767         * runtime/SetPrototype.cpp:
768         (JSC::SetPrototype::finishCreation):
769         * runtime/StringPrototype.cpp:
770         (JSC::StringPrototype::finishCreation):
771         * runtime/WeakMapPrototype.cpp:
772         (JSC::WeakMapPrototype::finishCreation):
773         * runtime/WeakSetPrototype.cpp:
774         (JSC::WeakSetPrototype::finishCreation):
775
776 2016-01-22  Filip Pizlo  <fpizlo@apple.com>
777
778         B3 should strength-reduce division by a constant
779         https://bugs.webkit.org/show_bug.cgi?id=153386
780
781         Reviewed by Benjamin Poulain.
782
783         You can turn a 32-bit division by a constant into a 64-bit multiplication by a constant
784         plus some shifts. A book called "Hacker's Delight" has a bunch of math about this. The
785         hard part is finding the constant by which to multiply, and the amount by which to shift.
786         The book tells you some theroems, but you still have to turn that into code by thinking
787         deep thoughts. Luckily I was able to avoid that because it turns out that LLVM already
788         has code for this. It's called APInt::magic(), where APInt is their class for reasoning
789         about integers.
790
791         The code has a compatible license to ours and we have already in the past taken code from
792         LLVM. So, that's what this patch does. The LLVM code is localized in
793         B3ComputeDivisionMagic.h. Then reduceStrength() uses that to construct the multiply+shift
794         sequence.
795
796         This is an enormous speed-up on AsmBench-0.9/bigfib.cpp.js. It makes us as fast on that
797         test as LLVM. It reduces our deficit on AsmBench to 1.5%. Previously it was 4.5%.
798
799         * JavaScriptCore.xcodeproj/project.pbxproj:
800         * b3/B3ComputeDivisionMagic.h: Added.
801         (JSC::B3::computeDivisionMagic):
802         * b3/B3ReduceStrength.cpp:
803
804 2016-01-22  Saam barati  <sbarati@apple.com>
805
806         genericUnwind might overflow the instructions() vector when catching an FTL exception
807         https://bugs.webkit.org/show_bug.cgi?id=153383
808
809         Reviewed by Benjamin Poulain.
810
811         * jit/JITExceptions.cpp:
812         (JSC::genericUnwind):
813
814 2016-01-22  Mark Lam  <mark.lam@apple.com>
815
816         We should OSR exit with Int52Overflow when we fail to make an Int52 where we expect one.
817         https://bugs.webkit.org/show_bug.cgi?id=153379
818
819         Reviewed by Filip Pizlo.
820
821         In DFG::Graph::addShouldSpeculateMachineInt(), we check
822         !hasExitSite(add, Int52Overflow) when determining whether it's ok to speculate
823         that an operand is of type Int52 or not.  However, the Int52Rep code that
824         converts a double to Int52 will OSR exit with exit kind BadType instead.
825         This renders the hasExitSite() check in addShouldSpeculateMachineInt() useless.
826         This patch fixes this by changing Int52Rep to OSR exit with exit kind
827         Int52Overflow instead when it fails to convert a double to an Int52.
828
829         * dfg/DFGSpeculativeJIT.cpp:
830         (JSC::DFG::SpeculativeJIT::terminateSpeculativeExecution):
831         (JSC::DFG::SpeculativeJIT::typeCheck):
832         (JSC::DFG::SpeculativeJIT::usedRegisters):
833         * dfg/DFGSpeculativeJIT.h:
834         (JSC::DFG::SpeculativeJIT::needsTypeCheck):
835         (JSC::DFG::SpeculativeJIT::speculateStringObjectForStructure):
836         * dfg/DFGSpeculativeJIT64.cpp:
837         (JSC::DFG::SpeculativeJIT::compile):
838         * ftl/FTLLowerDFGToLLVM.cpp:
839         (JSC::FTL::DFG::LowerDFGToLLVM::typeCheck):
840         (JSC::FTL::DFG::LowerDFGToLLVM::appendTypeCheck):
841         (JSC::FTL::DFG::LowerDFGToLLVM::doubleToStrictInt52):
842
843 2016-01-22  Saam barati  <sbarati@apple.com>
844
845         Current implementation of Parser::createSavePoint is a foot gun
846         https://bugs.webkit.org/show_bug.cgi?id=153293
847
848         Reviewed by Oliver Hunt.
849
850         The previous use of SavePoint (up until this patch)
851         really meant that we're saving the LexerState. This
852         was so poorly named that it was being misused all over
853         our parser. For example, anything that parsed an
854         AssignmentExpression between saving/restoring really
855         wanted to save both Lexer state and Parser state.
856
857         This patch changes SavePoint to mean save all the
858         state. The old SavePoint is renamed to LexerState with
859         corresponding internal<Save/Restore>LexerState functions.
860         The old <save/restore>State() function is renamed to
861         internal<Save/Restore>ParserState().
862
863         * parser/Parser.cpp:
864         (JSC::Parser<LexerType>::Parser):
865         (JSC::Parser<LexerType>::parseInner):
866         (JSC::Parser<LexerType>::isArrowFunctionParameters):
867         (JSC::Parser<LexerType>::parseSourceElements):
868         (JSC::Parser<LexerType>::declareRestOrNormalParameter):
869         (JSC::Parser<LexerType>::parseAssignmentElement):
870         (JSC::Parser<LexerType>::parseDestructuringPattern):
871         (JSC::Parser<LexerType>::parseForStatement):
872         (JSC::Parser<LexerType>::parseStatement):
873         (JSC::Parser<LexerType>::parseFunctionParameters):
874         (JSC::Parser<LexerType>::parseFunctionInfo):
875         (JSC::Parser<LexerType>::parseClass):
876         (JSC::Parser<LexerType>::parseExpression):
877         (JSC::Parser<LexerType>::parseAssignmentExpression):
878         (JSC::Parser<LexerType>::parseYieldExpression):
879         (JSC::Parser<LexerType>::parseConditionalExpression):
880         (JSC::Parser<LexerType>::parseBinaryExpression):
881         (JSC::Parser<LexerType>::parseObjectLiteral):
882         (JSC::Parser<LexerType>::parseStrictObjectLiteral):
883         (JSC::Parser<LexerType>::parseArrayLiteral):
884         (JSC::Parser<LexerType>::parsePrimaryExpression):
885         (JSC::Parser<LexerType>::parseMemberExpression):
886         (JSC::Parser<LexerType>::parseUnaryExpression):
887         * parser/Parser.h:
888         (JSC::Parser::hasError):
889         (JSC::Parser::internalSaveParserState):
890         (JSC::Parser::restoreParserState):
891         (JSC::Parser::internalSaveLexerState):
892         (JSC::Parser::restoreLexerState):
893         (JSC::Parser::createSavePointForError):
894         (JSC::Parser::createSavePoint):
895         (JSC::Parser::restoreSavePointWithError):
896         (JSC::Parser::restoreSavePoint):
897         (JSC::Parser::saveState): Deleted.
898         (JSC::Parser::restoreState): Deleted.
899
900 2016-01-22  Keith Miller  <keith_miller@apple.com>
901
902         Unreviewed. fnormal => normal.
903
904         * tests/es6.yaml:
905
906 2016-01-22  Keith Miller  <keith_miller@apple.com>
907
908         Unreviewed. Forgot to git stash pop some of the changes.
909         This should mark the rest of the es6 tests as passing.
910
911         * tests/es6.yaml:
912
913 2016-01-22  Keith Miller  <keith_miller@apple.com>
914
915         Unreviewed. Mark es6 tests as passing.
916
917         * tests/es6.yaml:
918
919 2016-01-22  Saam barati  <sbarati@apple.com>
920
921         op_profile_type 32-bit LLInt implementation has a bug
922         https://bugs.webkit.org/show_bug.cgi?id=153368
923
924         Reviewed by Michael Saboff.
925
926         r189293 changed which registers were used, specifically
927         using t5 instead of t4. That change forgot to replace
928         t4 with t5 in one specific instance.
929
930         * llint/LowLevelInterpreter32_64.asm:
931
932 2016-01-22  Filip Pizlo  <fpizlo@apple.com>
933
934         B3 should reduce obvious forms of Shl(SShr)
935         https://bugs.webkit.org/show_bug.cgi?id=153362
936
937         Reviewed by Mark Lam and Saam Barati.
938
939         This is a 40% speed-up in AsmBench-0.9/dry.c.js.
940
941         * b3/B3ReduceStrength.cpp:
942         * b3/testb3.cpp:
943         (JSC::B3::testStore16Load16Z):
944         (JSC::B3::testSShrShl32):
945         (JSC::B3::testSShrShl64):
946         (JSC::B3::zero):
947         (JSC::B3::run):
948
949 2016-01-22  Alex Christensen  <achristensen@webkit.org>
950
951         Fix internal Windows build
952         https://bugs.webkit.org/show_bug.cgi?id=153364
953         <rdar://problem/24296328>
954
955         Reviewed by Brent Fulgham.
956
957         * PlatformWin.cmake:
958         The internal build does not build JavaScriptCore with WTF, so it does not automatically link to winmm.lib
959         like it does when everything is built together.
960
961 2016-01-22  Keith Miller  <keith_miller@apple.com>
962
963         Equivalence PropertyCondition needs to check the offset it uses to load the value from is not invalidOffset
964         https://bugs.webkit.org/show_bug.cgi?id=152912
965
966         Reviewed by Mark Lam.
967
968         When checking the validity of an Equivalence PropertyCondition we do not check that the offset returned by
969         the structure of the object in the equivalence condition is valid. The offset might be wrong for many reasons.
970         The one we now test for is when the GlobalObject has a property that becomes a variable the property is deleted
971         thus the offset is now invalid.
972
973         * bytecode/PropertyCondition.cpp:
974         (JSC::PropertyCondition::isStillValidAssumingImpurePropertyWatchpoint):
975         * tests/stress/global-property-into-variable-get-from-scope.js: Added.
976
977 2016-01-22  Keith Miller  <keith_miller@apple.com>
978
979         [ES6] Add Symbol.species properties to the relevant constructors
980         https://bugs.webkit.org/show_bug.cgi?id=153339
981
982         Reviewed by Michael Saboff.
983
984         This patch adds Symbol.species to the RegExp, Array, TypedArray, Map, Set, ArrayBuffer, and
985         Promise constructors.  The functions that use these properties will be added in a later
986         patch.
987
988         * builtins/GlobalObject.js:
989         (speciesGetter):
990         * runtime/ArrayConstructor.cpp:
991         (JSC::ArrayConstructor::finishCreation):
992         * runtime/ArrayConstructor.h:
993         (JSC::ArrayConstructor::create):
994         * runtime/BooleanConstructor.h:
995         (JSC::BooleanConstructor::create):
996         * runtime/CommonIdentifiers.h:
997         * runtime/DateConstructor.h:
998         (JSC::DateConstructor::create):
999         * runtime/ErrorConstructor.h:
1000         (JSC::ErrorConstructor::create):
1001         * runtime/JSArrayBufferConstructor.cpp:
1002         (JSC::JSArrayBufferConstructor::finishCreation):
1003         (JSC::JSArrayBufferConstructor::create):
1004         * runtime/JSArrayBufferConstructor.h:
1005         * runtime/JSGlobalObject.cpp:
1006         (JSC::JSGlobalObject::init):
1007         * runtime/JSInternalPromiseConstructor.cpp:
1008         (JSC::JSInternalPromiseConstructor::create):
1009         * runtime/JSInternalPromiseConstructor.h:
1010         * runtime/JSPromiseConstructor.cpp:
1011         (JSC::JSPromiseConstructor::create):
1012         (JSC::JSPromiseConstructor::finishCreation):
1013         * runtime/JSPromiseConstructor.h:
1014         * runtime/JSTypedArrayViewConstructor.cpp:
1015         (JSC::JSTypedArrayViewConstructor::finishCreation):
1016         (JSC::JSTypedArrayViewConstructor::create): Deleted.
1017         * runtime/JSTypedArrayViewConstructor.h:
1018         (JSC::JSTypedArrayViewConstructor::create):
1019         * runtime/MapConstructor.cpp:
1020         (JSC::MapConstructor::finishCreation):
1021         * runtime/MapConstructor.h:
1022         (JSC::MapConstructor::create):
1023         * runtime/NumberConstructor.h:
1024         (JSC::NumberConstructor::create):
1025         * runtime/RegExpConstructor.cpp:
1026         (JSC::RegExpConstructor::finishCreation):
1027         * runtime/RegExpConstructor.h:
1028         (JSC::RegExpConstructor::create):
1029         * runtime/SetConstructor.cpp:
1030         (JSC::SetConstructor::finishCreation):
1031         * runtime/SetConstructor.h:
1032         (JSC::SetConstructor::create):
1033         * runtime/StringConstructor.h:
1034         (JSC::StringConstructor::create):
1035         * runtime/SymbolConstructor.h:
1036         (JSC::SymbolConstructor::create):
1037         * runtime/WeakMapConstructor.h:
1038         (JSC::WeakMapConstructor::create):
1039         * runtime/WeakSetConstructor.h:
1040         (JSC::WeakSetConstructor::create):
1041         * tests/stress/symbol-species.js: Added.
1042         (testSymbolSpeciesOnConstructor):
1043
1044 2016-01-21  Benjamin Poulain  <benjamin@webkit.org>
1045
1046         [JSC] The IRC allocator can mess up the degree of Tmps interfering with move-related Tmps
1047         https://bugs.webkit.org/show_bug.cgi?id=153340
1048
1049         Reviewed by Filip Pizlo.
1050
1051         The JavaScriptCore tests uncovered an interested bug in the iterated register
1052         coalescing allocator. When coalescing a move under the right conditions, it is
1053         possible to mess-up the graph for the Tmps interfering with the coalesced Tmps.
1054
1055         Some context first:
1056         -When coalescing a move, we alias one Tmp to another. Let say that we had
1057              Move X, Y
1058          the coalescing may alias Y to X: Y->X.
1059         -Since X and Y are equivalent after coalescing, any interference
1060          edge with Y is "moved" to X.
1061          The way this was done was to add an edge to X for every edge there was with Y.
1062          Say we had an edge R--Y, we add an edge R--X.
1063          Adding an edge increases the degree of R and Y. The degree of R was then
1064          fixed by calling decrementDegree() on it.
1065         -decrementDegree() is non trivial. It will move the Tmp to the right list
1066          for further processing if the Tmp's degree becomes lower than the number
1067          of available registers.
1068
1069         The bug appear in a particular case. Say we have 3 Tmp, A, B, and C.
1070         -A and B are move related, they can be coalesced.
1071         -A has an interference edge with C.
1072         -B does not have and interfence edge with C.
1073         -C's degree is exactly the number of avaialble registers/colors minus one (k - 1).
1074          -> This implies C is already in its list.
1075
1076         We coalesce A and B into B (A->B).
1077         -The first step, addEdgeDistinct() adds an edge between B and C. The degrees of
1078          B and C are increased by one. The degree of C becomes k.
1079         -Next, decrementDegree() is called on C. Its degree decreases to k-1.
1080          Because of the change from k to k-1, decrementDegree() adds C to a list again.
1081
1082         We have two kinds of bugs depending on the test:
1083         -A Tmp can be added to the simplifyWorklist several time.
1084         -A Tmp can be in both simplifyWorklist and freezeWorklist (because its move-related
1085          status changed since the last decrementDegree()).
1086         In both cases, the Tmps interfering with the duplicated Tmp will end up with
1087         a degree lower than their real value.
1088
1089         * b3/air/AirIteratedRegisterCoalescing.cpp:
1090
1091 2016-01-21  Andreas Kling  <akling@apple.com>
1092
1093         Add some missing WTF_MAKE_FAST_ALLOCATED in JavaScriptCore.
1094         <https://webkit.org/b/153335>
1095
1096         Reviewed by Alex Christensen.
1097
1098         Saw these things getting system malloc()'ed in an Instruments trace.
1099
1100         * inspector/InspectorAgentBase.h:
1101         * jit/CallFrameShuffleData.h:
1102         * jit/CallFrameShuffler.h:
1103         * jit/RegisterAtOffsetList.h:
1104         * runtime/GenericOffset.h:
1105
1106 2016-01-21  Yusuke Suzuki  <utatane.tea@gmail.com>
1107
1108         [ES6] Catch parameter should accept BindingPattern
1109         https://bugs.webkit.org/show_bug.cgi?id=152385
1110
1111         Reviewed by Saam Barati.
1112
1113         This patch implements destructuring in catch parameter.
1114         Catch parameter accepts binding pattern and binding identifier.
1115         It creates lexical bindings. And "yield" and "let" are specially
1116         handled as is the same to function parameters.
1117
1118         In addition to that, we make destructuring parsing errors more descriptive.
1119
1120         * bytecompiler/BytecodeGenerator.cpp:
1121         (JSC::BytecodeGenerator::emitPushCatchScope):
1122         * bytecompiler/BytecodeGenerator.h:
1123         * bytecompiler/NodesCodegen.cpp:
1124         (JSC::TryNode::emitBytecode):
1125         * parser/ASTBuilder.h:
1126         (JSC::ASTBuilder::createTryStatement):
1127         * parser/NodeConstructors.h:
1128         (JSC::TryNode::TryNode):
1129         * parser/Nodes.h:
1130         * parser/Parser.cpp:
1131         (JSC::Parser<LexerType>::createBindingPattern):
1132         (JSC::Parser<LexerType>::tryParseDestructuringPatternExpression):
1133         (JSC::Parser<LexerType>::parseBindingOrAssignmentElement):
1134         (JSC::destructuringKindToVariableKindName):
1135         (JSC::Parser<LexerType>::parseDestructuringPattern):
1136         (JSC::Parser<LexerType>::parseTryStatement):
1137         (JSC::Parser<LexerType>::parseFormalParameters):
1138         (JSC::Parser<LexerType>::parseFunctionParameters):
1139         * parser/Parser.h:
1140         (JSC::Parser::destructuringKindFromDeclarationType):
1141         * parser/SyntaxChecker.h:
1142         (JSC::SyntaxChecker::createTryStatement):
1143         * tests/es6.yaml:
1144         * tests/es6/destructuring_in_catch_heads.js: Added.
1145         (test):
1146         * tests/stress/catch-parameter-destructuring.js: Added.
1147         (shouldBe):
1148         (shouldThrow):
1149         (prototype.call):
1150         (catch):
1151         (shouldThrow.try.throw.get error):
1152         (initialize):
1153         (array):
1154         (generator.gen):
1155         (generator):
1156         * tests/stress/catch-parameter-syntax.js: Added.
1157         (testSyntax):
1158         (testSyntaxError):
1159         * tests/stress/reserved-word-with-escape.js:
1160         (testSyntaxError.String.raw.a):
1161         (String.raw.SyntaxError.Cannot.use.the.keyword.string_appeared_here.as.a.name):
1162         * tests/stress/yield-named-variable.js:
1163
1164 2016-01-21  Filip Pizlo  <fpizlo@apple.com>
1165
1166         Unreviewed, fix build.
1167
1168         * b3/B3EliminateCommonSubexpressions.cpp:
1169
1170 2016-01-21  Filip Pizlo  <fpizlo@apple.com>
1171
1172         B3 CSE should be able to match a full redundancy even if none of the matches dominate the value in question
1173         https://bugs.webkit.org/show_bug.cgi?id=153321
1174
1175         Reviewed by Benjamin Poulain.
1176
1177         I once learned that LLVM's GVN can manufacture Phi functions. I don't know the details
1178         but I'm presuming that it involves:
1179
1180             if (p)
1181                 tmp1 = *ptr
1182             else
1183                 tmp2 = *ptr
1184             tmp3 = *ptr // Replace this with Phi(tmp1, tmp2).
1185
1186         This adds such an optimization to our CSE. The idea is that we search through basic
1187         blocks until we find the value we want, a side effect, or the start of the procedure. If
1188         we find a value that matches our search criteria, we record it and ignore the
1189         predecessors. If we find a side effect or the start of the procedure, we give up the
1190         whole search. This ensures that if we come out of the search without giving up, we'll
1191         have a set of matches that are fully redundant.
1192
1193         CSE could then create a Phi graph by using SSACalculator. But the recent work on FixSSA
1194         revealed a much more exciting option: create a stack slot! In case there is more than one
1195         match, CSE now creates a stack slot that each match stores to, and replaces the redundant
1196         instruction with a loadfrom the stack slot. The stack slot is anonymous, which ensures
1197         that FixSSA will turn it into an optimal Phi graph or whatever.
1198
1199         This is a significant speed-up on Octane/richards.
1200
1201         * b3/B3DuplicateTails.cpp:
1202         * b3/B3EliminateCommonSubexpressions.cpp:
1203         * b3/B3FixSSA.cpp:
1204         (JSC::B3::fixSSA):
1205         * b3/B3Generate.cpp:
1206         (JSC::B3::generateToAir):
1207         * b3/B3Procedure.h:
1208         (JSC::B3::Procedure::setFrontendData):
1209         (JSC::B3::Procedure::frontendData):
1210         * b3/testb3.cpp:
1211         * ftl/FTLState.cpp:
1212         (JSC::FTL::State::State):
1213
1214 2016-01-21  Filip Pizlo  <fpizlo@apple.com>
1215
1216         Air should know that CeilDouble has the partial register stall issue
1217         https://bugs.webkit.org/show_bug.cgi?id=153338
1218
1219         Rubber stamped by Benjamin Poulain.
1220
1221         This is a 8% speed-up on Kraken with B3 enabled, mostly because of a 2.4x speed-up on
1222         audio-oscillator.
1223
1224         * b3/air/AirFixPartialRegisterStalls.cpp:
1225
1226 2016-01-21  Andy VanWagoner  <andy@instructure.com>
1227
1228         [INTL] Implement Array.prototype.toLocaleString in ECMA-402
1229         https://bugs.webkit.org/show_bug.cgi?id=147614
1230
1231         Reviewed by Benjamin Poulain.
1232
1233         The primary changes in the ECMA-402 version, and the existing implementation
1234         are passing the arguments on to each element's toLocaleString call, and
1235         missing/undefined/null elements become empty string instead of being skipped.
1236
1237         * runtime/ArrayPrototype.cpp:
1238         (JSC::arrayProtoFuncToLocaleString):
1239
1240 2016-01-21  Per Arne Vollan  <peavo@outlook.com>
1241
1242         [B3][Win64] Compile fixes.
1243         https://bugs.webkit.org/show_bug.cgi?id=153312
1244
1245         Reviewed by Alex Christensen.
1246
1247         Since MSVC has several overloads of sin, cos, pow, and log, we need to specify
1248         which one we want to use.
1249
1250         * ftl/FTLB3Output.h:
1251         (JSC::FTL::Output::doubleSin):
1252         (JSC::FTL::Output::doubleCos):
1253         (JSC::FTL::Output::doublePow):
1254         (JSC::FTL::Output::doubleLog):
1255
1256 2016-01-21  Benjamin Poulain  <benjamin@webkit.org>
1257
1258         [JSC] foldPathConstants() makes invalid assumptions with Switch
1259         https://bugs.webkit.org/show_bug.cgi?id=153324
1260
1261         Reviewed by Filip Pizlo.
1262
1263         If a Switch() has two cases pointing to the same basic block, foldPathConstants()
1264         was adding two override for that block with two different constants.
1265         If the block with the Switch dominates the target, both override were equally valid
1266         and we were assuming any of the constants as the value in the target block.
1267
1268         See testSwitchTargettingSameBlockFoldPathConstant() for an example that breaks.
1269
1270         This patch adds checks to ignore any block that is reached more than
1271         once by the control value.
1272
1273         * b3/B3FoldPathConstants.cpp:
1274         * b3/B3Generate.cpp:
1275         (JSC::B3::generateToAir):
1276         * b3/testb3.cpp:
1277         (JSC::B3::testSwitchTargettingSameBlock):
1278         (JSC::B3::testSwitchTargettingSameBlockFoldPathConstant):
1279         (JSC::B3::run):
1280
1281 2016-01-21  Filip Pizlo  <fpizlo@apple.com>
1282
1283         Unreviewed, undo DFGCommon.h change that accidentally enabled the B3 JIT.
1284
1285         * dfg/DFGCommon.h:
1286
1287 2016-01-21  Filip Pizlo  <fpizlo@apple.com>
1288
1289         Move32 should have an Imm, Tmp form
1290         https://bugs.webkit.org/show_bug.cgi?id=153313
1291
1292         Reviewed by Mark Lam.
1293
1294         This enables some useful optimizations, like constant propagation in fixObviousSpills().
1295
1296         * assembler/MacroAssemblerX86Common.h:
1297         (JSC::MacroAssemblerX86Common::zeroExtend32ToPtr):
1298         (JSC::MacroAssemblerX86Common::move):
1299         * b3/air/AirOpcode.opcodes:
1300
1301 2016-01-21  Filip Pizlo  <fpizlo@apple.com>
1302
1303         B3 should have load elimination
1304         https://bugs.webkit.org/show_bug.cgi?id=153288
1305
1306         Reviewed by Geoffrey Garen.
1307
1308         This adds a complete GCSE pass that includes load elimination. It would have been super hard
1309         to make this work as part of the reduceStrength() fixpoint, since GCSE needs to analyze
1310         control flow and reduceStrength() is messing with control flow. So, I did a compromise: I
1311         factored out the pure CSE that reduceStrength() was already doing, and now we have:
1312
1313         - reduceStrength() still does pure CSE using the new PureCSE helper.
1314
1315         - eliminateCommonSubexpressions() is a separate phase that does general CSE. It uses the
1316           PureCSE helper for pure values and does its own special thing for memory values.
1317         
1318         Unfortunately, this doesn't help any benchmark right now. It doesn't hurt anything, either,
1319         and it's likely to become a bigger pay-off once we implement other features, like mapping
1320         FTL's abstract heaps onto B3's heap ranges.
1321
1322         * CMakeLists.txt:
1323         * JavaScriptCore.xcodeproj/project.pbxproj:
1324         * b3/B3EliminateCommonSubexpressions.cpp: Added.
1325         (JSC::B3::eliminateCommonSubexpressions):
1326         * b3/B3EliminateCommonSubexpressions.h: Added.
1327         * b3/B3Generate.cpp:
1328         (JSC::B3::generateToAir):
1329         * b3/B3HeapRange.h:
1330         (JSC::B3::HeapRange::HeapRange):
1331         * b3/B3InsertionSet.h:
1332         (JSC::B3::InsertionSet::InsertionSet):
1333         (JSC::B3::InsertionSet::isEmpty):
1334         (JSC::B3::InsertionSet::code):
1335         (JSC::B3::InsertionSet::appendInsertion):
1336         * b3/B3MemoryValue.h:
1337         * b3/B3PureCSE.cpp: Added.
1338         (JSC::B3::PureCSE::PureCSE):
1339         (JSC::B3::PureCSE::~PureCSE):
1340         (JSC::B3::PureCSE::clear):
1341         (JSC::B3::PureCSE::process):
1342         * b3/B3PureCSE.h: Added.
1343         * b3/B3ReduceStrength.cpp:
1344         * b3/B3ReduceStrength.h:
1345         * b3/B3Validate.cpp:
1346
1347 2016-01-21  Keith Miller  <keith_miller@apple.com>
1348
1349         Fix bug in TypedArray.prototype.set and add tests
1350         https://bugs.webkit.org/show_bug.cgi?id=153309
1351
1352         Reviewed by Michael Saboff.
1353
1354         This patch fixes an issue with TypedArray.prototype.set where we would
1355         assign a double to an unsigned without checking that the double was
1356         in the range of the unsigned. Additionally, the patch also adds
1357         tests for set for cases that were not covered before.
1358
1359         * runtime/JSGenericTypedArrayViewPrototypeFunctions.h:
1360         (JSC::genericTypedArrayViewProtoFuncSet):
1361         * tests/stress/typedarray-set.js: Added.
1362
1363 2016-01-19  Ada Chan  <adachan@apple.com>
1364
1365         Make it possible to enable VIDEO_PRESENTATION_MODE on other Cocoa platforms.
1366         https://bugs.webkit.org/show_bug.cgi?id=153218
1367
1368         Reviewed by Eric Carlson.
1369
1370         * Configurations/FeatureDefines.xcconfig:
1371
1372 2016-01-21  Per Arne Vollan  <peavo@outlook.com>
1373
1374         [B3][CMake] Add missing source file.
1375         https://bugs.webkit.org/show_bug.cgi?id=153303
1376
1377         Reviewed by Csaba Osztrogonác.
1378
1379         * CMakeLists.txt:
1380
1381 2016-01-20  Commit Queue  <commit-queue@webkit.org>
1382
1383         Unreviewed, rolling out r195375.
1384         https://bugs.webkit.org/show_bug.cgi?id=153300
1385
1386         Caused crashes on GuardMalloc (Requested by ap on #webkit).
1387
1388         Reverted changeset:
1389
1390         "TypedArray's .buffer does not return the JSArrayBuffer that
1391         was passed to it on creation."
1392         https://bugs.webkit.org/show_bug.cgi?id=153281
1393         http://trac.webkit.org/changeset/195375
1394
1395 2016-01-19  Filip Pizlo  <fpizlo@apple.com>
1396
1397         B3 should have basic path specialization
1398         https://bugs.webkit.org/show_bug.cgi?id=153200
1399
1400         Reviewed by Benjamin Poulain.
1401
1402         This adds two different kind of path specializations:
1403
1404         - Check(Select) where the Select results are constants is specialized into a Branch
1405           instead of a Select and duplicated paths where the results of the Select are folded.
1406
1407         - Tail duplication. A jump to a small block causes the block's contents to be copied over
1408           the Jump.
1409
1410         Both optimizations required being able to clone Values. We can now do that using
1411         proc.clone(value).
1412
1413         Check(Select) specialization needed some utilities for walking graphs of Values.
1414
1415         Tail duplication needed SSA fixup, so I added a way to demote values to anonymous stack
1416         slots (B3's equivalent of non-SSA variables) and a way to "fix SSA", i.e. to allocate
1417         anonymous stack slots to SSA values along with an optimal Phi graph.
1418
1419         This is a big speed-up on Octane/deltablue. It's a 2.2% speed-up on Octane overall.
1420
1421         * CMakeLists.txt:
1422         * JavaScriptCore.xcodeproj/project.pbxproj:
1423         * b3/B3ArgumentRegValue.cpp:
1424         (JSC::B3::ArgumentRegValue::dumpMeta):
1425         (JSC::B3::ArgumentRegValue::cloneImpl):
1426         * b3/B3ArgumentRegValue.h:
1427         * b3/B3BasicBlock.cpp:
1428         (JSC::B3::BasicBlock::append):
1429         (JSC::B3::BasicBlock::appendNonTerminal):
1430         (JSC::B3::BasicBlock::removeLast):
1431         * b3/B3BasicBlock.h:
1432         (JSC::B3::BasicBlock::values):
1433         * b3/B3BasicBlockInlines.h:
1434         (JSC::B3::BasicBlock::appendNew):
1435         (JSC::B3::BasicBlock::appendNewNonTerminal):
1436         (JSC::B3::BasicBlock::replaceLastWithNew):
1437         * b3/B3BlockInsertionSet.h:
1438         * b3/B3BreakCriticalEdges.cpp: Added.
1439         (JSC::B3::breakCriticalEdges):
1440         * b3/B3BreakCriticalEdges.h: Added.
1441         * b3/B3CCallValue.cpp:
1442         (JSC::B3::CCallValue::~CCallValue):
1443         (JSC::B3::CCallValue::cloneImpl):
1444         * b3/B3CCallValue.h:
1445         * b3/B3CheckValue.cpp:
1446         (JSC::B3::CheckValue::convertToAdd):
1447         (JSC::B3::CheckValue::cloneImpl):
1448         (JSC::B3::CheckValue::CheckValue):
1449         * b3/B3CheckValue.h:
1450         * b3/B3Const32Value.cpp:
1451         (JSC::B3::Const32Value::dumpMeta):
1452         (JSC::B3::Const32Value::cloneImpl):
1453         * b3/B3Const32Value.h:
1454         * b3/B3Const64Value.cpp:
1455         (JSC::B3::Const64Value::dumpMeta):
1456         (JSC::B3::Const64Value::cloneImpl):
1457         * b3/B3Const64Value.h:
1458         * b3/B3ConstDoubleValue.cpp:
1459         (JSC::B3::ConstDoubleValue::dumpMeta):
1460         (JSC::B3::ConstDoubleValue::cloneImpl):
1461         * b3/B3ConstDoubleValue.h:
1462         * b3/B3ConstFloatValue.cpp:
1463         (JSC::B3::ConstFloatValue::dumpMeta):
1464         (JSC::B3::ConstFloatValue::cloneImpl):
1465         * b3/B3ConstFloatValue.h:
1466         * b3/B3ControlValue.cpp:
1467         (JSC::B3::ControlValue::dumpMeta):
1468         (JSC::B3::ControlValue::cloneImpl):
1469         * b3/B3ControlValue.h:
1470         * b3/B3DuplicateTails.cpp: Added.
1471         (JSC::B3::duplicateTails):
1472         * b3/B3DuplicateTails.h: Added.
1473         * b3/B3FixSSA.cpp: Added.
1474         (JSC::B3::demoteValues):
1475         (JSC::B3::fixSSA):
1476         * b3/B3FixSSA.h: Added.
1477         * b3/B3Generate.cpp:
1478         (JSC::B3::generateToAir):
1479         * b3/B3IndexSet.h:
1480         (JSC::B3::IndexSet::Iterable::Iterable):
1481         (JSC::B3::IndexSet::values):
1482         (JSC::B3::IndexSet::indices):
1483         * b3/B3InsertionSet.cpp:
1484         (JSC::B3::InsertionSet::insertIntConstant):
1485         (JSC::B3::InsertionSet::insertBottom):
1486         (JSC::B3::InsertionSet::execute):
1487         * b3/B3InsertionSet.h:
1488         * b3/B3LowerToAir.cpp:
1489         (JSC::B3::Air::LowerToAir::run):
1490         (JSC::B3::Air::LowerToAir::tmp):
1491         * b3/B3MemoryValue.cpp:
1492         (JSC::B3::MemoryValue::dumpMeta):
1493         (JSC::B3::MemoryValue::cloneImpl):
1494         * b3/B3MemoryValue.h:
1495         * b3/B3OriginDump.cpp: Added.
1496         (JSC::B3::OriginDump::dump):
1497         * b3/B3OriginDump.h:
1498         (JSC::B3::OriginDump::OriginDump):
1499         (JSC::B3::OriginDump::dump): Deleted.
1500         * b3/B3PatchpointValue.cpp:
1501         (JSC::B3::PatchpointValue::dumpMeta):
1502         (JSC::B3::PatchpointValue::cloneImpl):
1503         (JSC::B3::PatchpointValue::PatchpointValue):
1504         * b3/B3PatchpointValue.h:
1505         * b3/B3Procedure.cpp:
1506         (JSC::B3::Procedure::addBlock):
1507         (JSC::B3::Procedure::clone):
1508         (JSC::B3::Procedure::addIntConstant):
1509         (JSC::B3::Procedure::addBottom):
1510         (JSC::B3::Procedure::addBoolConstant):
1511         (JSC::B3::Procedure::deleteValue):
1512         * b3/B3Procedure.h:
1513         * b3/B3ReduceStrength.cpp:
1514         * b3/B3SSACalculator.cpp: Added.
1515         (JSC::B3::SSACalculator::Variable::dump):
1516         (JSC::B3::SSACalculator::Variable::dumpVerbose):
1517         (JSC::B3::SSACalculator::Def::dump):
1518         (JSC::B3::SSACalculator::SSACalculator):
1519         (JSC::B3::SSACalculator::~SSACalculator):
1520         (JSC::B3::SSACalculator::reset):
1521         (JSC::B3::SSACalculator::newVariable):
1522         (JSC::B3::SSACalculator::newDef):
1523         (JSC::B3::SSACalculator::nonLocalReachingDef):
1524         (JSC::B3::SSACalculator::reachingDefAtTail):
1525         (JSC::B3::SSACalculator::dump):
1526         * b3/B3SSACalculator.h: Added.
1527         (JSC::B3::SSACalculator::Variable::index):
1528         (JSC::B3::SSACalculator::Variable::Variable):
1529         (JSC::B3::SSACalculator::Def::variable):
1530         (JSC::B3::SSACalculator::Def::block):
1531         (JSC::B3::SSACalculator::Def::value):
1532         (JSC::B3::SSACalculator::Def::Def):
1533         (JSC::B3::SSACalculator::variable):
1534         (JSC::B3::SSACalculator::computePhis):
1535         (JSC::B3::SSACalculator::phisForBlock):
1536         (JSC::B3::SSACalculator::reachingDefAtHead):
1537         * b3/B3StackSlotKind.h:
1538         * b3/B3StackSlotValue.cpp:
1539         (JSC::B3::StackSlotValue::dumpMeta):
1540         (JSC::B3::StackSlotValue::cloneImpl):
1541         * b3/B3StackSlotValue.h:
1542         * b3/B3SwitchValue.cpp:
1543         (JSC::B3::SwitchValue::dumpMeta):
1544         (JSC::B3::SwitchValue::cloneImpl):
1545         (JSC::B3::SwitchValue::SwitchValue):
1546         * b3/B3SwitchValue.h:
1547         * b3/B3UpsilonValue.cpp:
1548         (JSC::B3::UpsilonValue::dumpMeta):
1549         (JSC::B3::UpsilonValue::cloneImpl):
1550         * b3/B3UpsilonValue.h:
1551         * b3/B3Validate.cpp:
1552         * b3/B3Value.cpp:
1553         (JSC::B3::Value::replaceWithNop):
1554         (JSC::B3::Value::replaceWithPhi):
1555         (JSC::B3::Value::dump):
1556         (JSC::B3::Value::cloneImpl):
1557         (JSC::B3::Value::dumpChildren):
1558         (JSC::B3::Value::deepDump):
1559         * b3/B3Value.h:
1560         (JSC::B3::DeepValueDump::DeepValueDump):
1561         (JSC::B3::DeepValueDump::dump):
1562         (JSC::B3::deepDump):
1563         * b3/B3ValueInlines.h:
1564         (JSC::B3::Value::asNumber):
1565         (JSC::B3::Value::walk):
1566         * b3/B3ValueKey.cpp:
1567         (JSC::B3::ValueKey::intConstant):
1568         (JSC::B3::ValueKey::dump):
1569         * b3/B3ValueKey.h:
1570         (JSC::B3::ValueKey::ValueKey):
1571         (JSC::B3::ValueKey::opcode):
1572         (JSC::B3::ValueKey::type):
1573         (JSC::B3::ValueKey::childIndex):
1574         * b3/air/AirCode.h:
1575         (JSC::B3::Air::Code::forAllTmps):
1576         (JSC::B3::Air::Code::isFastTmp):
1577         * b3/air/AirIteratedRegisterCoalescing.cpp:
1578         * b3/air/AirUseCounts.h:
1579         (JSC::B3::Air::UseCounts::UseCounts):
1580         (JSC::B3::Air::UseCounts::operator[]):
1581         (JSC::B3::Air::UseCounts::dump):
1582         * b3/testb3.cpp:
1583         (JSC::B3::testSelectInvert):
1584         (JSC::B3::testCheckSelect):
1585         (JSC::B3::testCheckSelectCheckSelect):
1586         (JSC::B3::testPowDoubleByIntegerLoop):
1587         (JSC::B3::run):
1588         * runtime/Options.h:
1589
1590 2016-01-20  Benjamin Poulain  <bpoulain@apple.com>
1591
1592         [JSC] Fix a typo in the Air definition of CeilDouble/CeilFloat
1593         https://bugs.webkit.org/show_bug.cgi?id=153286
1594
1595         Reviewed by Mark Lam.
1596
1597         * b3/air/AirOpcode.opcodes:
1598         The second argument should a Def. The previous definition was
1599         adding useless constraints on the allocation of the second argument.
1600
1601 2016-01-20  Benjamin Poulain  <benjamin@webkit.org>
1602
1603         [JSC] The register allocator can use a dangling pointer when selecting a spill candidate
1604         https://bugs.webkit.org/show_bug.cgi?id=153287
1605
1606         Reviewed by Mark Lam.
1607
1608         A tricky bug I discovered while experimenting with live range breaking.
1609
1610         We have the following initial conditions:
1611         -UseCounts is slow, so we only compute it once for all the iterations
1612          of the allocator.
1613         -The only new Tmps we create are for spills and refills. They are unspillable
1614          by definition so it is fine to not update UseCounts accordingly.
1615
1616         But, in selectSpill(), we go over all the spill candidates and select the best
1617         one based on its score. The score() lambda uses useCounts, it cannot be used
1618         with a new Tmps created for something we already spilled.
1619
1620         The first time we use score is correct, we started by skipping all the unspillable
1621         Tmps from the candidate. The next use was incorrect: we were checking unspillableTmps
1622         *after* calling score().
1623
1624         The existing tests did not catch this due to back luck. I added an assertion
1625         to find similar problems in the future.
1626
1627         * b3/air/AirIteratedRegisterCoalescing.cpp:
1628         * b3/air/AirUseCounts.h:
1629
1630 2016-01-20  Saam barati  <sbarati@apple.com>
1631
1632         Fix CLoop build after bug https://bugs.webkit.org/show_bug.cgi?id=152766
1633
1634         Unreviewed build fix.
1635
1636         * inspector/agents/InspectorScriptProfilerAgent.h:
1637
1638 2016-01-20  Andy VanWagoner  <thetalecrafter@gmail.com>
1639
1640         [INTL] Implement Date.prototype.toLocaleTimeString in ECMA-402
1641         https://bugs.webkit.org/show_bug.cgi?id=147613
1642
1643         Reviewed by Darin Adler.
1644
1645         Implement toLocaleTimeString in builtin JavaScript.
1646
1647         * builtins/DatePrototype.js:
1648         (toLocaleTimeString.toDateTimeOptionsTimeTime):
1649         (toLocaleTimeString):
1650         * runtime/DatePrototype.cpp:
1651         (JSC::DatePrototype::finishCreation):
1652
1653 2016-01-20  Saam barati  <sbarati@apple.com>
1654
1655         Web Inspector: Hook the sampling profiler into the Timelines UI
1656         https://bugs.webkit.org/show_bug.cgi?id=152766
1657         <rdar://problem/24066360>
1658
1659         Reviewed by Joseph Pecoraro.
1660
1661         This patch adds some necessary functions to SamplingProfiler::StackFrame
1662         to allow it to give data to the Inspector for the timelines UI. i.e, the
1663         sourceID of the executable of a stack frame.
1664
1665         This patch also swaps in the SamplingProfiler in place of the
1666         LegacyProfiler inside InspectorScriptProfilerAgent. It adds
1667         the necessary protocol data to allow the SamplingProfiler's
1668         data to hook into the timelines UI.
1669
1670         * debugger/Debugger.cpp:
1671         (JSC::Debugger::setProfilingClient):
1672         (JSC::Debugger::willEvaluateScript):
1673         (JSC::Debugger::didEvaluateScript):
1674         (JSC::Debugger::toggleBreakpoint):
1675         * debugger/Debugger.h:
1676         * debugger/ScriptProfilingScope.h:
1677         (JSC::ScriptProfilingScope::ScriptProfilingScope):
1678         (JSC::ScriptProfilingScope::~ScriptProfilingScope):
1679         * inspector/agents/InspectorScriptProfilerAgent.cpp:
1680         (Inspector::InspectorScriptProfilerAgent::willDestroyFrontendAndBackend):
1681         (Inspector::InspectorScriptProfilerAgent::startTracking):
1682         (Inspector::InspectorScriptProfilerAgent::stopTracking):
1683         (Inspector::InspectorScriptProfilerAgent::isAlreadyProfiling):
1684         (Inspector::InspectorScriptProfilerAgent::willEvaluateScript):
1685         (Inspector::InspectorScriptProfilerAgent::didEvaluateScript):
1686         (Inspector::InspectorScriptProfilerAgent::addEvent):
1687         (Inspector::buildSamples):
1688         (Inspector::InspectorScriptProfilerAgent::trackingComplete):
1689         (Inspector::buildAggregateCallInfoInspectorObject): Deleted.
1690         (Inspector::buildInspectorObject): Deleted.
1691         (Inspector::buildProfileInspectorObject): Deleted.
1692         * inspector/agents/InspectorScriptProfilerAgent.h:
1693         * inspector/protocol/ScriptProfiler.json:
1694         * jsc.cpp:
1695         (functionSamplingProfilerStackTraces):
1696         * runtime/SamplingProfiler.cpp:
1697         (JSC::SamplingProfiler::start):
1698         (JSC::SamplingProfiler::stop):
1699         (JSC::SamplingProfiler::clearData):
1700         (JSC::SamplingProfiler::StackFrame::displayName):
1701         (JSC::SamplingProfiler::StackFrame::displayNameForJSONTests):
1702         (JSC::SamplingProfiler::StackFrame::startLine):
1703         (JSC::SamplingProfiler::StackFrame::startColumn):
1704         (JSC::SamplingProfiler::StackFrame::sourceID):
1705         (JSC::SamplingProfiler::StackFrame::url):
1706         (JSC::SamplingProfiler::stackTraces):
1707         (JSC::SamplingProfiler::stackTracesAsJSON):
1708         (JSC::displayName): Deleted.
1709         (JSC::SamplingProfiler::stacktracesAsJSON): Deleted.
1710         * runtime/SamplingProfiler.h:
1711         (JSC::SamplingProfiler::StackFrame::StackFrame):
1712         (JSC::SamplingProfiler::getLock):
1713         (JSC::SamplingProfiler::setTimingInterval):
1714         (JSC::SamplingProfiler::totalTime):
1715         (JSC::SamplingProfiler::setStopWatch):
1716         (JSC::SamplingProfiler::stackTraces): Deleted.
1717         * tests/stress/sampling-profiler-anonymous-function.js:
1718         (platformSupportsSamplingProfiler.baz):
1719         (platformSupportsSamplingProfiler):
1720         * tests/stress/sampling-profiler-basic.js:
1721         (platformSupportsSamplingProfiler.nothing):
1722         (platformSupportsSamplingProfiler.top):
1723         * tests/stress/sampling-profiler/samplingProfiler.js:
1724         (doesTreeHaveStackTrace):
1725
1726 2016-01-20  Keith Miller  <keith_miller@apple.com>
1727
1728         TypedArray's .buffer does not return the JSArrayBuffer that was passed to it on creation.
1729         https://bugs.webkit.org/show_bug.cgi?id=153281
1730
1731         Reviewed by Geoffrey Garen.
1732
1733         When creating an JSArrayBuffer we should make sure that the backing ArrayBuffer uses the
1734         new JSArrayBuffer as its wrapper. This causes issues when we get the buffer of a Typed Array
1735         created by passing a JSArrayBuffer as the backing ArrayBuffer does not have a reference to
1736         the original JSArrayBuffer and a new object is created.
1737
1738         * runtime/JSArrayBuffer.cpp:
1739         (JSC::JSArrayBuffer::finishCreation):
1740         * tests/stress/typedarray-buffer-neutered.js: Added.
1741         (arrays.typedArrays.map):
1742
1743 2016-01-20  Andreas Kling  <akling@apple.com>
1744
1745         Pack RegisterAtOffset harder.
1746         <https://webkit.org/b/152501>
1747
1748         Reviewed by Michael Saboff.
1749
1750         Pack the register index and the offset into a single pointer-sized word instead of two.
1751         This reduces memory consumption by 620 kB on mobile theverge.com.
1752
1753         The packing doesn't succeed on MSVC for some reason, so I've left out the static
1754         assertion about class size in those builds.
1755
1756         * jit/RegisterAtOffset.cpp:
1757         * jit/RegisterAtOffset.h:
1758
1759 2016-01-20  Per Arne Vollan  <peavo@outlook.com>
1760
1761         [B3][Win64] Compile fix.
1762         https://bugs.webkit.org/show_bug.cgi?id=153278
1763
1764         Reviewed by Filip Pizlo.
1765
1766         MSVC does not accept that a class declared as exported also have members declared as exported.
1767
1768         * b3/B3Const32Value.h:
1769         * b3/B3ControlValue.h:
1770
1771 2016-01-19  Keith Miller  <keith_miller@apple.com>
1772
1773         [ES6] Fix various issues with TypedArrays.
1774         https://bugs.webkit.org/show_bug.cgi?id=153245
1775
1776         Reviewed by Geoffrey Garen.
1777
1778         This patch fixes a couple of issues with TypedArrays:
1779
1780         1) We were not checking if a view had been neutered and throwing an error
1781         if it had in the our TypedArray.prototype functions.
1782
1783         2) The TypedArray.prototype.set function had a couple of minor issues with
1784         checking for the offset being negative.
1785
1786         3) The JSArrayBufferView class did not check if the backing store had
1787         been neutered when computing the offset even though the view's vector
1788         pointer had been set to NULL. This meant that under some conditions we
1789         could, occasionally, return a garbage number as the offset. Now, we only
1790         neuter views if the backing ArrayBuffer's view is actually transfered.
1791
1792         * jsc.cpp:
1793         (GlobalObject::finishCreation):
1794         (functionNeuterTypedArray):
1795         * runtime/JSArrayBufferView.h:
1796         (JSC::JSArrayBufferView::isNeutered):
1797         * runtime/JSArrayBufferViewInlines.h:
1798         (JSC::JSArrayBufferView::byteOffset):
1799         * runtime/JSGenericTypedArrayViewPrototypeFunctions.h:
1800         (JSC::genericTypedArrayViewProtoFuncSet):
1801         (JSC::genericTypedArrayViewProtoFuncEntries):
1802         (JSC::genericTypedArrayViewProtoFuncCopyWithin):
1803         (JSC::genericTypedArrayViewProtoFuncFill):
1804         (JSC::genericTypedArrayViewProtoFuncIndexOf):
1805         (JSC::genericTypedArrayViewProtoFuncJoin):
1806         (JSC::genericTypedArrayViewProtoFuncKeys):
1807         (JSC::genericTypedArrayViewProtoFuncLastIndexOf):
1808         (JSC::genericTypedArrayViewProtoFuncReverse):
1809         (JSC::genericTypedArrayViewPrivateFuncSort):
1810         (JSC::genericTypedArrayViewProtoFuncSlice):
1811         (JSC::genericTypedArrayViewProtoFuncSubarray):
1812         (JSC::typedArrayViewProtoFuncValues):
1813         * runtime/JSTypedArrayViewPrototype.cpp:
1814         (JSC::typedArrayViewPrivateFuncLength):
1815         (JSC::typedArrayViewPrivateFuncSort): Deleted.
1816         * tests/stress/typedarray-functions-with-neutered.js: Added.
1817         (getGetter):
1818         (unit):
1819         (args.new.Int32Array):
1820         (arrays.typedArrays.map):
1821         (checkProtoFunc.throwsCorrectError):
1822         (checkProtoFunc):
1823         (test):
1824
1825 2016-01-19  Andy VanWagoner  <thetalecrafter@gmail.com>
1826
1827         [INTL] Implement Date.prototype.toLocaleDateString in ECMA-402
1828         https://bugs.webkit.org/show_bug.cgi?id=147612
1829
1830         Reviewed by Benjamin Poulain.
1831
1832         Implement toLocaleDateString in builtin JavaScript. Remove comments with
1833         spec steps, and instead link to the new HTML version of the spec.
1834
1835         Avoids creating an extra empty object in the prototype chain of the options
1836         object in ToDateTimeOptions. The version used in toLocaleString was updated
1837         to match as well.
1838
1839         * builtins/DatePrototype.js:
1840         (toLocaleString.toDateTimeOptionsAnyAll):
1841         (toLocaleString):
1842         (toLocaleDateString.toDateTimeOptionsDateDate):
1843         (toLocaleDateString):
1844         * runtime/DatePrototype.cpp:
1845         (JSC::DatePrototype::finishCreation):
1846
1847 2016-01-19  Benjamin Poulain  <bpoulain@apple.com>
1848
1849         [JSC] fixSpillSlotZDef() crashes on ARM64
1850         https://bugs.webkit.org/show_bug.cgi?id=153246
1851
1852         Reviewed by Geoffrey Garen.
1853
1854         Moving an immediate to memory is not a valid instruction on ARM64.
1855         This patch adds a small workaround for this specific case: an instruction
1856         to zero a chunk of memory.
1857
1858         * assembler/MacroAssemblerARM64.h:
1859         (JSC::MacroAssemblerARM64::storeZero32):
1860         * assembler/MacroAssemblerX86Common.h:
1861         (JSC::MacroAssemblerX86Common::storeZero32):
1862         * b3/air/AirFixSpillSlotZDef.h:
1863         (JSC::B3::Air::fixSpillSlotZDef):
1864         * b3/air/AirOpcode.opcodes:
1865
1866 2016-01-19  Enrica Casucci  <enrica@apple.com>
1867
1868         Add support for DataDetectors in WK (iOS).
1869         https://bugs.webkit.org/show_bug.cgi?id=152989
1870         rdar://problem/22855960
1871
1872         Reviewed by Tim Horton.
1873
1874         Adding feature definition for data detection.
1875
1876         * Configurations/FeatureDefines.xcconfig:
1877
1878 2016-01-19  Per Arne Vollan  <peavo@outlook.com>
1879
1880         [B3][Win64] Compile and warning fixes.
1881         https://bugs.webkit.org/show_bug.cgi?id=153234
1882
1883         Reviewed by Alex Christensen.
1884
1885         The size of 'long' is 4 bytes on Win64. We can use 'long long' instead,
1886         when we want the size to be 8 bytes.
1887
1888         * b3/B3LowerMacrosAfterOptimizations.cpp:
1889         * b3/B3ReduceStrength.cpp:
1890
1891 2016-01-19  Csaba Osztrogonác  <ossy@webkit.org>
1892
1893         [cmake] Fix the B3 build after r195159
1894         https://bugs.webkit.org/show_bug.cgi?id=153232
1895
1896         Reviewed by Yusuke Suzuki.
1897
1898         * CMakeLists.txt:
1899
1900 2016-01-19  Commit Queue  <commit-queue@webkit.org>
1901
1902         Unreviewed, rolling out r195300.
1903         https://bugs.webkit.org/show_bug.cgi?id=153244
1904
1905         enrica wants more time to fix Windows (Requested by thorton on
1906         #webkit).
1907
1908         Reverted changeset:
1909
1910         "Add support for DataDetectors in WK (iOS)."
1911         https://bugs.webkit.org/show_bug.cgi?id=152989
1912         http://trac.webkit.org/changeset/195300
1913
1914 2016-01-19  Filip Pizlo  <fpizlo@apple.com>
1915
1916         Reconsider B3's constant motion policy
1917         https://bugs.webkit.org/show_bug.cgi?id=152202
1918
1919         Reviewed by Geoffrey Garen.
1920
1921         This changes moveConstants() to hoist constants. This is a speed-up on things like mandreel.
1922         It has a generally positive impact on the Octane score, but it's within margin of error.
1923
1924         This also changes IRC to make it a bit more likely to spill constants. We don't want it to
1925         spill them too much, because we can't rely on fixObviousSpills() to always replace a load of
1926         a constant from the stack with the constant itself, especially in case of instructions that
1927         need an extra register to materialize the immediate.
1928
1929         Also fixed DFG graph dumping to print a bit less things. It was trying to print the results of
1930         constant property inference, and this sometimes caused crashes when you dumped the graph at an
1931         inopportune time.
1932
1933         * JavaScriptCore.xcodeproj/project.pbxproj:
1934         * b3/B3MoveConstants.cpp:
1935         * b3/air/AirArg.h:
1936         * b3/air/AirArgInlines.h: Added.
1937         (JSC::B3::Air::ArgThingHelper<Tmp>::is):
1938         (JSC::B3::Air::ArgThingHelper<Tmp>::as):
1939         (JSC::B3::Air::ArgThingHelper<Tmp>::forEachFast):
1940         (JSC::B3::Air::ArgThingHelper<Tmp>::forEach):
1941         (JSC::B3::Air::ArgThingHelper<Arg>::is):
1942         (JSC::B3::Air::ArgThingHelper<Arg>::as):
1943         (JSC::B3::Air::ArgThingHelper<Arg>::forEachFast):
1944         (JSC::B3::Air::ArgThingHelper<Arg>::forEach):
1945         (JSC::B3::Air::Arg::is):
1946         (JSC::B3::Air::Arg::as):
1947         (JSC::B3::Air::Arg::forEachFast):
1948         (JSC::B3::Air::Arg::forEach):
1949         * b3/air/AirIteratedRegisterCoalescing.cpp:
1950         * b3/air/AirUseCounts.h:
1951         (JSC::B3::Air::UseCounts::UseCounts):
1952         * dfg/DFGGraph.cpp:
1953         (JSC::DFG::Graph::dump):
1954
1955 2016-01-19  Enrica Casucci  <enrica@apple.com>
1956
1957         Add support for DataDetectors in WK (iOS).
1958         https://bugs.webkit.org/show_bug.cgi?id=152989
1959         rdar://problem/22855960
1960
1961         Reviewed by Tim Horton.
1962
1963         Adding feature definition.
1964
1965         * Configurations/FeatureDefines.xcconfig:
1966
1967 2016-01-17  Filip Pizlo  <fpizlo@apple.com>
1968
1969         FTL B3 should be just as fast as FTL LLVM on Octane/crypto
1970         https://bugs.webkit.org/show_bug.cgi?id=153113
1971
1972         Reviewed by Saam Barati.
1973
1974         This is the result of a hacking rampage to close the gap between FTL B3 and FTL LLVM on
1975         Octane/crypto. It was a very successful rampage.
1976
1977         The biggest change in this patch is the introduction of a phase called fixObviousSpills()
1978         that fixes patterns like:
1979
1980         Store register to stack slot and then use stack slot:
1981             Move %rcx, (stack42)
1982             Foo use:(stack42) // replace (stack42) with %rcx here.
1983
1984         Load stack slot into register and then use stack slot:
1985             Move (stack42), %rcx
1986             Foo use:(stack42) // replace (stack42) with %rcx here.
1987
1988         Store constant into stack slot and then use stack slot:
1989             Move $42, %rcx
1990             Move %rcx, (stack42)
1991             Bar def:%rcx // %rcx isn't available anymore, but we still know that (stack42) is $42
1992             Foo use:(stack42) // replace (stack42) with $42 here.
1993
1994         This phases does these fixups by doing a global forward flow that propagates sets of
1995         must-aliases.
1996
1997         Also added a phase to report register pressure. It pretty-prints code alongside the set of
1998         in-use registers above each instruction. Using this phase, I found that our register
1999         allocator is actually doing a pretty awesome job. I had previously feared that we'd have to
2000         make substantial changes to register allocation. I don't have such a fear anymore, at least
2001         for Octane/crypto. In the future, we can check how the regalloc is performing just by
2002         enabling logAirRegisterPressure.
2003
2004         Also fixed some FTL codegen pathologies. We were using bitOr where we meant to use a
2005         conditional or. LLVM likes to canonicalize boolean expressions this way. B3, on the other
2006         hand, doesn't do this canonicalization and doesn't have logic to decompose it into sequences
2007         of branches.
2008
2009         Also added strength reductions for checked arithmetic. It turns out that LLVM learned how to
2010         reduce checked multiply to unchecked multiply in some obvious cases that our existing DFG
2011         optimizations lacked. Ideally, our DFG integer range optimization phase would cover this. But
2012         the cases of interest were dead simple - the incoming values to the CheckMul were obviously
2013         too small to cause overflow. I added such reasoning to B3's strength reduction.
2014
2015         Finally, this fixes some bugs with how we were handling subwidth spill slots. The register
2016         allocator was making two mistakes. First, it might cause a Width64 def or use of a 4-byte
2017         spill slot. In that case, it would extend the size of the spill slot to ensure that the use
2018         or def is safe. Second, it emulates ZDef on Tmp behavior by emitting a Move32 to initialize
2019         the high bits of a spill slot. But this is unsound because of the liveness semantics of spill
2020         slots. They cannot have more than one def to initialize their value. I fixed that by making
2021         allocateStack() be the thing that fixes ZDefs. That's a change to ZDef semantics: now, ZDef
2022         on an anonymous stack slot means that the high bits are zero-filled. I wasn't able to
2023         construct a test for this. It might be a hypothetical bug, but still, I like how this
2024         simplifies the register allocator.
2025
2026         This is a ~0.7% speed-up on Octane.
2027
2028         * CMakeLists.txt:
2029         * JavaScriptCore.xcodeproj/project.pbxproj:
2030         * b3/B3CheckSpecial.cpp:
2031         (JSC::B3::CheckSpecial::hiddenBranch):
2032         (JSC::B3::CheckSpecial::forEachArg):
2033         (JSC::B3::CheckSpecial::commitHiddenBranch): Deleted.
2034         * b3/B3CheckSpecial.h:
2035         * b3/B3LowerToAir.cpp:
2036         (JSC::B3::Air::LowerToAir::fillStackmap):
2037         (JSC::B3::Air::LowerToAir::lower):
2038         * b3/B3StackmapValue.h:
2039         * b3/air/AirAllocateStack.cpp:
2040         (JSC::B3::Air::allocateStack):
2041         * b3/air/AirAllocateStack.h:
2042         * b3/air/AirArg.h:
2043         (JSC::B3::Air::Arg::callArg):
2044         (JSC::B3::Air::Arg::stackAddr):
2045         (JSC::B3::Air::Arg::isValidScale):
2046         * b3/air/AirBasicBlock.cpp:
2047         (JSC::B3::Air::BasicBlock::deepDump):
2048         (JSC::B3::Air::BasicBlock::dumpHeader):
2049         (JSC::B3::Air::BasicBlock::dumpFooter):
2050         * b3/air/AirBasicBlock.h:
2051         * b3/air/AirCCallSpecial.cpp:
2052         (JSC::B3::Air::CCallSpecial::CCallSpecial):
2053         (JSC::B3::Air::CCallSpecial::~CCallSpecial):
2054         * b3/air/AirCode.h:
2055         (JSC::B3::Air::Code::lastPhaseName):
2056         (JSC::B3::Air::Code::setEnableRCRS):
2057         (JSC::B3::Air::Code::enableRCRS):
2058         * b3/air/AirCustom.cpp:
2059         (JSC::B3::Air::PatchCustom::isValidForm):
2060         (JSC::B3::Air::CCallCustom::isValidForm):
2061         * b3/air/AirCustom.h:
2062         (JSC::B3::Air::PatchCustom::isValidFormStatic):
2063         (JSC::B3::Air::PatchCustom::admitsStack):
2064         (JSC::B3::Air::PatchCustom::isValidForm): Deleted.
2065         * b3/air/AirEmitShuffle.cpp:
2066         (JSC::B3::Air::ShufflePair::dump):
2067         (JSC::B3::Air::createShuffle):
2068         (JSC::B3::Air::emitShuffle):
2069         * b3/air/AirEmitShuffle.h:
2070         * b3/air/AirFixObviousSpills.cpp: Added.
2071         (JSC::B3::Air::fixObviousSpills):
2072         * b3/air/AirFixObviousSpills.h: Added.
2073         * b3/air/AirFixSpillSlotZDef.h: Removed.
2074         * b3/air/AirGenerate.cpp:
2075         (JSC::B3::Air::prepareForGeneration):
2076         (JSC::B3::Air::generate):
2077         * b3/air/AirHandleCalleeSaves.cpp:
2078         (JSC::B3::Air::handleCalleeSaves):
2079         * b3/air/AirInst.h:
2080         * b3/air/AirInstInlines.h:
2081         (JSC::B3::Air::Inst::reportUsedRegisters):
2082         (JSC::B3::Air::Inst::admitsStack):
2083         (JSC::B3::Air::isShiftValid):
2084         * b3/air/AirIteratedRegisterCoalescing.cpp:
2085         * b3/air/AirLiveness.h:
2086         (JSC::B3::Air::AbstractLiveness::AbstractLiveness):
2087         (JSC::B3::Air::AbstractLiveness::LocalCalc::Iterable::begin):
2088         (JSC::B3::Air::AbstractLiveness::LocalCalc::Iterable::end):
2089         (JSC::B3::Air::AbstractLiveness::LocalCalc::Iterable::contains):
2090         (JSC::B3::Air::AbstractLiveness::LocalCalc::live):
2091         (JSC::B3::Air::AbstractLiveness::LocalCalc::isLive):
2092         (JSC::B3::Air::AbstractLiveness::LocalCalc::execute):
2093         (JSC::B3::Air::AbstractLiveness::rawLiveAtHead):
2094         (JSC::B3::Air::AbstractLiveness::Iterable::begin):
2095         (JSC::B3::Air::AbstractLiveness::Iterable::end):
2096         (JSC::B3::Air::AbstractLiveness::Iterable::contains):
2097         (JSC::B3::Air::AbstractLiveness::liveAtTail):
2098         (JSC::B3::Air::AbstractLiveness::workset):
2099         * b3/air/AirLogRegisterPressure.cpp: Added.
2100         (JSC::B3::Air::logRegisterPressure):
2101         * b3/air/AirLogRegisterPressure.h: Added.
2102         * b3/air/AirOptimizeBlockOrder.cpp:
2103         (JSC::B3::Air::blocksInOptimizedOrder):
2104         (JSC::B3::Air::optimizeBlockOrder):
2105         * b3/air/AirOptimizeBlockOrder.h:
2106         * b3/air/AirReportUsedRegisters.cpp:
2107         (JSC::B3::Air::reportUsedRegisters):
2108         * b3/air/AirReportUsedRegisters.h:
2109         * b3/air/AirSpillEverything.cpp:
2110         (JSC::B3::Air::spillEverything):
2111         * b3/air/AirStackSlot.h:
2112         (JSC::B3::Air::StackSlot::isLocked):
2113         (JSC::B3::Air::StackSlot::index):
2114         (JSC::B3::Air::StackSlot::ensureSize):
2115         (JSC::B3::Air::StackSlot::alignment):
2116         * b3/air/AirValidate.cpp:
2117         * ftl/FTLB3Compile.cpp:
2118         (JSC::FTL::compile):
2119         * ftl/FTLLowerDFGToLLVM.cpp:
2120         (JSC::FTL::DFG::LowerDFGToLLVM::compileArithMul):
2121         (JSC::FTL::DFG::LowerDFGToLLVM::compileArithDiv):
2122         (JSC::FTL::DFG::LowerDFGToLLVM::compileArithMod):
2123         * jit/RegisterSet.h:
2124         (JSC::RegisterSet::get):
2125         (JSC::RegisterSet::setAll):
2126         (JSC::RegisterSet::merge):
2127         (JSC::RegisterSet::filter):
2128         * runtime/Options.h:
2129
2130 2016-01-19  Filip Pizlo  <fpizlo@apple.com>
2131
2132         Unreviewed, undo unintended commit.
2133
2134         * dfg/DFGCommon.h:
2135
2136 2016-01-18  Filip Pizlo  <fpizlo@apple.com>
2137
2138         Fix Air shuffling assertions
2139         https://bugs.webkit.org/show_bug.cgi?id=153213
2140
2141         Reviewed by Saam Barati.
2142
2143         Fixes some assertions that I was seeing running JSC tests. Adds a new Air test.
2144
2145         * assembler/MacroAssemblerX86Common.h:
2146         (JSC::MacroAssemblerX86Common::store8):
2147         (JSC::MacroAssemblerX86Common::getUnusedRegister):
2148         * b3/air/AirEmitShuffle.cpp:
2149         (JSC::B3::Air::emitShuffle):
2150         * b3/air/AirLowerAfterRegAlloc.cpp:
2151         (JSC::B3::Air::lowerAfterRegAlloc):
2152         * b3/air/testair.cpp:
2153         (JSC::B3::Air::testShuffleRotateWithFringe):
2154         (JSC::B3::Air::testShuffleRotateWithFringeInWeirdOrder):
2155         (JSC::B3::Air::testShuffleRotateWithLongFringe):
2156         (JSC::B3::Air::run):
2157
2158 2016-01-19  Konstantin Tokarev  <annulen@yandex.ru>
2159
2160         [mips] Logical instructions allow immediates in range 0..0xffff, not 0x7fff
2161         https://bugs.webkit.org/show_bug.cgi?id=152693
2162
2163         Reviewed by Michael Saboff.
2164
2165         * offlineasm/mips.rb:
2166
2167 2016-01-18  Saam barati  <sbarati@apple.com>
2168
2169         assertions in BytecodeUseDef.h about opcode length are off by one
2170         https://bugs.webkit.org/show_bug.cgi?id=153215
2171
2172         Reviewed by Dan Bernstein.
2173
2174         * bytecode/BytecodeUseDef.h:
2175         (JSC::computeUsesForBytecodeOffset):
2176
2177 2016-01-18  Saam barati  <sbarati@apple.com>
2178
2179         FTL doesn't do proper spilling for exception handling when GetById/Snippets go to slow path
2180         https://bugs.webkit.org/show_bug.cgi?id=153186
2181
2182         Reviewed by Michael Saboff.
2183
2184         Michael was investigating a bug he found while doing the new JSC calling 
2185         convention work and it turns out to be a latent bug in FTL try/catch machinery.
2186         After I looked at the code again, I realized that what I had previously
2187         written is wrong in a subtle way. The FTL callOperation machinery will remove
2188         its result register from the set of registers it needs to spill. This is not
2189         correct when we have try/catch. We may want to do value recovery on
2190         the value that the result register is prior to the call after the call
2191         throws an exception. The case that we were solving before was when the 
2192         resultRegister == baseRegister in a GetById, or left/rightRegister == resultRegister in a Snippet.
2193         This code is correct in wanting to spill in that case, even though it might spill
2194         when we don't need it to (i.e the result is not needed for value recovery). Once I
2195         investigated this bug further, I realized that the previous rule is just a
2196         partial subset of the rule that says we should spill anytime the result is
2197         a register we might do value recovery on. This patch implements the rule that
2198         says we always want to spill the result when we will do value recovery on it 
2199         if an exception is thrown.
2200
2201         * ftl/FTLCompile.cpp:
2202         (JSC::FTL::mmAllocateDataSection):
2203         * tests/stress/ftl-try-catch-getter-throw-interesting-value-recovery.js: Added.
2204         (assert):
2205         (random):
2206         (identity):
2207         (let.o2.get f):
2208         (let.o3.get f):
2209         (foo):
2210         (i.else):
2211
2212 2016-01-18  Konstantin Tokarev  <annulen@yandex.ru>
2213
2214         [MIPS] LLInt: fix calculation of Global Offset Table
2215         https://bugs.webkit.org/show_bug.cgi?id=150381
2216
2217         Offlineasm adds a .cpload $t9 when we create a label in MIPS, which
2218         computes address of GOT. However, this instruction requires $t9 to
2219         contain address of current function. So we need to set $t9 to pcBase,
2220         otherwise GOT-related calculations will be invalid.
2221
2222         Since offlineasm does not allow direct move to $t9 on MIPS, added new
2223         instruction setcallreg which does exactly that.
2224
2225         Reviewed by Michael Saboff.
2226
2227         * llint/LowLevelInterpreter.asm:
2228         * offlineasm/instructions.rb:
2229         * offlineasm/mips.rb:
2230
2231 2016-01-18  Csaba Osztrogonác  <ossy@webkit.org>
2232
2233         REGRESSION(r194601): Fix the jsc timeout option of jsc.cpp
2234         https://bugs.webkit.org/show_bug.cgi?id=153204
2235
2236         Reviewed by Michael Catanzaro.
2237
2238         * jsc.cpp:
2239         (main):
2240
2241 2016-01-18  Csaba Osztrogonác  <ossy@webkit.org>
2242
2243         [cmake] Add testair to the build system
2244         https://bugs.webkit.org/show_bug.cgi?id=153126
2245
2246         Reviewed by Michael Catanzaro.
2247
2248         * shell/CMakeLists.txt:
2249
2250 2016-01-17  Jeremy Huddleston Sequoia  <jeremyhu@apple.com>
2251
2252         Ensure that CF_AVAILABLE is undefined when building webkit-gtk
2253
2254         https://bugs.webkit.org/show_bug.cgi?id=152720
2255
2256         This change ensures that CF_AVAILABLE is correctly a no-op to
2257         address build failure that was observed when building on older
2258         versions of OSX.  Previously, CF_AVAILABLE may have been unexpectedly
2259         re-defined to the system header value based on include-order.
2260
2261         Reviewed by Michael Catanzaro.
2262
2263         * API/WebKitAvailability.h:
2264
2265 2016-01-17  Julien Brianceau  <jbriance@cisco.com>
2266
2267         [mips] Fix regT2 and regT3 trampling in MacroAssembler
2268         https://bugs.webkit.org/show_bug.cgi?id=153131
2269
2270         Mips $t2 and $t3 registers were used as temporary registers
2271         in MacroAssemblerMIPS.h, whereas they are mapped to regT2
2272         and regT3 in LLInt and GPRInfo.
2273
2274         This patch rearranges register mapping for the mips architecture:
2275         - use $t0 and $t1 as temp registers in LLInt (as in MacroAssembler)
2276         - use $t7 and $t8 as temp registers in MacroAssembler (as in LLInt)
2277         - remove $t6 from temp registers list in LLInt
2278         - update GPRInfo.h accordingly
2279         - add mips macroScratchRegisters() list in RegisterSet.cpp
2280
2281         Reviewed by Michael Saboff.
2282
2283         * assembler/MacroAssemblerMIPS.h:
2284         * jit/GPRInfo.h:
2285         (JSC::GPRInfo::toRegister):
2286         (JSC::GPRInfo::toIndex):
2287         * jit/RegisterSet.cpp:
2288         (JSC::RegisterSet::macroScratchRegisters):
2289         (JSC::RegisterSet::calleeSaveRegisters):
2290         * offlineasm/mips.rb:
2291
2292 2016-01-16  Skachkov Oleksandr  <gskachkov@gmail.com>
2293
2294         [ES6] Arrow function syntax. Arrow function should support the destructuring parameters.
2295         https://bugs.webkit.org/show_bug.cgi?id=146934
2296
2297         Reviewed by Saam Barati.
2298         
2299         Added support of destructuring parameters, before arrow function expect only simple parameters,
2300         e.g. (), (x), (x, y) or x in assigment expressio. To support destructuring parameters added
2301         additional check that check for destructuring paramters if check does not pass for simple parameters.
2302
2303         * parser/Parser.cpp:
2304         (JSC::Parser<LexerType>::isArrowFunctionParameters):
2305         (JSC::Parser<LexerType>::parseAssignmentExpression):
2306         * parser/Parser.h:
2307
2308 2016-01-15  Benjamin Poulain  <bpoulain@apple.com>
2309
2310         [JSC] Legalize Memory Offsets for ARM64 before lowering to Air
2311         https://bugs.webkit.org/show_bug.cgi?id=153065
2312
2313         Reviewed by Mark Lam.
2314         Reviewed by Filip Pizlo.
2315
2316         On ARM64, we cannot use signed 32bits offset for memory addressing.
2317         There are two available addressing: signed 9bits and unsigned scaled 12bits.
2318         Air already knows about it.
2319
2320         In this patch, the offsets are changed to something valid for ARM64
2321         prior to lowering. When an offset is invalid, it is just computed
2322         before the instruction and used as the base for addressing.
2323
2324         * JavaScriptCore.xcodeproj/project.pbxproj:
2325         * b3/B3Generate.cpp:
2326         (JSC::B3::generateToAir):
2327         * b3/B3LegalizeMemoryOffsets.cpp: Added.
2328         (JSC::B3::legalizeMemoryOffsets):
2329         * b3/B3LegalizeMemoryOffsets.h: Added.
2330         * b3/B3LowerToAir.cpp:
2331         (JSC::B3::Air::LowerToAir::effectiveAddr): Deleted.
2332         * b3/testb3.cpp:
2333         (JSC::B3::testLoadWithOffsetImpl):
2334         (JSC::B3::testLoadOffsetImm9Max):
2335         (JSC::B3::testLoadOffsetImm9MaxPlusOne):
2336         (JSC::B3::testLoadOffsetImm9MaxPlusTwo):
2337         (JSC::B3::testLoadOffsetImm9Min):
2338         (JSC::B3::testLoadOffsetImm9MinMinusOne):
2339         (JSC::B3::testLoadOffsetScaledUnsignedImm12Max):
2340         (JSC::B3::testLoadOffsetScaledUnsignedOverImm12Max):
2341         (JSC::B3::run):
2342
2343 2016-01-15  Alex Christensen  <achristensen@webkit.org>
2344
2345         Fix internal Windows build
2346         https://bugs.webkit.org/show_bug.cgi?id=153142
2347
2348         Reviewed by Brent Fulgham.
2349
2350         The internal Windows build builds JavaScriptCore from a directory that is not called JavaScriptCore.
2351         Searching for JavaScriptCore/API/APICast.h fails because it is in SomethingElse/API/APICast.h.
2352         Since we are including the JavaScriptCore directory, it is not necessary to have JavaScriptCore in
2353         the forwarding headers, but removing it allows builds form directories that are not named JavaScriptCore.
2354
2355         * ForwardingHeaders/JavaScriptCore/APICast.h:
2356         * ForwardingHeaders/JavaScriptCore/JSBase.h:
2357         * ForwardingHeaders/JavaScriptCore/JSCTestRunnerUtils.h:
2358         * ForwardingHeaders/JavaScriptCore/JSContextRef.h:
2359         * ForwardingHeaders/JavaScriptCore/JSObjectRef.h:
2360         * ForwardingHeaders/JavaScriptCore/JSRetainPtr.h:
2361         * ForwardingHeaders/JavaScriptCore/JSStringRef.h:
2362         * ForwardingHeaders/JavaScriptCore/JSStringRefCF.h:
2363         * ForwardingHeaders/JavaScriptCore/JSValueRef.h:
2364         * ForwardingHeaders/JavaScriptCore/JavaScript.h:
2365         * ForwardingHeaders/JavaScriptCore/JavaScriptCore.h:
2366         * ForwardingHeaders/JavaScriptCore/OpaqueJSString.h:
2367         * ForwardingHeaders/JavaScriptCore/WebKitAvailability.h:
2368
2369 2016-01-15  Per Arne Vollan  <peavo@outlook.com>
2370
2371         [B3][Win64] Compile fixes.
2372         https://bugs.webkit.org/show_bug.cgi?id=153127
2373
2374         Reviewed by Alex Christensen.
2375
2376         MSVC have several overloads of fmod, pow, and ceil. We need to suggest to MSVC
2377         which one we want to use.
2378
2379         * b3/B3LowerMacros.cpp:
2380         * b3/B3LowerMacrosAfterOptimizations.cpp:
2381         * b3/B3MathExtras.cpp:
2382         (JSC::B3::powDoubleInt32):
2383         * b3/B3ReduceStrength.cpp:
2384
2385 2016-01-15  Filip Pizlo  <fpizlo@apple.com>
2386
2387         Air needs a Shuffle instruction
2388         https://bugs.webkit.org/show_bug.cgi?id=152952
2389
2390         Reviewed by Saam Barati.
2391
2392         This adds an instruction called Shuffle. Shuffle allows you to simultaneously perform
2393         multiple moves to perform arbitrary permutations over registers and memory. We call these
2394         rotations. It also allows you to perform "shifts", like (a => b, b => c): after the shift,
2395         c will have b's old value, b will have a's old value, and a will be unchanged. Shifts can
2396         use immediates as their source.
2397
2398         Shuffle is added as a custom instruction, since it has a variable number of arguments. It
2399         takes any number of triplets of arguments, where each triplet describes one mapping of the
2400         shuffle. For example, to represent (a => b, b => c), we might say:
2401
2402             Shuffle %a, %b, 64, %b, %c, 64
2403
2404         Note the "64"s, those are width arguments that describe how many bits of the register are
2405         being moved. Each triplet is referred to as a "shuffle pair". We call it a pair because the
2406         most relevant part of it is the pair of registers or memroy locations (i.e. %a, %b form one
2407         of the pairs in the example). For GP arguments, the width follows ZDef semantics.
2408
2409         In the future, we will be able to use Shuffle for a lot of things. This patch is modest about
2410         how to use it:
2411
2412         - C calling convention argument marshalling. Previously we used move instructions. But that's
2413           problematic since it introduces artificial interference between the argument registers and
2414           the inputs. Using Shuffle removes that interference. This helps a bit.
2415
2416         - Cold C calls. This is what really motivated me to write this patch. If we have a C call on
2417           a cold path, then we want it to appear to the register allocator like it doesn't clobber
2418           any registers. Only after register allocation should we handle the clobbering by simply
2419           saving all of the live volatile registers to the stack. If you imagine the saving and the
2420           argument marshalling, you can see how before the call, we want to have a Shuffle that does
2421           both of those things. This is important. If argument marshalling was separate from the
2422           saving, then we'd still appear to clobber argument registers. Doing them together as one
2423           Shuffle means that the cold call doesn't appear to even clobber the argument registers.
2424
2425         Unfortunately, I was wrong about cold C calls being the dominant problem with our register
2426         allocator right now. Fixing this revealed other problems in my current tuning benchmark,
2427         Octane/encrypt. Nonetheless, this is a small speed-up across the board, and gives us some
2428         functionality we will need to implement other optimizations.
2429
2430         Relanding after fixing production build.
2431
2432         * CMakeLists.txt:
2433         * JavaScriptCore.xcodeproj/project.pbxproj:
2434         * assembler/AbstractMacroAssembler.h:
2435         (JSC::isX86_64):
2436         (JSC::isIOS):
2437         (JSC::optimizeForARMv7IDIVSupported):
2438         * assembler/MacroAssemblerX86Common.h:
2439         (JSC::MacroAssemblerX86Common::zeroExtend32ToPtr):
2440         (JSC::MacroAssemblerX86Common::swap32):
2441         (JSC::MacroAssemblerX86Common::moveConditionally32):
2442         * assembler/MacroAssemblerX86_64.h:
2443         (JSC::MacroAssemblerX86_64::store64WithAddressOffsetPatch):
2444         (JSC::MacroAssemblerX86_64::swap64):
2445         (JSC::MacroAssemblerX86_64::move64ToDouble):
2446         * assembler/X86Assembler.h:
2447         (JSC::X86Assembler::xchgl_rr):
2448         (JSC::X86Assembler::xchgl_rm):
2449         (JSC::X86Assembler::xchgq_rr):
2450         (JSC::X86Assembler::xchgq_rm):
2451         (JSC::X86Assembler::movl_rr):
2452         * b3/B3CCallValue.h:
2453         * b3/B3Compilation.cpp:
2454         (JSC::B3::Compilation::Compilation):
2455         (JSC::B3::Compilation::~Compilation):
2456         * b3/B3Compilation.h:
2457         (JSC::B3::Compilation::code):
2458         * b3/B3LowerToAir.cpp:
2459         (JSC::B3::Air::LowerToAir::run):
2460         (JSC::B3::Air::LowerToAir::createSelect):
2461         (JSC::B3::Air::LowerToAir::lower):
2462         (JSC::B3::Air::LowerToAir::marshallCCallArgument): Deleted.
2463         * b3/B3OpaqueByproducts.h:
2464         (JSC::B3::OpaqueByproducts::count):
2465         * b3/B3StackmapSpecial.cpp:
2466         (JSC::B3::StackmapSpecial::isArgValidForValue):
2467         (JSC::B3::StackmapSpecial::isArgValidForRep):
2468         * b3/air/AirArg.cpp:
2469         (JSC::B3::Air::Arg::isStackMemory):
2470         (JSC::B3::Air::Arg::isRepresentableAs):
2471         (JSC::B3::Air::Arg::usesTmp):
2472         (JSC::B3::Air::Arg::canRepresent):
2473         (JSC::B3::Air::Arg::isCompatibleType):
2474         (JSC::B3::Air::Arg::dump):
2475         (WTF::printInternal):
2476         * b3/air/AirArg.h:
2477         (JSC::B3::Air::Arg::forEachType):
2478         (JSC::B3::Air::Arg::isWarmUse):
2479         (JSC::B3::Air::Arg::cooled):
2480         (JSC::B3::Air::Arg::isEarlyUse):
2481         (JSC::B3::Air::Arg::imm64):
2482         (JSC::B3::Air::Arg::immPtr):
2483         (JSC::B3::Air::Arg::addr):
2484         (JSC::B3::Air::Arg::special):
2485         (JSC::B3::Air::Arg::widthArg):
2486         (JSC::B3::Air::Arg::operator==):
2487         (JSC::B3::Air::Arg::isImm64):
2488         (JSC::B3::Air::Arg::isSomeImm):
2489         (JSC::B3::Air::Arg::isAddr):
2490         (JSC::B3::Air::Arg::isIndex):
2491         (JSC::B3::Air::Arg::isMemory):
2492         (JSC::B3::Air::Arg::isRelCond):
2493         (JSC::B3::Air::Arg::isSpecial):
2494         (JSC::B3::Air::Arg::isWidthArg):
2495         (JSC::B3::Air::Arg::isAlive):
2496         (JSC::B3::Air::Arg::base):
2497         (JSC::B3::Air::Arg::hasOffset):
2498         (JSC::B3::Air::Arg::offset):
2499         (JSC::B3::Air::Arg::width):
2500         (JSC::B3::Air::Arg::isGPTmp):
2501         (JSC::B3::Air::Arg::isGP):
2502         (JSC::B3::Air::Arg::isFP):
2503         (JSC::B3::Air::Arg::isType):
2504         (JSC::B3::Air::Arg::isGPR):
2505         (JSC::B3::Air::Arg::isValidForm):
2506         (JSC::B3::Air::Arg::forEachTmpFast):
2507         * b3/air/AirBasicBlock.h:
2508         (JSC::B3::Air::BasicBlock::insts):
2509         (JSC::B3::Air::BasicBlock::appendInst):
2510         (JSC::B3::Air::BasicBlock::append):
2511         * b3/air/AirCCallingConvention.cpp: Added.
2512         (JSC::B3::Air::computeCCallingConvention):
2513         (JSC::B3::Air::cCallResult):
2514         (JSC::B3::Air::buildCCall):
2515         * b3/air/AirCCallingConvention.h: Added.
2516         * b3/air/AirCode.h:
2517         (JSC::B3::Air::Code::proc):
2518         * b3/air/AirCustom.cpp: Added.
2519         (JSC::B3::Air::CCallCustom::isValidForm):
2520         (JSC::B3::Air::CCallCustom::generate):
2521         (JSC::B3::Air::ShuffleCustom::isValidForm):
2522         (JSC::B3::Air::ShuffleCustom::generate):
2523         * b3/air/AirCustom.h:
2524         (JSC::B3::Air::PatchCustom::forEachArg):
2525         (JSC::B3::Air::PatchCustom::generate):
2526         (JSC::B3::Air::CCallCustom::forEachArg):
2527         (JSC::B3::Air::CCallCustom::isValidFormStatic):
2528         (JSC::B3::Air::CCallCustom::admitsStack):
2529         (JSC::B3::Air::CCallCustom::hasNonArgNonControlEffects):
2530         (JSC::B3::Air::ColdCCallCustom::forEachArg):
2531         (JSC::B3::Air::ShuffleCustom::forEachArg):
2532         (JSC::B3::Air::ShuffleCustom::isValidFormStatic):
2533         (JSC::B3::Air::ShuffleCustom::admitsStack):
2534         (JSC::B3::Air::ShuffleCustom::hasNonArgNonControlEffects):
2535         * b3/air/AirEmitShuffle.cpp: Added.
2536         (JSC::B3::Air::ShufflePair::dump):
2537         (JSC::B3::Air::emitShuffle):
2538         * b3/air/AirEmitShuffle.h: Added.
2539         (JSC::B3::Air::ShufflePair::ShufflePair):
2540         (JSC::B3::Air::ShufflePair::src):
2541         (JSC::B3::Air::ShufflePair::dst):
2542         (JSC::B3::Air::ShufflePair::width):
2543         * b3/air/AirGenerate.cpp:
2544         (JSC::B3::Air::prepareForGeneration):
2545         * b3/air/AirGenerate.h:
2546         * b3/air/AirInsertionSet.cpp:
2547         (JSC::B3::Air::InsertionSet::insertInsts):
2548         (JSC::B3::Air::InsertionSet::execute):
2549         * b3/air/AirInsertionSet.h:
2550         (JSC::B3::Air::InsertionSet::insertInst):
2551         (JSC::B3::Air::InsertionSet::insert):
2552         * b3/air/AirInst.h:
2553         (JSC::B3::Air::Inst::operator bool):
2554         (JSC::B3::Air::Inst::append):
2555         * b3/air/AirLowerAfterRegAlloc.cpp: Added.
2556         (JSC::B3::Air::lowerAfterRegAlloc):
2557         * b3/air/AirLowerAfterRegAlloc.h: Added.
2558         * b3/air/AirLowerMacros.cpp: Added.
2559         (JSC::B3::Air::lowerMacros):
2560         * b3/air/AirLowerMacros.h: Added.
2561         * b3/air/AirOpcode.opcodes:
2562         * b3/air/AirRegisterPriority.h:
2563         (JSC::B3::Air::regsInPriorityOrder):
2564         * b3/air/testair.cpp: Added.
2565         (hiddenTruthBecauseNoReturnIsStupid):
2566         (usage):
2567         (JSC::B3::Air::compile):
2568         (JSC::B3::Air::invoke):
2569         (JSC::B3::Air::compileAndRun):
2570         (JSC::B3::Air::testSimple):
2571         (JSC::B3::Air::loadConstantImpl):
2572         (JSC::B3::Air::loadConstant):
2573         (JSC::B3::Air::loadDoubleConstant):
2574         (JSC::B3::Air::testShuffleSimpleSwap):
2575         (JSC::B3::Air::testShuffleSimpleShift):
2576         (JSC::B3::Air::testShuffleLongShift):
2577         (JSC::B3::Air::testShuffleLongShiftBackwards):
2578         (JSC::B3::Air::testShuffleSimpleRotate):
2579         (JSC::B3::Air::testShuffleSimpleBroadcast):
2580         (JSC::B3::Air::testShuffleBroadcastAllRegs):
2581         (JSC::B3::Air::testShuffleTreeShift):
2582         (JSC::B3::Air::testShuffleTreeShiftBackward):
2583         (JSC::B3::Air::testShuffleTreeShiftOtherBackward):
2584         (JSC::B3::Air::testShuffleMultipleShifts):
2585         (JSC::B3::Air::testShuffleRotateWithFringe):
2586         (JSC::B3::Air::testShuffleRotateWithLongFringe):
2587         (JSC::B3::Air::testShuffleMultipleRotates):
2588         (JSC::B3::Air::testShuffleShiftAndRotate):
2589         (JSC::B3::Air::testShuffleShiftAllRegs):
2590         (JSC::B3::Air::testShuffleRotateAllRegs):
2591         (JSC::B3::Air::testShuffleSimpleSwap64):
2592         (JSC::B3::Air::testShuffleSimpleShift64):
2593         (JSC::B3::Air::testShuffleSwapMixedWidth):
2594         (JSC::B3::Air::testShuffleShiftMixedWidth):
2595         (JSC::B3::Air::testShuffleShiftMemory):
2596         (JSC::B3::Air::testShuffleShiftMemoryLong):
2597         (JSC::B3::Air::testShuffleShiftMemoryAllRegs):
2598         (JSC::B3::Air::testShuffleShiftMemoryAllRegs64):
2599         (JSC::B3::Air::combineHiLo):
2600         (JSC::B3::Air::testShuffleShiftMemoryAllRegsMixedWidth):
2601         (JSC::B3::Air::testShuffleRotateMemory):
2602         (JSC::B3::Air::testShuffleRotateMemory64):
2603         (JSC::B3::Air::testShuffleRotateMemoryMixedWidth):
2604         (JSC::B3::Air::testShuffleRotateMemoryAllRegs64):
2605         (JSC::B3::Air::testShuffleRotateMemoryAllRegsMixedWidth):
2606         (JSC::B3::Air::testShuffleSwapDouble):
2607         (JSC::B3::Air::testShuffleShiftDouble):
2608         (JSC::B3::Air::run):
2609         (run):
2610         (main):
2611         * b3/testb3.cpp:
2612         (JSC::B3::testCallSimple):
2613         (JSC::B3::testCallRare):
2614         (JSC::B3::testCallRareLive):
2615         (JSC::B3::testCallSimplePure):
2616         (JSC::B3::run):
2617
2618 2016-01-15  Andy VanWagoner  <thetalecrafter@gmail.com>
2619
2620         [INTL] Implement Date.prototype.toLocaleString in ECMA-402
2621         https://bugs.webkit.org/show_bug.cgi?id=147611
2622
2623         Reviewed by Benjamin Poulain.
2624
2625         Expose dateProtoFuncGetTime as thisTimeValue for builtins.
2626         Remove unused code in DateTimeFormat toDateTimeOptions, and make the
2627         function specific to the call in initializeDateTimeFormat. Properly
2628         throw when the options parameter is null.
2629         Add toLocaleString in builtin JavaScript, with it's own specific branch
2630         of toDateTimeOptions.
2631
2632         * CMakeLists.txt:
2633         * DerivedSources.make:
2634         * JavaScriptCore.xcodeproj/project.pbxproj:
2635         * builtins/DatePrototype.js: Added.
2636         (toLocaleString.toDateTimeOptionsAnyAll):
2637         (toLocaleString):
2638         * runtime/CommonIdentifiers.h:
2639         * runtime/DatePrototype.cpp:
2640         (JSC::DatePrototype::finishCreation):
2641         * runtime/DatePrototype.h:
2642         * runtime/IntlDateTimeFormat.cpp:
2643         (JSC::toDateTimeOptionsAnyDate):
2644         (JSC::IntlDateTimeFormat::initializeDateTimeFormat):
2645         (JSC::toDateTimeOptions): Deleted.
2646         * runtime/JSGlobalObject.cpp:
2647         (JSC::JSGlobalObject::init):
2648
2649 2016-01-15  Konstantin Tokarev  <annulen@yandex.ru>
2650
2651         [mips] Implemented emitFunctionPrologue/Epilogue
2652         https://bugs.webkit.org/show_bug.cgi?id=152947
2653
2654         Reviewed by Michael Saboff.
2655
2656         * assembler/MacroAssemblerMIPS.h:
2657         (JSC::MacroAssemblerMIPS::popPair):
2658         (JSC::MacroAssemblerMIPS::pushPair):
2659         * jit/AssemblyHelpers.h:
2660         (JSC::AssemblyHelpers::emitFunctionPrologue):
2661         (JSC::AssemblyHelpers::emitFunctionEpilogueWithEmptyFrame):
2662         (JSC::AssemblyHelpers::emitFunctionEpilogue):
2663
2664 2016-01-15  Commit Queue  <commit-queue@webkit.org>
2665
2666         Unreviewed, rolling out r195084.
2667         https://bugs.webkit.org/show_bug.cgi?id=153132
2668
2669         Broke Production build (Requested by ap on #webkit).
2670
2671         Reverted changeset:
2672
2673         "Air needs a Shuffle instruction"
2674         https://bugs.webkit.org/show_bug.cgi?id=152952
2675         http://trac.webkit.org/changeset/195084
2676
2677 2016-01-15  Julien Brianceau  <jbriance@cisco.com>
2678
2679         [mips] Add countLeadingZeros32 implementation in macro assembler
2680         https://bugs.webkit.org/show_bug.cgi?id=152886
2681
2682         Reviewed by Michael Saboff.
2683
2684         * assembler/MIPSAssembler.h:
2685         (JSC::MIPSAssembler::lui):
2686         (JSC::MIPSAssembler::clz):
2687         (JSC::MIPSAssembler::addiu):
2688         * assembler/MacroAssemblerMIPS.h:
2689         (JSC::MacroAssemblerMIPS::and32):
2690         (JSC::MacroAssemblerMIPS::countLeadingZeros32):
2691         (JSC::MacroAssemblerMIPS::lshift32):
2692
2693 2016-01-14  Filip Pizlo  <fpizlo@apple.com>
2694
2695         Air needs a Shuffle instruction
2696         https://bugs.webkit.org/show_bug.cgi?id=152952
2697
2698         Reviewed by Saam Barati.
2699
2700         This adds an instruction called Shuffle. Shuffle allows you to simultaneously perform
2701         multiple moves to perform arbitrary permutations over registers and memory. We call these
2702         rotations. It also allows you to perform "shifts", like (a => b, b => c): after the shift,
2703         c will have b's old value, b will have a's old value, and a will be unchanged. Shifts can
2704         use immediates as their source.
2705
2706         Shuffle is added as a custom instruction, since it has a variable number of arguments. It
2707         takes any number of triplets of arguments, where each triplet describes one mapping of the
2708         shuffle. For example, to represent (a => b, b => c), we might say:
2709
2710             Shuffle %a, %b, 64, %b, %c, 64
2711
2712         Note the "64"s, those are width arguments that describe how many bits of the register are
2713         being moved. Each triplet is referred to as a "shuffle pair". We call it a pair because the
2714         most relevant part of it is the pair of registers or memroy locations (i.e. %a, %b form one
2715         of the pairs in the example). For GP arguments, the width follows ZDef semantics.
2716
2717         In the future, we will be able to use Shuffle for a lot of things. This patch is modest about
2718         how to use it:
2719
2720         - C calling convention argument marshalling. Previously we used move instructions. But that's
2721           problematic since it introduces artificial interference between the argument registers and
2722           the inputs. Using Shuffle removes that interference. This helps a bit.
2723
2724         - Cold C calls. This is what really motivated me to write this patch. If we have a C call on
2725           a cold path, then we want it to appear to the register allocator like it doesn't clobber
2726           any registers. Only after register allocation should we handle the clobbering by simply
2727           saving all of the live volatile registers to the stack. If you imagine the saving and the
2728           argument marshalling, you can see how before the call, we want to have a Shuffle that does
2729           both of those things. This is important. If argument marshalling was separate from the
2730           saving, then we'd still appear to clobber argument registers. Doing them together as one
2731           Shuffle means that the cold call doesn't appear to even clobber the argument registers.
2732
2733         Unfortunately, I was wrong about cold C calls being the dominant problem with our register
2734         allocator right now. Fixing this revealed other problems in my current tuning benchmark,
2735         Octane/encrypt. Nonetheless, this is a small speed-up across the board, and gives us some
2736         functionality we will need to implement other optimizations.
2737
2738         * CMakeLists.txt:
2739         * JavaScriptCore.xcodeproj/project.pbxproj:
2740         * assembler/AbstractMacroAssembler.h:
2741         (JSC::isX86_64):
2742         (JSC::isIOS):
2743         (JSC::optimizeForARMv7IDIVSupported):
2744         * assembler/MacroAssemblerX86Common.h:
2745         (JSC::MacroAssemblerX86Common::zeroExtend32ToPtr):
2746         (JSC::MacroAssemblerX86Common::swap32):
2747         (JSC::MacroAssemblerX86Common::moveConditionally32):
2748         * assembler/MacroAssemblerX86_64.h:
2749         (JSC::MacroAssemblerX86_64::store64WithAddressOffsetPatch):
2750         (JSC::MacroAssemblerX86_64::swap64):
2751         (JSC::MacroAssemblerX86_64::move64ToDouble):
2752         * assembler/X86Assembler.h:
2753         (JSC::X86Assembler::xchgl_rr):
2754         (JSC::X86Assembler::xchgl_rm):
2755         (JSC::X86Assembler::xchgq_rr):
2756         (JSC::X86Assembler::xchgq_rm):
2757         (JSC::X86Assembler::movl_rr):
2758         * b3/B3CCallValue.h:
2759         * b3/B3Compilation.cpp:
2760         (JSC::B3::Compilation::Compilation):
2761         (JSC::B3::Compilation::~Compilation):
2762         * b3/B3Compilation.h:
2763         (JSC::B3::Compilation::code):
2764         * b3/B3LowerToAir.cpp:
2765         (JSC::B3::Air::LowerToAir::run):
2766         (JSC::B3::Air::LowerToAir::createSelect):
2767         (JSC::B3::Air::LowerToAir::lower):
2768         (JSC::B3::Air::LowerToAir::marshallCCallArgument): Deleted.
2769         * b3/B3OpaqueByproducts.h:
2770         (JSC::B3::OpaqueByproducts::count):
2771         * b3/B3StackmapSpecial.cpp:
2772         (JSC::B3::StackmapSpecial::isArgValidForValue):
2773         (JSC::B3::StackmapSpecial::isArgValidForRep):
2774         * b3/air/AirArg.cpp:
2775         (JSC::B3::Air::Arg::isStackMemory):
2776         (JSC::B3::Air::Arg::isRepresentableAs):
2777         (JSC::B3::Air::Arg::usesTmp):
2778         (JSC::B3::Air::Arg::canRepresent):
2779         (JSC::B3::Air::Arg::isCompatibleType):
2780         (JSC::B3::Air::Arg::dump):
2781         (WTF::printInternal):
2782         * b3/air/AirArg.h:
2783         (JSC::B3::Air::Arg::forEachType):
2784         (JSC::B3::Air::Arg::isWarmUse):
2785         (JSC::B3::Air::Arg::cooled):
2786         (JSC::B3::Air::Arg::isEarlyUse):
2787         (JSC::B3::Air::Arg::imm64):
2788         (JSC::B3::Air::Arg::immPtr):
2789         (JSC::B3::Air::Arg::addr):
2790         (JSC::B3::Air::Arg::special):
2791         (JSC::B3::Air::Arg::widthArg):
2792         (JSC::B3::Air::Arg::operator==):
2793         (JSC::B3::Air::Arg::isImm64):
2794         (JSC::B3::Air::Arg::isSomeImm):
2795         (JSC::B3::Air::Arg::isAddr):
2796         (JSC::B3::Air::Arg::isIndex):
2797         (JSC::B3::Air::Arg::isMemory):
2798         (JSC::B3::Air::Arg::isRelCond):
2799         (JSC::B3::Air::Arg::isSpecial):
2800         (JSC::B3::Air::Arg::isWidthArg):
2801         (JSC::B3::Air::Arg::isAlive):
2802         (JSC::B3::Air::Arg::base):
2803         (JSC::B3::Air::Arg::hasOffset):
2804         (JSC::B3::Air::Arg::offset):
2805         (JSC::B3::Air::Arg::width):
2806         (JSC::B3::Air::Arg::isGPTmp):
2807         (JSC::B3::Air::Arg::isGP):
2808         (JSC::B3::Air::Arg::isFP):
2809         (JSC::B3::Air::Arg::isType):
2810         (JSC::B3::Air::Arg::isGPR):
2811         (JSC::B3::Air::Arg::isValidForm):
2812         (JSC::B3::Air::Arg::forEachTmpFast):
2813         * b3/air/AirBasicBlock.h:
2814         (JSC::B3::Air::BasicBlock::insts):
2815         (JSC::B3::Air::BasicBlock::appendInst):
2816         (JSC::B3::Air::BasicBlock::append):
2817         * b3/air/AirCCallingConvention.cpp: Added.
2818         (JSC::B3::Air::computeCCallingConvention):
2819         (JSC::B3::Air::cCallResult):
2820         (JSC::B3::Air::buildCCall):
2821         * b3/air/AirCCallingConvention.h: Added.
2822         * b3/air/AirCode.h:
2823         (JSC::B3::Air::Code::proc):
2824         * b3/air/AirCustom.cpp: Added.
2825         (JSC::B3::Air::CCallCustom::isValidForm):
2826         (JSC::B3::Air::CCallCustom::generate):
2827         (JSC::B3::Air::ShuffleCustom::isValidForm):
2828         (JSC::B3::Air::ShuffleCustom::generate):
2829         * b3/air/AirCustom.h:
2830         (JSC::B3::Air::PatchCustom::forEachArg):
2831         (JSC::B3::Air::PatchCustom::generate):
2832         (JSC::B3::Air::CCallCustom::forEachArg):
2833         (JSC::B3::Air::CCallCustom::isValidFormStatic):
2834         (JSC::B3::Air::CCallCustom::admitsStack):
2835         (JSC::B3::Air::CCallCustom::hasNonArgNonControlEffects):
2836         (JSC::B3::Air::ColdCCallCustom::forEachArg):
2837         (JSC::B3::Air::ShuffleCustom::forEachArg):
2838         (JSC::B3::Air::ShuffleCustom::isValidFormStatic):
2839         (JSC::B3::Air::ShuffleCustom::admitsStack):
2840         (JSC::B3::Air::ShuffleCustom::hasNonArgNonControlEffects):
2841         * b3/air/AirEmitShuffle.cpp: Added.
2842         (JSC::B3::Air::ShufflePair::dump):
2843         (JSC::B3::Air::emitShuffle):
2844         * b3/air/AirEmitShuffle.h: Added.
2845         (JSC::B3::Air::ShufflePair::ShufflePair):
2846         (JSC::B3::Air::ShufflePair::src):
2847         (JSC::B3::Air::ShufflePair::dst):
2848         (JSC::B3::Air::ShufflePair::width):
2849         * b3/air/AirGenerate.cpp:
2850         (JSC::B3::Air::prepareForGeneration):
2851         * b3/air/AirGenerate.h:
2852         * b3/air/AirInsertionSet.cpp:
2853         (JSC::B3::Air::InsertionSet::insertInsts):
2854         (JSC::B3::Air::InsertionSet::execute):
2855         * b3/air/AirInsertionSet.h:
2856         (JSC::B3::Air::InsertionSet::insertInst):
2857         (JSC::B3::Air::InsertionSet::insert):
2858         * b3/air/AirInst.h:
2859         (JSC::B3::Air::Inst::operator bool):
2860         (JSC::B3::Air::Inst::append):
2861         * b3/air/AirLowerAfterRegAlloc.cpp: Added.
2862         (JSC::B3::Air::lowerAfterRegAlloc):
2863         * b3/air/AirLowerAfterRegAlloc.h: Added.
2864         * b3/air/AirLowerMacros.cpp: Added.
2865         (JSC::B3::Air::lowerMacros):
2866         * b3/air/AirLowerMacros.h: Added.
2867         * b3/air/AirOpcode.opcodes:
2868         * b3/air/AirRegisterPriority.h:
2869         (JSC::B3::Air::regsInPriorityOrder):
2870         * b3/air/testair.cpp: Added.
2871         (hiddenTruthBecauseNoReturnIsStupid):
2872         (usage):
2873         (JSC::B3::Air::compile):
2874         (JSC::B3::Air::invoke):
2875         (JSC::B3::Air::compileAndRun):
2876         (JSC::B3::Air::testSimple):
2877         (JSC::B3::Air::loadConstantImpl):
2878         (JSC::B3::Air::loadConstant):
2879         (JSC::B3::Air::loadDoubleConstant):
2880         (JSC::B3::Air::testShuffleSimpleSwap):
2881         (JSC::B3::Air::testShuffleSimpleShift):
2882         (JSC::B3::Air::testShuffleLongShift):
2883         (JSC::B3::Air::testShuffleLongShiftBackwards):
2884         (JSC::B3::Air::testShuffleSimpleRotate):
2885         (JSC::B3::Air::testShuffleSimpleBroadcast):
2886         (JSC::B3::Air::testShuffleBroadcastAllRegs):
2887         (JSC::B3::Air::testShuffleTreeShift):
2888         (JSC::B3::Air::testShuffleTreeShiftBackward):
2889         (JSC::B3::Air::testShuffleTreeShiftOtherBackward):
2890         (JSC::B3::Air::testShuffleMultipleShifts):
2891         (JSC::B3::Air::testShuffleRotateWithFringe):
2892         (JSC::B3::Air::testShuffleRotateWithLongFringe):
2893         (JSC::B3::Air::testShuffleMultipleRotates):
2894         (JSC::B3::Air::testShuffleShiftAndRotate):
2895         (JSC::B3::Air::testShuffleShiftAllRegs):
2896         (JSC::B3::Air::testShuffleRotateAllRegs):
2897         (JSC::B3::Air::testShuffleSimpleSwap64):
2898         (JSC::B3::Air::testShuffleSimpleShift64):
2899         (JSC::B3::Air::testShuffleSwapMixedWidth):
2900         (JSC::B3::Air::testShuffleShiftMixedWidth):
2901         (JSC::B3::Air::testShuffleShiftMemory):
2902         (JSC::B3::Air::testShuffleShiftMemoryLong):
2903         (JSC::B3::Air::testShuffleShiftMemoryAllRegs):
2904         (JSC::B3::Air::testShuffleShiftMemoryAllRegs64):
2905         (JSC::B3::Air::combineHiLo):
2906         (JSC::B3::Air::testShuffleShiftMemoryAllRegsMixedWidth):
2907         (JSC::B3::Air::testShuffleRotateMemory):
2908         (JSC::B3::Air::testShuffleRotateMemory64):
2909         (JSC::B3::Air::testShuffleRotateMemoryMixedWidth):
2910         (JSC::B3::Air::testShuffleRotateMemoryAllRegs64):
2911         (JSC::B3::Air::testShuffleRotateMemoryAllRegsMixedWidth):
2912         (JSC::B3::Air::testShuffleSwapDouble):
2913         (JSC::B3::Air::testShuffleShiftDouble):
2914         (JSC::B3::Air::run):
2915         (run):
2916         (main):
2917         * b3/testb3.cpp:
2918         (JSC::B3::testCallSimple):
2919         (JSC::B3::testCallRare):
2920         (JSC::B3::testCallRareLive):
2921         (JSC::B3::testCallSimplePure):
2922         (JSC::B3::run):
2923
2924 2016-01-14  Keith Miller  <keith_miller@apple.com>
2925
2926         Unreviewed mark passing es6 tests as no longer failing.
2927
2928         * tests/es6.yaml:
2929
2930 2016-01-14  Keith Miller  <keith_miller@apple.com>
2931
2932         [ES6] Support subclassing Function.
2933         https://bugs.webkit.org/show_bug.cgi?id=153081
2934
2935         Reviewed by Geoffrey Garen.
2936
2937         This patch enables subclassing the Function object. It also fixes an existing
2938         bug that prevented users from subclassing functions that have a function in
2939         the superclass's prototype property.
2940
2941         * bytecompiler/NodesCodegen.cpp:
2942         (JSC::ClassExprNode::emitBytecode):
2943         * runtime/FunctionConstructor.cpp:
2944         (JSC::constructWithFunctionConstructor):
2945         (JSC::constructFunction):
2946         (JSC::constructFunctionSkippingEvalEnabledCheck):
2947         * runtime/FunctionConstructor.h:
2948         * runtime/JSFunction.cpp:
2949         (JSC::JSFunction::create):
2950         * runtime/JSFunction.h:
2951         (JSC::JSFunction::createImpl):
2952         * runtime/JSFunctionInlines.h:
2953         (JSC::JSFunction::createWithInvalidatedReallocationWatchpoint):
2954         (JSC::JSFunction::JSFunction): Deleted.
2955         * tests/stress/class-subclassing-function.js: Added.
2956
2957 2016-01-13  Carlos Garcia Campos  <cgarcia@igalia.com>
2958
2959         [CMake] Do not use LLVM static libraries for FTL JIT
2960         https://bugs.webkit.org/show_bug.cgi?id=151559
2961
2962         Reviewed by Michael Catanzaro.
2963
2964         Allow ports decide whether to prefer linking to llvm static or
2965         dynamic libraries. This patch only changes the behavior of the GTK
2966         port, other ports can change the default behavior by setting
2967         llvmForJSC_LIBRARIES in their platform specific cmake files.
2968
2969         * CMakeLists.txt: Move llvmForJSC library definition after the
2970         WEBKIT_INCLUDE_CONFIG_FILES_IF_EXISTS, to allow platform specific
2971         files to set their own llvmForJSC_LIBRARIES. When not set, it
2972         defaults to LLVM_STATIC_LIBRARIES. The command to create
2973         WebKitLLVMLibraryToken.h no longer depends on the static
2974         libraries, since we are going to make the build fail anyway when
2975         not found in case of linking to the static libraries. If platform
2976         specific file defined llvmForJSC_INSTALL_DIR llvmForJSC is also
2977         installed to the given destination.
2978         * PlatformGTK.cmake: Set llvmForJSC_LIBRARIES and
2979         llvmForJSC_INSTALL_DIR.
2980
2981 2016-01-13  Saam barati  <sbarati@apple.com>
2982
2983         NativeExecutable should have a name field
2984         https://bugs.webkit.org/show_bug.cgi?id=153083
2985
2986         Reviewed by Geoffrey Garen.
2987
2988         This is going to help the SamplingProfiler come up
2989         with names for NativeExecutable objects it encounters.
2990
2991         * jit/JITThunks.cpp:
2992         (JSC::JITThunks::finalize):
2993         (JSC::JITThunks::hostFunctionStub):
2994         * jit/JITThunks.h:
2995         * runtime/Executable.h:
2996         * runtime/JSBoundFunction.cpp:
2997         (JSC::JSBoundFunction::create):
2998         * runtime/JSFunction.cpp:
2999         (JSC::JSFunction::create):
3000         (JSC::JSFunction::lookUpOrCreateNativeExecutable):
3001         * runtime/JSFunction.h:
3002         (JSC::JSFunction::createImpl):
3003         * runtime/JSNativeStdFunction.cpp:
3004         (JSC::JSNativeStdFunction::create):
3005         * runtime/VM.cpp:
3006         (JSC::thunkGeneratorForIntrinsic):
3007         (JSC::VM::getHostFunction):
3008         * runtime/VM.h:
3009         (JSC::VM::getCTIStub):
3010         (JSC::VM::exceptionOffset):
3011
3012 2016-01-13  Keith Miller  <keith_miller@apple.com>
3013
3014         [ES6] Support subclassing the String builtin object
3015         https://bugs.webkit.org/show_bug.cgi?id=153068
3016
3017         Reviewed by Michael Saboff.
3018
3019         This patch adds subclassing of strings. Also, this patch fixes a bug where we could have
3020         the wrong indexing type for builtins constructed without storage.
3021
3022         * runtime/PrototypeMap.cpp:
3023         (JSC::PrototypeMap::emptyStructureForPrototypeFromBaseStructure):
3024         * runtime/StringConstructor.cpp:
3025         (JSC::constructWithStringConstructor):
3026         * tests/stress/class-subclassing-string.js: Added.
3027         (test):
3028
3029 2016-01-13  Mark Lam  <mark.lam@apple.com>
3030
3031         The StringFromCharCode DFG intrinsic should support untyped operands.
3032         https://bugs.webkit.org/show_bug.cgi?id=153046
3033
3034         Reviewed by Geoffrey Garen.
3035
3036         The current StringFromCharCode DFG intrinsic assumes that its operand charCode
3037         must be an Int32.  This results in 26000+ BadType OSR exits in the LongSpider
3038         crypto-aes benchmark.  With support for Untyped operands, the number of OSR
3039         exits drops to 202.
3040
3041         * dfg/DFGClobberize.h:
3042         (JSC::DFG::clobberize):
3043         * dfg/DFGFixupPhase.cpp:
3044         (JSC::DFG::FixupPhase::fixupNode):
3045         * dfg/DFGOperations.cpp:
3046         * dfg/DFGOperations.h:
3047         * dfg/DFGSpeculativeJIT.cpp:
3048         (JSC::DFG::SpeculativeJIT::compileFromCharCode):
3049         * dfg/DFGSpeculativeJIT.h:
3050         (JSC::DFG::SpeculativeJIT::callOperation):
3051         * dfg/DFGValidate.cpp:
3052         (JSC::DFG::Validate::validate):
3053         * runtime/JSCJSValueInlines.h:
3054         (JSC::JSValue::toUInt32):
3055
3056 2016-01-13  Mark Lam  <mark.lam@apple.com>
3057
3058         Use DFG Graph::binary/unaryArithShouldSpeculateInt32/MachineInt() functions consistently.
3059         https://bugs.webkit.org/show_bug.cgi?id=153080
3060
3061         Reviewed by Geoffrey Garen.
3062
3063         We currently have Graph::mulShouldSpeculateInt32/machineInt() and
3064         Graph::negateShouldSpeculateInt32/MachineInt() functions which are only used by
3065         the ArithMul and ArithNegate nodes.  However, the same tests need to be done for
3066         many other arith nodes in the DFG.  This patch renames these functions as
3067         Graph::binaryArithShouldSpeculateInt32/machineInt() and
3068         Graph::unaryArithShouldSpeculateInt32/MachineInt(), and uses them consistently
3069         in the DFG.
3070
3071         * dfg/DFGFixupPhase.cpp:
3072         (JSC::DFG::FixupPhase::fixupNode):
3073         * dfg/DFGGraph.h:
3074         (JSC::DFG::Graph::addShouldSpeculateMachineInt):
3075         (JSC::DFG::Graph::binaryArithShouldSpeculateInt32):
3076         (JSC::DFG::Graph::binaryArithShouldSpeculateMachineInt):
3077         (JSC::DFG::Graph::unaryArithShouldSpeculateInt32):
3078         (JSC::DFG::Graph::unaryArithShouldSpeculateMachineInt):
3079         (JSC::DFG::Graph::mulShouldSpeculateInt32): Deleted.
3080         (JSC::DFG::Graph::mulShouldSpeculateMachineInt): Deleted.
3081         (JSC::DFG::Graph::negateShouldSpeculateInt32): Deleted.
3082         (JSC::DFG::Graph::negateShouldSpeculateMachineInt): Deleted.
3083         * dfg/DFGPredictionPropagationPhase.cpp:
3084         (JSC::DFG::PredictionPropagationPhase::propagate):
3085         (JSC::DFG::PredictionPropagationPhase::doDoubleVoting):
3086
3087 2016-01-13  Joseph Pecoraro  <pecoraro@apple.com>
3088
3089         Web Inspector: Inspector should use the last sourceURL / sourceMappingURL directive
3090         https://bugs.webkit.org/show_bug.cgi?id=153072
3091         <rdar://problem/24168312>
3092
3093         Reviewed by Timothy Hatcher.
3094
3095         * parser/Lexer.cpp:
3096         (JSC::Lexer<T>::parseCommentDirective):
3097         Just keep overwriting the member variable so we end up with
3098         the last directive value.
3099
3100 2016-01-13  Commit Queue  <commit-queue@webkit.org>
3101
3102         Unreviewed, rolling out r194969.
3103         https://bugs.webkit.org/show_bug.cgi?id=153075
3104
3105         This change broke the iOS build (Requested by ryanhaddad on
3106         #webkit).
3107
3108         Reverted changeset:
3109
3110         "[JSC] Legalize Memory Offsets for ARM64 before lowering to
3111         Air"
3112         https://bugs.webkit.org/show_bug.cgi?id=153065
3113         http://trac.webkit.org/changeset/194969
3114
3115 2016-01-13  Benjamin Poulain  <bpoulain@apple.com>
3116
3117         [JSC] Legalize Memory Offsets for ARM64 before lowering to Air
3118         https://bugs.webkit.org/show_bug.cgi?id=153065
3119
3120         Reviewed by Mark Lam.
3121         Reviewed by Filip Pizlo.
3122
3123         On ARM64, we cannot use signed 32bits offset for memory addressing.
3124         There are two available addressing: signed 9bits and unsigned scaled 12bits.
3125         Air already knows about it.
3126
3127         In this patch, the offsets are changed to something valid for ARM64
3128         prior to lowering. When an offset is invalid, it is just computed
3129         before the instruction and used as the base for addressing.
3130
3131         * JavaScriptCore.xcodeproj/project.pbxproj:
3132         * b3/B3Generate.cpp:
3133         (JSC::B3::generateToAir):
3134         * b3/B3LegalizeMemoryOffsets.cpp: Added.
3135         (JSC::B3::legalizeMemoryOffsets):
3136         * b3/B3LegalizeMemoryOffsets.h: Added.
3137         * b3/B3LowerToAir.cpp:
3138         (JSC::B3::Air::LowerToAir::effectiveAddr): Deleted.
3139         * b3/testb3.cpp:
3140         (JSC::B3::testLoadWithOffsetImpl):
3141         (JSC::B3::testLoadOffsetImm9Max):
3142         (JSC::B3::testLoadOffsetImm9MaxPlusOne):
3143         (JSC::B3::testLoadOffsetImm9MaxPlusTwo):
3144         (JSC::B3::testLoadOffsetImm9Min):
3145         (JSC::B3::testLoadOffsetImm9MinMinusOne):
3146         (JSC::B3::testLoadOffsetScaledUnsignedImm12Max):
3147         (JSC::B3::testLoadOffsetScaledUnsignedOverImm12Max):
3148         (JSC::B3::run):
3149
3150 2016-01-12  Per Arne Vollan  <peavo@outlook.com>
3151
3152         [FTL][Win64] Compile error.
3153         https://bugs.webkit.org/show_bug.cgi?id=153031
3154
3155         Reviewed by Brent Fulgham.
3156
3157         The header file dlfcn.h does not exist on Windows.
3158
3159         * ftl/FTLLowerDFGToLLVM.cpp:
3160
3161 2016-01-12  Ryosuke Niwa  <rniwa@webkit.org>
3162
3163         Add a build flag for custom element
3164         https://bugs.webkit.org/show_bug.cgi?id=153005
3165
3166         Reviewed by Alex Christensen.
3167
3168         * Configurations/FeatureDefines.xcconfig:
3169
3170 2016-01-12  Benjamin Poulain  <bpoulain@apple.com>
3171
3172         [JSC] Remove some invalid immediate instruction forms from ARM64 Air
3173         https://bugs.webkit.org/show_bug.cgi?id=153024
3174
3175         Reviewed by Michael Saboff.
3176
3177         * b3/B3BasicBlock.h:
3178         Export the symbols for testb3.
3179
3180         * b3/air/AirOpcode.opcodes:
3181         We had 2 invalid opcodes:
3182         -Compare with immediate just does not exist.
3183         -Test64 with immediate exists but Air does not recognize
3184          the valid form of bit-immediates.
3185
3186         * b3/testb3.cpp:
3187         (JSC::B3::genericTestCompare):
3188         (JSC::B3::testCompareImpl):
3189         Extend the tests to cover what was invalid.
3190
3191 2016-01-12  Benjamin Poulain  <bpoulain@apple.com>
3192
3193         [JSC] JSC does not build with FTL_USES_B3 on ARM64
3194         https://bugs.webkit.org/show_bug.cgi?id=153011
3195
3196         Reviewed by Saam Barati.
3197
3198         Apparently the static const member can only be used for constexpr.
3199         C++ is weird.
3200
3201         * jit/GPRInfo.cpp:
3202         * jit/GPRInfo.h:
3203
3204 2016-01-11  Johan K. Jensen  <jj@johanjensen.dk>
3205
3206         Web Inspector: console.count() shouldn't show a colon in front of a number
3207         https://bugs.webkit.org/show_bug.cgi?id=152038
3208
3209         Reviewed by Brian Burg.
3210
3211         * inspector/agents/InspectorConsoleAgent.cpp:
3212         (Inspector::InspectorConsoleAgent::count):
3213         Do not include title and colon if the title is empty.
3214
3215 2016-01-11  Dan Bernstein  <mitz@apple.com>
3216
3217         Reverted r194317.
3218
3219         Reviewed by Joseph Pecoraro.
3220
3221         r194317 did not contain a change log entry, did not explain the motivation, did not name a
3222         reviewer, and does not seem necessary.
3223
3224         * JavaScriptCore.xcodeproj/project.pbxproj:
3225
3226 2016-01-11  Joseph Pecoraro  <pecoraro@apple.com>
3227
3228         keywords ("super", "delete", etc) should be valid method names
3229         https://bugs.webkit.org/show_bug.cgi?id=144281
3230
3231         Reviewed by Ryosuke Niwa.
3232
3233         * parser/Parser.cpp:
3234         (JSC::Parser<LexerType>::parseClass):
3235         - When parsing "static(" treat it as a method named "static" and not a static method.
3236         - When parsing a keyword treat it like a string method name (get and set are not keywords)
3237         - When parsing a getter / setter method name identifier, allow lookahead to be a keyword
3238
3239         (JSC::Parser<LexerType>::parseGetterSetter):
3240         - When parsing the getter / setter's name, allow it to be a keyword.
3241
3242 2016-01-11  Benjamin Poulain  <bpoulain@apple.com>
3243
3244         [JSC] Add Div/Mod and fix Mul for B3 ARM64
3245         https://bugs.webkit.org/show_bug.cgi?id=152978
3246
3247         Reviewed by Filip Pizlo.
3248
3249         Add the 3 operands forms of Mul.
3250         Remove the form taking immediate on ARM64, there are no such instruction.
3251
3252         Add Div with sdiv.
3253
3254         Unfortunately, I discovered ChillMod's division by zero
3255         makes it non-trivial on ARM64. I just made it into a macro like on x86.
3256
3257         * assembler/MacroAssemblerARM64.h:
3258         (JSC::MacroAssemblerARM64::mul32):
3259         (JSC::MacroAssemblerARM64::mul64):
3260         (JSC::MacroAssemblerARM64::div32):
3261         (JSC::MacroAssemblerARM64::div64):
3262         * b3/B3LowerMacros.cpp:
3263         * b3/B3LowerToAir.cpp:
3264         (JSC::B3::Air::LowerToAir::lower):
3265         * b3/air/AirOpcode.opcodes:
3266
3267 2016-01-11  Keith Miller  <keith_miller@apple.com>
3268
3269         Arrays should use the InternalFunctionAllocationProfile when constructing new Arrays
3270         https://bugs.webkit.org/show_bug.cgi?id=152949
3271
3272         Reviewed by Michael Saboff.
3273
3274         This patch updates Array constructors to use the new InternalFunctionAllocationProfile.
3275
3276         * runtime/ArrayConstructor.cpp:
3277         (JSC::constructArrayWithSizeQuirk):
3278         (JSC::constructWithArrayConstructor):
3279         * runtime/InternalFunction.h:
3280         (JSC::InternalFunction::createStructure):
3281         * runtime/JSGlobalObject.h:
3282         (JSC::JSGlobalObject::arrayStructureForIndexingTypeDuringAllocation):
3283         (JSC::JSGlobalObject::arrayStructureForProfileDuringAllocation):
3284         (JSC::constructEmptyArray):
3285         (JSC::constructArray):
3286         (JSC::constructArrayNegativeIndexed):
3287         * runtime/PrototypeMap.cpp:
3288         (JSC::PrototypeMap::emptyStructureForPrototypeFromBaseStructure):
3289         * runtime/Structure.h:
3290         * runtime/StructureInlines.h:
3291
3292 2016-01-08  Keith Miller  <keith_miller@apple.com>
3293
3294         Use a profile to store allocation structures for subclasses of InternalFunctions
3295         https://bugs.webkit.org/show_bug.cgi?id=152942
3296
3297         Reviewed by Michael Saboff.
3298
3299         This patch adds InternalFunctionAllocationProfile to FunctionRareData, which holds
3300         a cached structure that can be used to quickly allocate any derived class of an InternalFunction.
3301         InternalFunctionAllocationProfile ended up being distinct from ObjectAllocationProfile, due to
3302         constraints imposed by Reflect.construct. Reflect.construct allows the user to pass an arbitrary
3303         constructor as a new.target to any other constructor. This means that a user can pass some
3304         non-derived constructor to an InternalFunction (they can even pass another InternalFunction as the
3305         new.target). If we use the same profile for both InternalFunctions and JS allocations then we always
3306         need to check in both JS code and C++ code that the profiled structure has the same ClassInfo as the
3307         current constructor. By using different profiles, we only need to check the profile in InternalFunctions
3308         as all JS constructed objects share the same ClassInfo (JSFinalObject). This comes at the relatively
3309         low cost of using slightly more memory on FunctionRareData and being slightly more conceptually complex.
3310
3311         Additionally, this patch adds subclassing to some omitted classes.
3312
3313         * API/JSObjectRef.cpp:
3314         (JSObjectMakeDate):
3315         (JSObjectMakeRegExp):
3316         * JavaScriptCore.xcodeproj/project.pbxproj:
3317         * bytecode/InternalFunctionAllocationProfile.h: Added.
3318         (JSC::InternalFunctionAllocationProfile::structure):
3319         (JSC::InternalFunctionAllocationProfile::clear):
3320         (JSC::InternalFunctionAllocationProfile::visitAggregate):
3321         (JSC::InternalFunctionAllocationProfile::createAllocationStructureFromBase):
3322         * dfg/DFGByteCodeParser.cpp:
3323         (JSC::DFG::ByteCodeParser::parseBlock):
3324         * dfg/DFGOperations.cpp:
3325         * dfg/DFGSpeculativeJIT32_64.cpp:
3326         (JSC::DFG::SpeculativeJIT::compile):
3327         * dfg/DFGSpeculativeJIT64.cpp:
3328         (JSC::DFG::SpeculativeJIT::compile):
3329         * jit/JITOpcodes.cpp:
3330         (JSC::JIT::emit_op_create_this):
3331         * jit/JITOpcodes32_64.cpp:
3332         (JSC::JIT::emit_op_create_this):
3333         * llint/LowLevelInterpreter32_64.asm:
3334         * llint/LowLevelInterpreter64.asm:
3335         * runtime/BooleanConstructor.cpp:
3336         (JSC::constructWithBooleanConstructor):
3337         * runtime/CommonSlowPaths.cpp:
3338         (JSC::SLOW_PATH_DECL):
3339         * runtime/DateConstructor.cpp:
3340         (JSC::constructDate):
3341         (JSC::constructWithDateConstructor):
3342         * runtime/DateConstructor.h:
3343         * runtime/ErrorConstructor.cpp:
3344         (JSC::Interpreter::constructWithErrorConstructor):
3345         * runtime/FunctionRareData.cpp:
3346         (JSC::FunctionRareData::create):
3347         (JSC::FunctionRareData::visitChildren):
3348         (JSC::FunctionRareData::FunctionRareData):
3349         (JSC::FunctionRareData::initializeObjectAllocationProfile):
3350         (JSC::FunctionRareData::clear):
3351         (JSC::FunctionRareData::finishCreation): Deleted.
3352         (JSC::FunctionRareData::initialize): Deleted.
3353         * runtime/FunctionRareData.h:
3354         (JSC::FunctionRareData::offsetOfObjectAllocationProfile):
3355         (JSC::FunctionRareData::objectAllocationProfile):
3356         (JSC::FunctionRareData::objectAllocationStructure):
3357         (JSC::FunctionRareData::allocationProfileWatchpointSet):
3358         (JSC::FunctionRareData::isObjectAllocationProfileInitialized):
3359         (JSC::FunctionRareData::internalFunctionAllocationStructure):
3360         (JSC::FunctionRareData::createInternalFunctionAllocationStructureFromBase):
3361         (JSC::FunctionRareData::offsetOfAllocationProfile): Deleted.
3362         (JSC::FunctionRareData::allocationProfile): Deleted.
3363         (JSC::FunctionRareData::allocationStructure): Deleted.
3364         (JSC::FunctionRareData::isInitialized): Deleted.
3365         * runtime/InternalFunction.cpp:
3366         (JSC::InternalFunction::createSubclassStructure):
3367         * runtime/InternalFunction.h:
3368         * runtime/JSArrayBufferConstructor.cpp:
3369         (JSC::constructArrayBuffer):
3370         * runtime/JSFunction.cpp:
3371         (JSC::JSFunction::allocateRareData):
3372         (JSC::JSFunction::allocateAndInitializeRareData):
3373         (JSC::JSFunction::initializeRareData):
3374         * runtime/JSFunction.h:
3375         (JSC::JSFunction::rareData):
3376         * runtime/JSGenericTypedArrayViewConstructorInlines.h:
3377         (JSC::constructGenericTypedArrayView):
3378         * runtime/JSObject.h: