Commit aafa46d1 authored by oliver@apple.com's avatar oliver@apple.com

fourthTier: FTL should support CompareEqConstant

https://bugs.webkit.org/show_bug.cgi?id=115939

Reviewed by Oliver Hunt and Mark Hahnenberg.

The most interesting part of this patch is the way I make it easier to deal with
the inputs to Phi functions. This adds the notion of ValueFromBlock, which you
can get by doing m_out.anchor(value). You can build up a vector of these, and then
pass them to m_out.phi(type, vector) in one go.

* JavaScriptCore.xcodeproj/project.pbxproj:
* ftl/FTLAbbreviatedTypes.h: Added.
(FTL):
* ftl/FTLAbbreviations.h:
(FTL):
(JSC::FTL::addIncoming):
(JSC::FTL::buildPhi):
* ftl/FTLAbstractHeapRepository.h:
(FTL):
* ftl/FTLCapabilities.cpp:
(JSC::FTL::canCompile):
* ftl/FTLLowerDFGToLLVM.cpp:
(JSC::FTL::LowerDFGToLLVM::compileNode):
(JSC::FTL::LowerDFGToLLVM::compileCompareEqConstant):
(LowerDFGToLLVM):
(JSC::FTL::LowerDFGToLLVM::lowDouble):
(JSC::FTL::LowerDFGToLLVM::masqueradesAsUndefinedWatchpointIfIsStillValid):
* ftl/FTLOutput.h:
(JSC::FTL::Output::phi):
(Output):
(JSC::FTL::Output::anchor):
* ftl/FTLValueFromBlock.h: Added.
(FTL):
(ValueFromBlock):
(JSC::FTL::ValueFromBlock::ValueFromBlock):
(JSC::FTL::ValueFromBlock::value):
(JSC::FTL::ValueFromBlock::block):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@153154 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent 023d1c71
2013-05-10 Filip Pizlo <fpizlo@apple.com>
fourthTier: FTL should support CompareEqConstant
https://bugs.webkit.org/show_bug.cgi?id=115939
Reviewed by Oliver Hunt and Mark Hahnenberg.
The most interesting part of this patch is the way I make it easier to deal with
the inputs to Phi functions. This adds the notion of ValueFromBlock, which you
can get by doing m_out.anchor(value). You can build up a vector of these, and then
pass them to m_out.phi(type, vector) in one go.
* JavaScriptCore.xcodeproj/project.pbxproj:
* ftl/FTLAbbreviatedTypes.h: Added.
(FTL):
* ftl/FTLAbbreviations.h:
(FTL):
(JSC::FTL::addIncoming):
(JSC::FTL::buildPhi):
* ftl/FTLAbstractHeapRepository.h:
(FTL):
* ftl/FTLCapabilities.cpp:
(JSC::FTL::canCompile):
* ftl/FTLLowerDFGToLLVM.cpp:
(JSC::FTL::LowerDFGToLLVM::compileNode):
(JSC::FTL::LowerDFGToLLVM::compileCompareEqConstant):
(LowerDFGToLLVM):
(JSC::FTL::LowerDFGToLLVM::lowDouble):
(JSC::FTL::LowerDFGToLLVM::masqueradesAsUndefinedWatchpointIfIsStillValid):
* ftl/FTLOutput.h:
(JSC::FTL::Output::phi):
(Output):
(JSC::FTL::Output::anchor):
* ftl/FTLValueFromBlock.h: Added.
(FTL):
(ValueFromBlock):
(JSC::FTL::ValueFromBlock::ValueFromBlock):
(JSC::FTL::ValueFromBlock::value):
(JSC::FTL::ValueFromBlock::block):
2013-05-10 Filip Pizlo <fpizlo@apple.com>
fourthTier: FTL should support CompareStrictEq
......
......@@ -312,6 +312,8 @@
0FD82E56141DAF0800179C94 /* DFGOSREntry.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FD82E52141DAEDE00179C94 /* DFGOSREntry.cpp */; };
0FD82E57141DAF1000179C94 /* DFGOSREntry.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FD82E53141DAEDE00179C94 /* DFGOSREntry.h */; settings = {ATTRIBUTES = (Private, ); }; };
0FD82E86141F3FF100179C94 /* SpeculatedType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FD82E84141F3FDA00179C94 /* SpeculatedType.cpp */; };
0FDB2CC9173DA520007B3C1B /* FTLAbbreviatedTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FDB2CC7173DA51E007B3C1B /* FTLAbbreviatedTypes.h */; settings = {ATTRIBUTES = (Private, ); }; };
0FDB2CCA173DA523007B3C1B /* FTLValueFromBlock.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FDB2CC8173DA51E007B3C1B /* FTLValueFromBlock.h */; settings = {ATTRIBUTES = (Private, ); }; };
0FDDBFB51666EED800C55FEF /* DFGVariableAccessDataDump.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FDDBFB21666EED500C55FEF /* DFGVariableAccessDataDump.cpp */; };
0FDDBFB61666EEDA00C55FEF /* DFGVariableAccessDataDump.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FDDBFB31666EED500C55FEF /* DFGVariableAccessDataDump.h */; settings = {ATTRIBUTES = (Private, ); }; };
0FE228ED1436AB2700196C48 /* Options.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FE228EB1436AB2300196C48 /* Options.h */; settings = {ATTRIBUTES = (Private, ); }; };
......@@ -1309,6 +1311,8 @@
0FD82E52141DAEDE00179C94 /* DFGOSREntry.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGOSREntry.cpp; path = dfg/DFGOSREntry.cpp; sourceTree = "<group>"; };
0FD82E53141DAEDE00179C94 /* DFGOSREntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGOSREntry.h; path = dfg/DFGOSREntry.h; sourceTree = "<group>"; };
0FD82E84141F3FDA00179C94 /* SpeculatedType.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SpeculatedType.cpp; sourceTree = "<group>"; };
0FDB2CC7173DA51E007B3C1B /* FTLAbbreviatedTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FTLAbbreviatedTypes.h; path = ftl/FTLAbbreviatedTypes.h; sourceTree = "<group>"; };
0FDB2CC8173DA51E007B3C1B /* FTLValueFromBlock.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FTLValueFromBlock.h; path = ftl/FTLValueFromBlock.h; sourceTree = "<group>"; };
0FDDBFB21666EED500C55FEF /* DFGVariableAccessDataDump.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGVariableAccessDataDump.cpp; path = dfg/DFGVariableAccessDataDump.cpp; sourceTree = "<group>"; };
0FDDBFB31666EED500C55FEF /* DFGVariableAccessDataDump.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGVariableAccessDataDump.h; path = dfg/DFGVariableAccessDataDump.h; sourceTree = "<group>"; };
0FE228EA1436AB2300196C48 /* Options.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Options.cpp; sourceTree = "<group>"; };
......@@ -2127,6 +2131,7 @@
0FEA09FC1705137F00BB722C /* ftl */ = {
isa = PBXGroup;
children = (
0FDB2CC7173DA51E007B3C1B /* FTLAbbreviatedTypes.h */,
0FEA09FD170513DB00BB722C /* FTLAbbreviations.h */,
0FEA0A171708B00700BB722C /* FTLAbstractHeap.cpp */,
0FEA0A181708B00700BB722C /* FTLAbstractHeap.h */,
......@@ -2173,6 +2178,7 @@
0FEA0A1B1708B00700BB722C /* FTLTypedPointer.h */,
0F235BCD17178E1C00690C7F /* FTLValueFormat.cpp */,
0F235BCE17178E1C00690C7F /* FTLValueFormat.h */,
0FDB2CC8173DA51E007B3C1B /* FTLValueFromBlock.h */,
0F235BCF17178E1C00690C7F /* FTLValueSource.cpp */,
0F235BD017178E1C00690C7F /* FTLValueSource.h */,
0F6E5C181724AF3D005C574F /* WebKitLLVMLibraryAnchor.cpp */,
......@@ -3501,6 +3507,7 @@
0F919D0D157EE0A2004A4E7D /* JSSymbolTableObject.h in Headers */,
BC18C42A0E16F5CD00B34460 /* JSType.h in Headers */,
6507D29E0E871E5E00D7D896 /* JSTypeInfo.h in Headers */,
0FDB2CCA173DA523007B3C1B /* FTLValueFromBlock.h in Headers */,
86E3C612167BABD7006D760A /* JSValue.h in Headers */,
86E3C61B167BABEE006D760A /* JSValueInternal.h in Headers */,
BC18C42C0E16F5CD00B34460 /* JSValueRef.h in Headers */,
......@@ -3607,6 +3614,7 @@
0FF729BE166AD360000F5BA3 /* ProfilerExecutionCounter.h in Headers */,
0FF729BF166AD360000F5BA3 /* ProfilerOrigin.h in Headers */,
0FF729C0166AD360000F5BA3 /* ProfilerOriginStack.h in Headers */,
0FDB2CC9173DA520007B3C1B /* FTLAbbreviatedTypes.h in Headers */,
0FB1058C1675483300F8AB6E /* ProfilerOSRExit.h in Headers */,
0FB1058E1675483A00F8AB6E /* ProfilerOSRExitSite.h in Headers */,
0F13912C16771C3D009CCB07 /* ProfilerProfiledBytecodes.h in Headers */,
......
/*
* Copyright (C) 2013 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef FTLAbbreviatedTypes_h
#define FTLAbbreviatedTypes_h
#include <wtf/Platform.h>
#if ENABLE(FTL_JIT)
#include "FTLLLVMHeaders.h"
namespace JSC { namespace FTL {
typedef LLVMBasicBlockRef LBasicBlock;
typedef LLVMBuilderRef LBuilder;
typedef LLVMCallConv LCallConv;
typedef LLVMIntPredicate LIntPredicate;
typedef LLVMRealPredicate LRealPredicate;
typedef LLVMLinkage LLinkage;
typedef LLVMModuleRef LModule;
typedef LLVMTypeRef LType;
typedef LLVMValueRef LValue;
} } // namespace JSC::FTL
#endif // ENABLE(FTL_JIT)
#endif // FTLAbbreviatedTypes_h
......@@ -30,7 +30,8 @@
#if ENABLE(FTL_JIT)
#include "FTLLLVMHeaders.h"
#include "FTLAbbreviatedTypes.h"
#include "FTLValueFromBlock.h"
namespace JSC { namespace FTL {
......@@ -43,16 +44,6 @@ namespace JSC { namespace FTL {
#error "The FTL backend assumes that pointers are 64-bit."
#endif
typedef LLVMBasicBlockRef LBasicBlock;
typedef LLVMBuilderRef LBuilder;
typedef LLVMCallConv LCallConv;
typedef LLVMIntPredicate LIntPredicate;
typedef LLVMRealPredicate LRealPredicate;
typedef LLVMLinkage LLinkage;
typedef LLVMModuleRef LModule;
typedef LLVMTypeRef LType;
typedef LLVMValueRef LValue;
static inline LType voidType() { return LLVMVoidType(); }
static inline LType int1Type() { return LLVMInt1Type(); }
static inline LType int8Type() { return LLVMInt8Type(); }
......@@ -149,34 +140,29 @@ static inline void addIncoming(LValue phi, const LValue* values, const LBasicBlo
{
LLVMAddIncoming(phi, const_cast<LValue*>(values), const_cast<LBasicBlock*>(blocks), numPredecessors);
}
template<typename ValueVectorType, typename BlockVectorType>
static inline void addIncoming(LValue phi, const ValueVectorType& values, const BlockVectorType& blocks)
{
ASSERT(values.size() == blocks.size());
addIncoming(phi, values.begin(), blocks.begin(), values.size());
}
static inline void addIncoming(LValue phi, LValue value1, LBasicBlock block1)
static inline void addIncoming(LValue phi, ValueFromBlock value1)
{
addIncoming(phi, &value1, &block1, 1);
LValue value = value1.value();
LBasicBlock block = value1.block();
addIncoming(phi, &value, &block, 1);
}
static inline void addIncoming(LValue phi, LValue value1, LBasicBlock block1, LValue value2, LBasicBlock block2)
static inline void addIncoming(LValue phi, ValueFromBlock value1, ValueFromBlock value2)
{
LValue values[] = { value1, value2 };
LBasicBlock blocks[] = { block1, block2 };
LValue values[] = { value1.value(), value2.value() };
LBasicBlock blocks[] = { value1.block(), value2.block() };
addIncoming(phi, values, blocks, 2);
}
static inline LValue buildPhi(LBuilder builder, LType type, LValue value1, LBasicBlock block1)
static inline LValue buildPhi(LBuilder builder, LType type, ValueFromBlock value1)
{
LValue result = buildPhi(builder, type);
addIncoming(result, value1, block1);
addIncoming(result, value1);
return result;
}
static inline LValue buildPhi(
LBuilder builder, LType type, LValue value1, LBasicBlock block1, LValue value2,
LBasicBlock block2)
LBuilder builder, LType type, ValueFromBlock value1, ValueFromBlock value2)
{
LValue result = buildPhi(builder, type);
addIncoming(result, value1, block1, value2, block2);
addIncoming(result, value1, value2);
return result;
}
......
......@@ -42,6 +42,7 @@ namespace JSC { namespace FTL {
macro(JSCell_structure, JSCell::structureOffset()) \
macro(JSObject_butterfly, JSObject::butterflyOffset()) \
macro(Butterfly_publicLength, Butterfly::offsetOfPublicLength()) \
macro(Structure_globalObject, Structure::globalObjectOffset()) \
macro(Structure_typeInfoFlags, Structure::typeInfoFlagsOffset())
#define FOR_EACH_INDEXED_ABSTRACT_HEAP(macro) \
......
......@@ -100,6 +100,7 @@ bool canCompile(Graph& graph)
case ArithNegate:
case UInt32ToNumber:
case Int32ToDouble:
case CompareEqConstant:
// These are OK.
break;
case GetArrayLength:
......
......@@ -364,6 +364,9 @@ private:
case CompareEq:
compileCompareEq();
break;
case CompareEqConstant:
compileCompareEqConstant();
break;
case CompareStrictEq:
compileCompareStrictEq();
break;
......@@ -965,6 +968,62 @@ private:
RELEASE_ASSERT_NOT_REACHED();
}
void compileCompareEqConstant()
{
ASSERT(m_graph.valueOfJSConstant(m_node->child2().node()).isNull());
bool validWatchpoint = masqueradesAsUndefinedWatchpointIfIsStillValid();
LValue value = lowJSValue(m_node->child1());
LBasicBlock cellCase = FTL_NEW_BLOCK(m_out, ("CompareEqConstant cell case"));
LBasicBlock primitiveCase = FTL_NEW_BLOCK(m_out, ("CompareEqConstant primitive case"));
LBasicBlock continuation = FTL_NEW_BLOCK(m_out, ("CompareEqConstant continuation"));
m_out.branch(isNotCell(value), primitiveCase, cellCase);
LBasicBlock lastNext = m_out.appendTo(cellCase, primitiveCase);
Vector<ValueFromBlock, 3> results;
if (validWatchpoint) {
results.append(m_out.anchor(m_out.booleanFalse));
m_out.jump(continuation);
} else {
LBasicBlock masqueradesCase =
FTL_NEW_BLOCK(m_out, ("CompareEqConstant masquerades case"));
LValue structure = m_out.loadPtr(value, m_heaps.JSCell_structure);
results.append(m_out.anchor(m_out.booleanFalse));
m_out.branch(
m_out.testNonZero8(
m_out.load8(structure, m_heaps.Structure_typeInfoFlags),
m_out.constInt8(MasqueradesAsUndefined)),
masqueradesCase, continuation);
m_out.appendTo(masqueradesCase, primitiveCase);
results.append(m_out.anchor(
m_out.equal(
m_out.constIntPtr(m_graph.globalObjectFor(m_node->codeOrigin)),
m_out.loadPtr(structure, m_heaps.Structure_globalObject))));
m_out.jump(continuation);
}
m_out.appendTo(primitiveCase, continuation);
results.append(m_out.anchor(m_out.equal(
m_out.bitAnd(value, m_out.constInt64(~TagBitUndefined)),
m_out.constInt64(ValueNull))));
m_out.jump(continuation);
m_out.appendTo(continuation, lastNext);
m_booleanValues.add(m_node, m_out.phi(m_out.boolean, results));
}
void compileCompareStrictEq()
{
if (m_node->isBinaryUseKind(Int32Use)) {
......@@ -1264,8 +1323,8 @@ private:
LBasicBlock lastNext = m_out.appendTo(intCase, doubleCase);
LValue intToDouble = m_out.intToDouble(unboxInt32(boxedResult));
LBasicBlock intToDoubleBlock = m_out.m_block;
ValueFromBlock intToDouble = m_out.anchor(
m_out.intToDouble(unboxInt32(boxedResult)));
m_out.jump(continuation);
m_out.appendTo(doubleCase, continuation);
......@@ -1273,16 +1332,12 @@ private:
FTL_TYPE_CHECK(
jsValueValue(boxedResult), edge, SpecNumber, isCellOrMisc(boxedResult));
LValue unboxedDouble = unboxDouble(boxedResult);
LBasicBlock unboxedDoubleBlock = m_out.m_block;
ValueFromBlock unboxedDouble = m_out.anchor(unboxDouble(boxedResult));
m_out.jump(continuation);
m_out.appendTo(continuation, lastNext);
LValue result = m_out.phi(
m_out.doubleType,
intToDouble, intToDoubleBlock,
unboxedDouble, unboxedDoubleBlock);
LValue result = m_out.phi(m_out.doubleType, intToDouble, unboxedDouble);
m_doubleValues.add(edge.node(), result);
return result;
......@@ -1484,13 +1539,14 @@ private:
return m_graph.masqueradesAsUndefinedWatchpointIsStillValid(m_node->codeOrigin);
}
void masqueradesAsUndefinedWatchpointIfIsStillValid()
bool masqueradesAsUndefinedWatchpointIfIsStillValid()
{
if (!masqueradesAsUndefinedWatchpointIsStillValid())
return;
return false;
// FIXME: Implement masquerades-as-undefined watchpoints.
// https://bugs.webkit.org/show_bug.cgi?id=113647
return true;
}
bool isLive(Node* node)
......
......@@ -113,13 +113,21 @@ public:
LValue constDouble(double value) { return constReal(doubleType, value); }
LValue phi(LType type) { return buildPhi(m_builder, type); }
LValue phi(LType type, LValue value1, LBasicBlock block1)
LValue phi(LType type, ValueFromBlock value1)
{
return buildPhi(m_builder, type, value1, block1);
return buildPhi(m_builder, type, value1);
}
LValue phi(LType type, LValue value1, LBasicBlock block1, LValue value2, LBasicBlock block2)
LValue phi(LType type, ValueFromBlock value1, ValueFromBlock value2)
{
return buildPhi(m_builder, type, value1, block1, value2, block2);
return buildPhi(m_builder, type, value1, value2);
}
template<typename VectorType>
LValue phi(LType type, const VectorType& vector)
{
LValue result = phi(type);
for (unsigned i = 0; i < vector.size(); ++i)
addIncoming(result, vector[i]);
return result;
}
LValue add(LValue left, LValue right) { return buildAdd(m_builder, left, right); }
......@@ -311,6 +319,11 @@ public:
void unreachable() { buildUnreachable(m_builder); }
ValueFromBlock anchor(LValue value)
{
return ValueFromBlock(value, m_block);
}
LValue m_function;
AbstractHeapRepository* m_heaps;
LBuilder m_builder;
......
/*
* Copyright (C) 2013 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef FTLValueFromBlock_h
#define FTLValueFromBlock_h
#include <wtf/Platform.h>
#if ENABLE(FTL_JIT)
#include "FTLAbbreviatedTypes.h"
namespace JSC { namespace FTL {
class ValueFromBlock {
public:
ValueFromBlock(LValue value, LBasicBlock block)
: m_value(value)
, m_block(block)
{
}
LValue value() const { return m_value; }
LBasicBlock block() const { return m_block; }
private:
LValue m_value;
LBasicBlock m_block;
};
} } // namespace JSC::FTL
#endif // ENABLE(FTL_JIT)
#endif // FTLValueFromBlock_h
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment