Title: [149908] branches/dfgFourthTier/Source/_javascript_Core
Revision
149908
Author
[email protected]
Date
2013-05-10 15:22:30 -0700 (Fri, 10 May 2013)

Log Message

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.

* _javascript_Core.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):

Modified Paths

Added Paths

Diff

Modified: branches/dfgFourthTier/Source/_javascript_Core/ChangeLog (149907 => 149908)


--- branches/dfgFourthTier/Source/_javascript_Core/ChangeLog	2013-05-10 21:28:14 UTC (rev 149907)
+++ branches/dfgFourthTier/Source/_javascript_Core/ChangeLog	2013-05-10 22:22:30 UTC (rev 149908)
@@ -1,5 +1,45 @@
 2013-05-10  Filip Pizlo  <[email protected]>
 
+        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.
+
+        * _javascript_Core.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  <[email protected]>
+
         fourthTier: FTL should support CompareStrictEq
         https://bugs.webkit.org/show_bug.cgi?id=115927
 

Modified: branches/dfgFourthTier/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj (149907 => 149908)


--- branches/dfgFourthTier/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj	2013-05-10 21:28:14 UTC (rev 149907)
+++ branches/dfgFourthTier/Source/_javascript_Core/_javascript_Core.xcodeproj/project.pbxproj	2013-05-10 22:22:30 UTC (rev 149908)
@@ -316,6 +316,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, ); }; };
@@ -1302,6 +1304,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>"; };
@@ -2105,6 +2109,7 @@
 		0FEA09FC1705137F00BB722C /* ftl */ = {
 			isa = PBXGroup;
 			children = (
+				0FDB2CC7173DA51E007B3C1B /* FTLAbbreviatedTypes.h */,
 				0FEA09FD170513DB00BB722C /* FTLAbbreviations.h */,
 				0FEA0A171708B00700BB722C /* FTLAbstractHeap.cpp */,
 				0FEA0A181708B00700BB722C /* FTLAbstractHeap.h */,
@@ -2151,6 +2156,7 @@
 				0FEA0A1B1708B00700BB722C /* FTLTypedPointer.h */,
 				0F235BCD17178E1C00690C7F /* FTLValueFormat.cpp */,
 				0F235BCE17178E1C00690C7F /* FTLValueFormat.h */,
+				0FDB2CC8173DA51E007B3C1B /* FTLValueFromBlock.h */,
 				0F235BCF17178E1C00690C7F /* FTLValueSource.cpp */,
 				0F235BD017178E1C00690C7F /* FTLValueSource.h */,
 				0F6E5C181724AF3D005C574F /* WebKitLLVMLibraryAnchor.cpp */,
@@ -3427,6 +3433,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 */,
 				0F7025AA1714B0FC00382C0E /* DFGOSRExitCompilerCommon.h in Headers */,
 				BC18C42C0E16F5CD00B34460 /* JSValueRef.h in Headers */,
@@ -3541,6 +3548,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 */,
 				0F235BE617178E1C00690C7F /* FTLValueSource.h in Headers */,

Added: branches/dfgFourthTier/Source/_javascript_Core/ftl/FTLAbbreviatedTypes.h (0 => 149908)


--- branches/dfgFourthTier/Source/_javascript_Core/ftl/FTLAbbreviatedTypes.h	                        (rev 0)
+++ branches/dfgFourthTier/Source/_javascript_Core/ftl/FTLAbbreviatedTypes.h	2013-05-10 22:22:30 UTC (rev 149908)
@@ -0,0 +1,52 @@
+/*
+ * 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
+

Modified: branches/dfgFourthTier/Source/_javascript_Core/ftl/FTLAbbreviations.h (149907 => 149908)


--- branches/dfgFourthTier/Source/_javascript_Core/ftl/FTLAbbreviations.h	2013-05-10 21:28:14 UTC (rev 149907)
+++ branches/dfgFourthTier/Source/_javascript_Core/ftl/FTLAbbreviations.h	2013-05-10 22:22:30 UTC (rev 149908)
@@ -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 @@
 #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 @@
 {
     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)
+static inline void addIncoming(LValue phi, ValueFromBlock value1)
 {
-    ASSERT(values.size() == blocks.size());
-    addIncoming(phi, values.begin(), blocks.begin(), values.size());
+    LValue value = value1.value();
+    LBasicBlock block = value1.block();
+    addIncoming(phi, &value, &block, 1);
 }
-static inline void addIncoming(LValue phi, LValue value1, LBasicBlock block1)
+static inline void addIncoming(LValue phi, ValueFromBlock value1, ValueFromBlock value2)
 {
-    addIncoming(phi, &value1, &block1, 1);
-}
-static inline void addIncoming(LValue phi, LValue value1, LBasicBlock block1, LValue value2, LBasicBlock block2)
-{
-    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;
 }
 

Modified: branches/dfgFourthTier/Source/_javascript_Core/ftl/FTLAbstractHeapRepository.h (149907 => 149908)


--- branches/dfgFourthTier/Source/_javascript_Core/ftl/FTLAbstractHeapRepository.h	2013-05-10 21:28:14 UTC (rev 149907)
+++ branches/dfgFourthTier/Source/_javascript_Core/ftl/FTLAbstractHeapRepository.h	2013-05-10 22:22:30 UTC (rev 149908)
@@ -42,6 +42,7 @@
     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) \

Modified: branches/dfgFourthTier/Source/_javascript_Core/ftl/FTLCapabilities.cpp (149907 => 149908)


--- branches/dfgFourthTier/Source/_javascript_Core/ftl/FTLCapabilities.cpp	2013-05-10 21:28:14 UTC (rev 149907)
+++ branches/dfgFourthTier/Source/_javascript_Core/ftl/FTLCapabilities.cpp	2013-05-10 22:22:30 UTC (rev 149908)
@@ -100,6 +100,7 @@
             case ArithNegate:
             case UInt32ToNumber:
             case Int32ToDouble:
+            case CompareEqConstant:
                 // These are OK.
                 break;
             case GetArrayLength:

Modified: branches/dfgFourthTier/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp (149907 => 149908)


--- branches/dfgFourthTier/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp	2013-05-10 21:28:14 UTC (rev 149907)
+++ branches/dfgFourthTier/Source/_javascript_Core/ftl/FTLLowerDFGToLLVM.cpp	2013-05-10 22:22:30 UTC (rev 149908)
@@ -364,6 +364,9 @@
         case CompareEq:
             compileCompareEq();
             break;
+        case CompareEqConstant:
+            compileCompareEqConstant();
+            break;
         case CompareStrictEq:
             compileCompareStrictEq();
             break;
@@ -965,6 +968,62 @@
         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 @@
             
             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 @@
             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 @@
         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)

Modified: branches/dfgFourthTier/Source/_javascript_Core/ftl/FTLOutput.h (149907 => 149908)


--- branches/dfgFourthTier/Source/_javascript_Core/ftl/FTLOutput.h	2013-05-10 21:28:14 UTC (rev 149907)
+++ branches/dfgFourthTier/Source/_javascript_Core/ftl/FTLOutput.h	2013-05-10 22:22:30 UTC (rev 149908)
@@ -113,14 +113,22 @@
     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); }
     LValue sub(LValue left, LValue right) { return buildSub(m_builder, left, right); }
@@ -311,6 +319,11 @@
     
     void unreachable() { buildUnreachable(m_builder); }
     
+    ValueFromBlock anchor(LValue value)
+    {
+        return ValueFromBlock(value, m_block);
+    }
+    
     LValue m_function;
     AbstractHeapRepository* m_heaps;
     LBuilder m_builder;

Added: branches/dfgFourthTier/Source/_javascript_Core/ftl/FTLValueFromBlock.h (0 => 149908)


--- branches/dfgFourthTier/Source/_javascript_Core/ftl/FTLValueFromBlock.h	                        (rev 0)
+++ branches/dfgFourthTier/Source/_javascript_Core/ftl/FTLValueFromBlock.h	2013-05-10 22:22:30 UTC (rev 149908)
@@ -0,0 +1,58 @@
+/*
+ * 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
+
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to