--- a/hotspot/src/share/vm/opto/reg_split.cpp Fri Aug 24 16:23:59 2012 -0700
+++ b/hotspot/src/share/vm/opto/reg_split.cpp Mon Aug 27 09:46:38 2012 -0700
@@ -449,9 +449,12 @@
// USES: If USE is in HRP, split at use to leave main LRG on stack.
// Else, hoist LRG back up to register only (ie - split is also DEF)
// We will compute a new maxlrg as we go
-uint PhaseChaitin::Split( uint maxlrg ) {
+uint PhaseChaitin::Split(uint maxlrg, ResourceArea* split_arena) {
NOT_PRODUCT( Compile::TracePhase t3("regAllocSplit", &_t_regAllocSplit, TimeCompiler); )
+ // Free thread local resources used by this method on exit.
+ ResourceMark rm(split_arena);
+
uint bidx, pidx, slidx, insidx, inpidx, twoidx;
uint non_phi = 1, spill_cnt = 0;
Node **Reachblock;
@@ -461,14 +464,17 @@
bool u1, u2, u3;
Block *b, *pred;
PhiNode *phi;
- GrowableArray<uint> lidxs;
+ GrowableArray<uint> lidxs(split_arena, _maxlrg, 0, 0);
// Array of counters to count splits per live range
- GrowableArray<uint> splits;
+ GrowableArray<uint> splits(split_arena, _maxlrg, 0, 0);
+
+#define NEW_SPLIT_ARRAY(type, size)\
+ (type*) split_arena->allocate_bytes((size) * sizeof(type))
//----------Setup Code----------
// Create a convenient mapping from lrg numbers to reaches/leaves indices
- uint *lrg2reach = NEW_RESOURCE_ARRAY( uint, _maxlrg );
+ uint *lrg2reach = NEW_SPLIT_ARRAY( uint, _maxlrg );
// Keep track of DEFS & Phis for later passes
defs = new Node_List();
phis = new Node_List();
@@ -500,15 +506,15 @@
// a Def is UP or DOWN. UP means that it should get a register (ie -
// it is always in LRP regions), and DOWN means that it is probably
// on the stack (ie - it crosses HRP regions).
- Node ***Reaches = NEW_RESOURCE_ARRAY( Node**, _cfg._num_blocks+1 );
- bool **UP = NEW_RESOURCE_ARRAY( bool*, _cfg._num_blocks+1 );
- Node **debug_defs = NEW_RESOURCE_ARRAY( Node*, spill_cnt );
- VectorSet **UP_entry= NEW_RESOURCE_ARRAY( VectorSet*, spill_cnt );
+ Node ***Reaches = NEW_SPLIT_ARRAY( Node**, _cfg._num_blocks+1 );
+ bool **UP = NEW_SPLIT_ARRAY( bool*, _cfg._num_blocks+1 );
+ Node **debug_defs = NEW_SPLIT_ARRAY( Node*, spill_cnt );
+ VectorSet **UP_entry= NEW_SPLIT_ARRAY( VectorSet*, spill_cnt );
// Initialize Reaches & UP
for( bidx = 0; bidx < _cfg._num_blocks+1; bidx++ ) {
- Reaches[bidx] = NEW_RESOURCE_ARRAY( Node*, spill_cnt );
- UP[bidx] = NEW_RESOURCE_ARRAY( bool, spill_cnt );
+ Reaches[bidx] = NEW_SPLIT_ARRAY( Node*, spill_cnt );
+ UP[bidx] = NEW_SPLIT_ARRAY( bool, spill_cnt );
Node **Reachblock = Reaches[bidx];
bool *UPblock = UP[bidx];
for( slidx = 0; slidx < spill_cnt; slidx++ ) {
@@ -517,9 +523,11 @@
}
}
+#undef NEW_SPLIT_ARRAY
+
// Initialize to array of empty vectorsets
for( slidx = 0; slidx < spill_cnt; slidx++ )
- UP_entry[slidx] = new VectorSet(Thread::current()->resource_area());
+ UP_entry[slidx] = new VectorSet(split_arena);
//----------PASS 1----------
//----------Propagation & Node Insertion Code----------