< prev index next >
src/share/vm/c1/c1_Optimizer.cpp
Print this page
rev 10541 : imported patch c1_Optimizer
rev 10549 : imported patch c1_Instruction_BBA
rev 10555 : imported patch primitive arrays
rev 10556 : imported patch update dates
*** 1,7 ****
/*
! * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,7 ----
/*
! * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 29,41 ****
#include "c1/c1_ValueSet.hpp"
#include "c1/c1_ValueStack.hpp"
#include "utilities/bitMap.inline.hpp"
#include "compiler/compileLog.hpp"
! define_array(ValueSetArray, ValueSet*);
! define_stack(ValueSetList, ValueSetArray);
!
Optimizer::Optimizer(IR* ir) {
assert(ir->is_valid(), "IR must be valid");
_ir = ir;
}
--- 29,39 ----
#include "c1/c1_ValueSet.hpp"
#include "c1/c1_ValueStack.hpp"
#include "utilities/bitMap.inline.hpp"
#include "compiler/compileLog.hpp"
! typedef GrowableArray<ValueSet*> ValueSetList;
Optimizer::Optimizer(IR* ir) {
assert(ir->is_valid(), "IR must be valid");
_ir = ir;
}
*** 581,603 ****
void iterate_all();
void iterate_one(BlockBegin* block);
ValueSet* state() { return _set; }
void set_state_from (ValueSet* state) { _set->set_from(state); }
! ValueSet* state_for (BlockBegin* block) { return _block_states[block->block_id()]; }
! void set_state_for (BlockBegin* block, ValueSet* stack) { _block_states[block->block_id()] = stack; }
// Returns true if caused a change in the block's state.
bool merge_state_for(BlockBegin* block,
ValueSet* incoming_state);
public:
// constructor
NullCheckEliminator(Optimizer* opt)
: _opt(opt)
, _set(new ValueSet())
, _last_explicit_null_check(NULL)
! , _block_states(BlockBegin::number_of_blocks(), NULL)
, _work_list(new BlockList()) {
_visitable_instructions = new ValueSet();
_visitor.set_eliminator(this);
CompileLog* log = _opt->ir()->compilation()->log();
if (log != NULL)
--- 579,601 ----
void iterate_all();
void iterate_one(BlockBegin* block);
ValueSet* state() { return _set; }
void set_state_from (ValueSet* state) { _set->set_from(state); }
! ValueSet* state_for (BlockBegin* block) { return _block_states.at(block->block_id()); }
! void set_state_for (BlockBegin* block, ValueSet* stack) { _block_states.at_put(block->block_id(), stack); }
// Returns true if caused a change in the block's state.
bool merge_state_for(BlockBegin* block,
ValueSet* incoming_state);
public:
// constructor
NullCheckEliminator(Optimizer* opt)
: _opt(opt)
, _set(new ValueSet())
, _last_explicit_null_check(NULL)
! , _block_states(BlockBegin::number_of_blocks(), BlockBegin::number_of_blocks(), NULL)
, _work_list(new BlockList()) {
_visitable_instructions = new ValueSet();
_visitor.set_eliminator(this);
CompileLog* log = _opt->ir()->compilation()->log();
if (log != NULL)
*** 1162,1195 ****
// walk over the graph looking for exception
// handlers and iterate over them as well
int nblocks = BlockBegin::number_of_blocks();
BlockList blocks(nblocks);
! boolArray visited_block(nblocks, false);
blocks.push(ir()->start());
! visited_block[ir()->start()->block_id()] = true;
for (int i = 0; i < blocks.length(); i++) {
! BlockBegin* b = blocks[i];
// exception handlers need to be treated as additional roots
for (int e = b->number_of_exception_handlers(); e-- > 0; ) {
BlockBegin* excp = b->exception_handler_at(e);
int id = excp->block_id();
! if (!visited_block[id]) {
blocks.push(excp);
! visited_block[id] = true;
nce.iterate(excp);
}
}
// traverse successors
BlockEnd *end = b->end();
for (int s = end->number_of_sux(); s-- > 0; ) {
BlockBegin* next = end->sux_at(s);
int id = next->block_id();
! if (!visited_block[id]) {
blocks.push(next);
! visited_block[id] = true;
}
}
}
--- 1160,1193 ----
// walk over the graph looking for exception
// handlers and iterate over them as well
int nblocks = BlockBegin::number_of_blocks();
BlockList blocks(nblocks);
! boolArray visited_block(nblocks, nblocks, false);
blocks.push(ir()->start());
! visited_block.at_put(ir()->start()->block_id(), true);
for (int i = 0; i < blocks.length(); i++) {
! BlockBegin* b = blocks.at(i);
// exception handlers need to be treated as additional roots
for (int e = b->number_of_exception_handlers(); e-- > 0; ) {
BlockBegin* excp = b->exception_handler_at(e);
int id = excp->block_id();
! if (!visited_block.at(id)) {
blocks.push(excp);
! visited_block.at_put(id, true);
nce.iterate(excp);
}
}
// traverse successors
BlockEnd *end = b->end();
for (int s = end->number_of_sux(); s-- > 0; ) {
BlockBegin* next = end->sux_at(s);
int id = next->block_id();
! if (!visited_block.at(id)) {
blocks.push(next);
! visited_block.at_put(id, true);
}
}
}
< prev index next >