Changeset 132554 in webkit


Ignore:
Timestamp:
Oct 25, 2012 6:57:07 PM (11 years ago)
Author:
fpizlo@apple.com
Message:

DFG Arrayify elimination should replace it with GetButterfly rather than Phantom
https://bugs.webkit.org/show_bug.cgi?id=100441

Reviewed by Oliver Hunt and Gavin Barraclough.

Source/JavaScriptCore:

Made array profiler's to-string helper behave correctly.

Made Arrayify elimination do the right thing (convert to GetButterfly).

Made CFA's interference analysis track clobbered array modes correctly, mostly by
simplifying the machinery.

  • bytecode/ArrayProfile.cpp:

(JSC::arrayModesToString):

  • dfg/DFGAbstractState.cpp:

(JSC::DFG::AbstractState::execute):

  • dfg/DFGAbstractValue.h:

(JSC::DFG::AbstractValue::clobberArrayModes):
(AbstractValue):

  • dfg/DFGConstantFoldingPhase.cpp:

(JSC::DFG::ConstantFoldingPhase::foldConstants):

LayoutTests:

  • fast/js/dfg-arrayify-elimination-expected.txt: Added.
  • fast/js/dfg-arrayify-elimination.html: Added.
  • fast/js/jsc-test-list:
  • fast/js/script-tests/dfg-arrayify-elimination.js: Added.

(foo):

