aoqi@0: /* aoqi@0: * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. aoqi@0: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. aoqi@0: * aoqi@0: * This code is free software; you can redistribute it and/or modify it aoqi@0: * under the terms of the GNU General Public License version 2 only, as aoqi@0: * published by the Free Software Foundation. aoqi@0: * aoqi@0: * This code is distributed in the hope that it will be useful, but WITHOUT aoqi@0: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or aoqi@0: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License aoqi@0: * version 2 for more details (a copy is included in the LICENSE file that aoqi@0: * accompanied this code). aoqi@0: * aoqi@0: * You should have received a copy of the GNU General Public License version aoqi@0: * 2 along with this work; if not, write to the Free Software Foundation, aoqi@0: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. aoqi@0: * aoqi@0: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA aoqi@0: * or visit www.oracle.com if you need additional information or have any aoqi@0: * questions. aoqi@0: * aoqi@0: */ aoqi@0: aoqi@0: #ifndef SHARE_VM_OPTO_LIVE_HPP aoqi@0: #define SHARE_VM_OPTO_LIVE_HPP aoqi@0: aoqi@0: #include "libadt/port.hpp" aoqi@0: #include "libadt/vectset.hpp" aoqi@0: #include "opto/block.hpp" aoqi@0: #include "opto/indexSet.hpp" aoqi@0: #include "opto/phase.hpp" aoqi@0: #include "opto/regmask.hpp" aoqi@0: aoqi@0: class Block; aoqi@0: class PhaseCFG; aoqi@0: class VectorSet; aoqi@0: class IndexSet; aoqi@0: aoqi@0: //------------------------------LRG_List--------------------------------------- aoqi@0: // Map Node indices to Live RanGe indices. aoqi@0: // Array lookup in the optimized case. aoqi@0: typedef GrowableArray LRG_List; aoqi@0: aoqi@0: //------------------------------PhaseLive-------------------------------------- aoqi@0: // Compute live-in/live-out aoqi@0: class PhaseLive : public Phase { aoqi@0: // Array of Sets of values live at the start of a block. aoqi@0: // Indexed by block pre-order number. aoqi@0: IndexSet *_live; aoqi@0: aoqi@0: // Array of Sets of values defined locally in the block aoqi@0: // Indexed by block pre-order number. aoqi@0: IndexSet *_defs; aoqi@0: aoqi@0: // Array of delta-set pointers, indexed by block pre-order number aoqi@0: IndexSet **_deltas; aoqi@0: IndexSet *_free_IndexSet; // Free list of same aoqi@0: aoqi@0: Block_List *_worklist; // Worklist for iterative solution aoqi@0: aoqi@0: const PhaseCFG &_cfg; // Basic blocks aoqi@0: const LRG_List &_names; // Mapping from Nodes to live ranges aoqi@0: uint _maxlrg; // Largest live-range number aoqi@0: Arena *_arena; aoqi@0: aoqi@0: IndexSet *getset( Block *p ); aoqi@0: IndexSet *getfreeset( ); aoqi@0: void freeset( const Block *p ); aoqi@0: void add_liveout( Block *p, uint r, VectorSet &first_pass ); aoqi@0: void add_liveout( Block *p, IndexSet *lo, VectorSet &first_pass ); aoqi@0: aoqi@0: public: aoqi@0: PhaseLive(const PhaseCFG &cfg, const LRG_List &names, Arena *arena); aoqi@0: ~PhaseLive() {} aoqi@0: // Compute liveness info aoqi@0: void compute(uint maxlrg); aoqi@0: // Reset arena storage aoqi@0: void reset() { _live = NULL; } aoqi@0: aoqi@0: // Return the live-out set for this block aoqi@0: IndexSet *live( const Block * b ) { return &_live[b->_pre_order-1]; } aoqi@0: aoqi@0: #ifndef PRODUCT aoqi@0: void dump( const Block *b ) const; aoqi@0: void stats(uint iters) const; aoqi@0: #endif aoqi@0: }; aoqi@0: aoqi@0: #endif // SHARE_VM_OPTO_LIVE_HPP