Location:
trunk
Files:
3 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r132553 r132554  
     12012-10-25  Filip Pizlo  <fpizlo@apple.com>
     2
     3        DFG Arrayify elimination should replace it with GetButterfly rather than Phantom
     4        https://bugs.webkit.org/show_bug.cgi?id=100441
     5
     6        Reviewed by Oliver Hunt and Gavin Barraclough.
     7
     8        * fast/js/dfg-arrayify-elimination-expected.txt: Added.
     9        * fast/js/dfg-arrayify-elimination.html: Added.
     10        * fast/js/jsc-test-list:
     11        * fast/js/script-tests/dfg-arrayify-elimination.js: Added.
     12        (foo):
     13
    1142012-10-25  Keishi Hattori  <keishi@webkit.org>
    215
  • trunk/LayoutTests/fast/js/jsc-test-list

    r132546 r132554  
    8080fast/js/dfg-arguments-out-of-bounds
    8181fast/js/dfg-arguments-unexpected-escape
     82fast/js/dfg-arrayify-elimination
    8283fast/js/dfg-arrayify-when-late-prevent-extensions
    8384fast/js/dfg-arrayify-when-prevent-extensions
  • trunk/Source/JavaScriptCore/ChangeLog

    r132546 r132554  
     12012-10-25  Filip Pizlo  <fpizlo@apple.com>
     2
     3        DFG Arrayify elimination should replace it with GetButterfly rather than Phantom
     4        https://bugs.webkit.org/show_bug.cgi?id=100441
     5
     6        Reviewed by Oliver Hunt and Gavin Barraclough.
     7
     8        Made array profiler's to-string helper behave correctly.
     9       
     10        Made Arrayify elimination do the right thing (convert to GetButterfly).
     11       
     12        Made CFA's interference analysis track clobbered array modes correctly, mostly by
     13        simplifying the machinery.
     14
     15        * bytecode/ArrayProfile.cpp:
     16        (JSC::arrayModesToString):
     17        * dfg/DFGAbstractState.cpp:
     18        (JSC::DFG::AbstractState::execute):
     19        * dfg/DFGAbstractValue.h:
     20        (JSC::DFG::AbstractValue::clobberArrayModes):
     21        (AbstractValue):
     22        * dfg/DFGConstantFoldingPhase.cpp:
     23        (JSC::DFG::ConstantFoldingPhase::foldConstants):
     24
    1252012-10-25  Filip Pizlo  <fpizlo@apple.com>
    226
  • trunk/Source/JavaScriptCore/bytecode/ArrayProfile.cpp

    r131982 r132554  
    3939        return "TOP";
    4040
    41     bool isNonArray = !!(arrayModes & NonArray);
    42     bool isNonArrayWithContiguous = !!(arrayModes & NonArrayWithContiguous);
    43     bool isNonArrayWithArrayStorage = !!(arrayModes & NonArrayWithArrayStorage);
    44     bool isNonArrayWithSlowPutArrayStorage = !!(arrayModes & NonArrayWithSlowPutArrayStorage);
    45     bool isArray = !!(arrayModes & ArrayClass);
    46     bool isArrayWithContiguous = !!(arrayModes & ArrayWithContiguous);
    47     bool isArrayWithArrayStorage = !!(arrayModes & ArrayWithArrayStorage);
    48     bool isArrayWithSlowPutArrayStorage = !!(arrayModes & ArrayWithSlowPutArrayStorage);
     41    bool isNonArray = !!(arrayModes & asArrayModes(NonArray));
     42    bool isNonArrayWithContiguous = !!(arrayModes & asArrayModes(NonArrayWithContiguous));
     43    bool isNonArrayWithArrayStorage = !!(arrayModes & asArrayModes(NonArrayWithArrayStorage));
     44    bool isNonArrayWithSlowPutArrayStorage = !!(arrayModes & asArrayModes(NonArrayWithSlowPutArrayStorage));
     45    bool isArray = !!(arrayModes & asArrayModes(ArrayClass));
     46    bool isArrayWithContiguous = !!(arrayModes & asArrayModes(ArrayWithContiguous));
     47    bool isArrayWithArrayStorage = !!(arrayModes & asArrayModes(ArrayWithArrayStorage));
     48    bool isArrayWithSlowPutArrayStorage = !!(arrayModes & asArrayModes(ArrayWithSlowPutArrayStorage));
    4949   
    5050    static char result[256];
  • trunk/Source/JavaScriptCore/dfg/DFGAbstractState.cpp

    r132162 r132554  
    14221422        }
    14231423        forNode(node.child1()).filterArrayModes(arrayModesFor(node.arrayMode()));
     1424        m_haveStructures = true;
    14241425        break;
    14251426    }
     
    14391440            clobberStructures(indexInBlock);
    14401441            forNode(node.child1()).filterArrayModes(arrayModesFor(node.arrayMode()));
     1442            m_haveStructures = true;
    14411443            break;
    14421444        default:
  • trunk/Source/JavaScriptCore/dfg/DFGAbstractValue.h

    r131982 r132554  
    459459    void clobberArrayModes()
    460460    {
    461         if (m_arrayModes == ALL_ARRAY_MODES)
    462             return;
    463        
    464         if (LIKELY(m_arrayModes & asArrayModes(NonArray)))
    465             m_arrayModes = ALL_ARRAY_MODES;
    466         else
    467             clobberArrayModesSlow();
    468     }
    469    
    470     void clobberArrayModesSlow()
    471     {
    472         if (m_arrayModes & asArrayModes(ArrayClass))
    473             m_arrayModes = ALL_ARRAY_MODES;
    474         else if (m_arrayModes & asArrayModes(NonArrayWithContiguous))
    475             m_arrayModes |= asArrayModes(NonArrayWithArrayStorage) | asArrayModes(NonArrayWithSlowPutArrayStorage);
    476         else if (m_arrayModes & asArrayModes(ArrayWithContiguous))
    477             m_arrayModes |= asArrayModes(ArrayWithArrayStorage) | asArrayModes(ArrayWithSlowPutArrayStorage);
    478         else if (m_arrayModes & asArrayModes(NonArrayWithArrayStorage))
    479             m_arrayModes |= asArrayModes(NonArrayWithSlowPutArrayStorage);
    480         else if (m_arrayModes & asArrayModes(ArrayWithArrayStorage))
    481             m_arrayModes |= asArrayModes(ArrayWithArrayStorage);
    482     }
    483 
     461        // FIXME: We could make this try to predict the set of array modes that this object
     462        // could have in the future. For now, just do the simple thing.
     463        m_arrayModes = ALL_ARRAY_MODES;
     464    }
     465   
    484466    void setFuturePossibleStructure(Structure* structure)
    485467    {
  • trunk/Source/JavaScriptCore/dfg/DFGConstantFoldingPhase.cpp

    r131982 r132554  
    103103            }
    104104               
    105             case CheckArray:
    106             case Arrayify: {
     105            case CheckArray: {
    107106                if (!modeAlreadyChecked(m_state.forNode(node.child1()), node.arrayMode()))
    108107                    break;
     
    113112            }
    114113               
     114            case Arrayify: {
     115                if (!modeAlreadyChecked(m_state.forNode(node.child1()), node.arrayMode()))
     116                    break;
     117                ASSERT(node.refCount() >= 1);
     118                node.setOpAndDefaultFlags(GetButterfly);
     119                m_graph.deref(nodeIndex);
     120                eliminated = true;
     121                break;
     122            }
     123
    115124            default:
    116125                break;
Note: See TracChangeset for help on using the changeset viewer.