mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-21 03:24:38 +02:00
Merge
This commit is contained in:
commit
471e47dddf
14 changed files with 62 additions and 65 deletions
|
@ -280,16 +280,7 @@ endif
|
||||||
|
|
||||||
# optimization control flags (Used by fastdebug and release variants)
|
# optimization control flags (Used by fastdebug and release variants)
|
||||||
OPT_CFLAGS/NOOPT=-O0
|
OPT_CFLAGS/NOOPT=-O0
|
||||||
ifeq ($(USE_CLANG), true)
|
OPT_CFLAGS/DEBUG=-O0
|
||||||
# Clang does not support -Og
|
|
||||||
OPT_CFLAGS/DEBUG=-O0
|
|
||||||
else ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1"
|
|
||||||
# Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination)
|
|
||||||
OPT_CFLAGS/DEBUG=-Og
|
|
||||||
else
|
|
||||||
# Allow no optimizations.
|
|
||||||
OPT_CFLAGS/DEBUG=-O0
|
|
||||||
endif
|
|
||||||
OPT_CFLAGS/SIZE=-Os
|
OPT_CFLAGS/SIZE=-Os
|
||||||
OPT_CFLAGS/SPEED=-O3
|
OPT_CFLAGS/SPEED=-O3
|
||||||
|
|
||||||
|
@ -457,16 +448,8 @@ ifeq ($(USE_CLANG), true)
|
||||||
CFLAGS += -flimit-debug-info
|
CFLAGS += -flimit-debug-info
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(USE_CLANG), true)
|
# Allow no optimizations.
|
||||||
# Clang does not support -Og
|
DEBUG_CFLAGS=-O0
|
||||||
DEBUG_CFLAGS=-O0
|
|
||||||
else ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1"
|
|
||||||
# Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination)
|
|
||||||
DEBUG_CFLAGS=-Og
|
|
||||||
else
|
|
||||||
# Allow no optimizations.
|
|
||||||
DEBUG_CFLAGS=-O0
|
|
||||||
endif
|
|
||||||
|
|
||||||
# DEBUG_BINARIES uses full -g debug information for all configs
|
# DEBUG_BINARIES uses full -g debug information for all configs
|
||||||
ifeq ($(DEBUG_BINARIES), true)
|
ifeq ($(DEBUG_BINARIES), true)
|
||||||
|
|
|
@ -231,13 +231,7 @@ CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@))
|
||||||
|
|
||||||
# optimization control flags (Used by fastdebug and release variants)
|
# optimization control flags (Used by fastdebug and release variants)
|
||||||
OPT_CFLAGS/NOOPT=-O0
|
OPT_CFLAGS/NOOPT=-O0
|
||||||
ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1"
|
OPT_CFLAGS/DEBUG=-O0
|
||||||
# Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination)
|
|
||||||
OPT_CFLAGS/DEBUG=-Og
|
|
||||||
else
|
|
||||||
# Allow no optimizations.
|
|
||||||
OPT_CFLAGS/DEBUG=-O0
|
|
||||||
endif
|
|
||||||
OPT_CFLAGS/SIZE=-Os
|
OPT_CFLAGS/SIZE=-Os
|
||||||
OPT_CFLAGS/SPEED=-O3
|
OPT_CFLAGS/SPEED=-O3
|
||||||
|
|
||||||
|
@ -344,13 +338,8 @@ ifeq ($(USE_CLANG), true)
|
||||||
CFLAGS += -flimit-debug-info
|
CFLAGS += -flimit-debug-info
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1"
|
# Allow no optimizations.
|
||||||
# Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination)
|
DEBUG_CFLAGS=-O0
|
||||||
DEBUG_CFLAGS=-Og
|
|
||||||
else
|
|
||||||
# Allow no optimizations.
|
|
||||||
DEBUG_CFLAGS=-O0
|
|
||||||
endif
|
|
||||||
|
|
||||||
# DEBUG_BINARIES uses full -g debug information for all configs
|
# DEBUG_BINARIES uses full -g debug information for all configs
|
||||||
ifeq ($(DEBUG_BINARIES), true)
|
ifeq ($(DEBUG_BINARIES), true)
|
||||||
|
|
|
@ -127,13 +127,7 @@ CFLAGS_WARN/BYFILE = $(CFLAGS_WARN/$@)$(CFLAGS_WARN/DEFAULT$(CFLAGS_WARN/$@))
|
||||||
|
|
||||||
# optimization control flags (Used by fastdebug and release variants)
|
# optimization control flags (Used by fastdebug and release variants)
|
||||||
OPT_CFLAGS/NOOPT=-O0
|
OPT_CFLAGS/NOOPT=-O0
|
||||||
ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1"
|
OPT_CFLAGS/DEBUG=-O0
|
||||||
# Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination)
|
|
||||||
OPT_CFLAGS/DEBUG=-Og
|
|
||||||
+else
|
|
||||||
# Allow no optimizations.
|
|
||||||
OPT_CFLAGS/DEBUG=-O0
|
|
||||||
endif
|
|
||||||
OPT_CFLAGS/SIZE=-Os
|
OPT_CFLAGS/SIZE=-Os
|
||||||
OPT_CFLAGS/SPEED=-O3
|
OPT_CFLAGS/SPEED=-O3
|
||||||
|
|
||||||
|
@ -229,14 +223,8 @@ SHARED_FLAG = -shared
|
||||||
#------------------------------------------------------------------------
|
#------------------------------------------------------------------------
|
||||||
# Debug flags
|
# Debug flags
|
||||||
|
|
||||||
ifeq "$(shell expr \( $(CC_VER_MAJOR) \> 4 \) \| \( \( $(CC_VER_MAJOR) = 4 \) \& \( $(CC_VER_MINOR) \>= 8 \) \))" "1"
|
# Allow no optimizations.
|
||||||
# Allow basic optimizations which don't distrupt debugging. (Principally dead code elimination)
|
DEBUG_CFLAGS=-O0
|
||||||
DEBUG_CFLAGS=-Og
|
|
||||||
else
|
|
||||||
# Allow no optimizations.
|
|
||||||
DEBUG_CFLAGS=-O0
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
# Use the stabs format for debugging information (this is the default
|
# Use the stabs format for debugging information (this is the default
|
||||||
# on gcc-2.91). It's good enough, has all the information about line
|
# on gcc-2.91). It's good enough, has all the information about line
|
||||||
|
|
|
@ -1997,7 +1997,13 @@ void GraphBuilder::invoke(Bytecodes::Code code) {
|
||||||
if (!UseInlineCaches && is_loaded && code == Bytecodes::_invokevirtual
|
if (!UseInlineCaches && is_loaded && code == Bytecodes::_invokevirtual
|
||||||
&& !target->can_be_statically_bound()) {
|
&& !target->can_be_statically_bound()) {
|
||||||
// Find a vtable index if one is available
|
// Find a vtable index if one is available
|
||||||
vtable_index = target->resolve_vtable_index(calling_klass, callee_holder);
|
// For arrays, callee_holder is Object. Resolving the call with
|
||||||
|
// Object would allow an illegal call to finalize() on an
|
||||||
|
// array. We use holder instead: illegal calls to finalize() won't
|
||||||
|
// be compiled as vtable calls (IC call resolution will catch the
|
||||||
|
// illegal call) and the few legal calls on array types won't be
|
||||||
|
// either.
|
||||||
|
vtable_index = target->resolve_vtable_index(calling_klass, holder);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
#include "code/vtableStubs.hpp"
|
#include "code/vtableStubs.hpp"
|
||||||
|
#include "compiler/compileBroker.hpp"
|
||||||
#include "compiler/disassembler.hpp"
|
#include "compiler/disassembler.hpp"
|
||||||
#include "memory/allocation.inline.hpp"
|
#include "memory/allocation.inline.hpp"
|
||||||
#include "memory/resourceArea.hpp"
|
#include "memory/resourceArea.hpp"
|
||||||
|
@ -62,6 +63,7 @@ void* VtableStub::operator new(size_t size, int code_size) throw() {
|
||||||
// If changing the name, update the other file accordingly.
|
// If changing the name, update the other file accordingly.
|
||||||
BufferBlob* blob = BufferBlob::create("vtable chunks", bytes);
|
BufferBlob* blob = BufferBlob::create("vtable chunks", bytes);
|
||||||
if (blob == NULL) {
|
if (blob == NULL) {
|
||||||
|
CompileBroker::handle_full_code_cache();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
_chunk = blob->content_begin();
|
_chunk = blob->content_begin();
|
||||||
|
|
|
@ -1093,6 +1093,7 @@ IRT_END
|
||||||
address SignatureHandlerLibrary::set_handler_blob() {
|
address SignatureHandlerLibrary::set_handler_blob() {
|
||||||
BufferBlob* handler_blob = BufferBlob::create("native signature handlers", blob_size);
|
BufferBlob* handler_blob = BufferBlob::create("native signature handlers", blob_size);
|
||||||
if (handler_blob == NULL) {
|
if (handler_blob == NULL) {
|
||||||
|
CompileBroker::handle_full_code_cache();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
address handler = handler_blob->code_begin();
|
address handler = handler_blob->code_begin();
|
||||||
|
|
|
@ -871,8 +871,11 @@ CallGenerator* CallGenerator::for_method_handle_inline(JVMState* jvms, ciMethod*
|
||||||
Node* receiver_node = kit.argument(0);
|
Node* receiver_node = kit.argument(0);
|
||||||
const TypeOopPtr* receiver_type = gvn.type(receiver_node)->isa_oopptr();
|
const TypeOopPtr* receiver_type = gvn.type(receiver_node)->isa_oopptr();
|
||||||
// call_does_dispatch and vtable_index are out-parameters. They might be changed.
|
// call_does_dispatch and vtable_index are out-parameters. They might be changed.
|
||||||
target = C->optimize_virtual_call(caller, jvms->bci(), klass, target, receiver_type,
|
// optimize_virtual_call() takes 2 different holder
|
||||||
is_virtual,
|
// arguments for a corner case that doesn't apply here (see
|
||||||
|
// Parse::do_call())
|
||||||
|
target = C->optimize_virtual_call(caller, jvms->bci(), klass, klass,
|
||||||
|
target, receiver_type, is_virtual,
|
||||||
call_does_dispatch, vtable_index); // out-parameters
|
call_does_dispatch, vtable_index); // out-parameters
|
||||||
// We lack profiling at this call but type speculation may
|
// We lack profiling at this call but type speculation may
|
||||||
// provide us with a type
|
// provide us with a type
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "classfile/systemDictionary.hpp"
|
#include "classfile/systemDictionary.hpp"
|
||||||
#include "code/exceptionHandlerTable.hpp"
|
#include "code/exceptionHandlerTable.hpp"
|
||||||
#include "code/nmethod.hpp"
|
#include "code/nmethod.hpp"
|
||||||
|
#include "compiler/compileBroker.hpp"
|
||||||
#include "compiler/compileLog.hpp"
|
#include "compiler/compileLog.hpp"
|
||||||
#include "compiler/disassembler.hpp"
|
#include "compiler/disassembler.hpp"
|
||||||
#include "compiler/oopMap.hpp"
|
#include "compiler/oopMap.hpp"
|
||||||
|
@ -555,6 +556,7 @@ void Compile::init_scratch_buffer_blob(int const_size) {
|
||||||
if (scratch_buffer_blob() == NULL) {
|
if (scratch_buffer_blob() == NULL) {
|
||||||
// Let CompilerBroker disable further compilations.
|
// Let CompilerBroker disable further compilations.
|
||||||
record_failure("Not enough space for scratch buffer in CodeCache");
|
record_failure("Not enough space for scratch buffer in CodeCache");
|
||||||
|
CompileBroker::handle_full_code_cache();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -852,8 +852,8 @@ class Compile : public Phase {
|
||||||
|
|
||||||
// Helper functions to identify inlining potential at call-site
|
// Helper functions to identify inlining potential at call-site
|
||||||
ciMethod* optimize_virtual_call(ciMethod* caller, int bci, ciInstanceKlass* klass,
|
ciMethod* optimize_virtual_call(ciMethod* caller, int bci, ciInstanceKlass* klass,
|
||||||
ciMethod* callee, const TypeOopPtr* receiver_type,
|
ciKlass* holder, ciMethod* callee,
|
||||||
bool is_virtual,
|
const TypeOopPtr* receiver_type, bool is_virtual,
|
||||||
bool &call_does_dispatch, int &vtable_index);
|
bool &call_does_dispatch, int &vtable_index);
|
||||||
ciMethod* optimize_inlining(ciMethod* caller, int bci, ciInstanceKlass* klass,
|
ciMethod* optimize_inlining(ciMethod* caller, int bci, ciInstanceKlass* klass,
|
||||||
ciMethod* callee, const TypeOopPtr* receiver_type);
|
ciMethod* callee, const TypeOopPtr* receiver_type);
|
||||||
|
|
|
@ -468,8 +468,14 @@ void Parse::do_call() {
|
||||||
Node* receiver_node = stack(sp() - nargs);
|
Node* receiver_node = stack(sp() - nargs);
|
||||||
const TypeOopPtr* receiver_type = _gvn.type(receiver_node)->isa_oopptr();
|
const TypeOopPtr* receiver_type = _gvn.type(receiver_node)->isa_oopptr();
|
||||||
// call_does_dispatch and vtable_index are out-parameters. They might be changed.
|
// call_does_dispatch and vtable_index are out-parameters. They might be changed.
|
||||||
callee = C->optimize_virtual_call(method(), bci(), klass, orig_callee, receiver_type,
|
// For arrays, klass below is Object. When vtable calls are used,
|
||||||
is_virtual,
|
// resolving the call with Object would allow an illegal call to
|
||||||
|
// finalize() on an array. We use holder instead: illegal calls to
|
||||||
|
// finalize() won't be compiled as vtable calls (IC call
|
||||||
|
// resolution will catch the illegal call) and the few legal calls
|
||||||
|
// on array types won't be either.
|
||||||
|
callee = C->optimize_virtual_call(method(), bci(), klass, holder, orig_callee,
|
||||||
|
receiver_type, is_virtual,
|
||||||
call_does_dispatch, vtable_index); // out-parameters
|
call_does_dispatch, vtable_index); // out-parameters
|
||||||
speculative_receiver_type = receiver_type != NULL ? receiver_type->speculative_type() : NULL;
|
speculative_receiver_type = receiver_type != NULL ? receiver_type->speculative_type() : NULL;
|
||||||
}
|
}
|
||||||
|
@ -940,8 +946,8 @@ void Parse::count_compiled_calls(bool at_method_entry, bool is_inline) {
|
||||||
|
|
||||||
|
|
||||||
ciMethod* Compile::optimize_virtual_call(ciMethod* caller, int bci, ciInstanceKlass* klass,
|
ciMethod* Compile::optimize_virtual_call(ciMethod* caller, int bci, ciInstanceKlass* klass,
|
||||||
ciMethod* callee, const TypeOopPtr* receiver_type,
|
ciKlass* holder, ciMethod* callee,
|
||||||
bool is_virtual,
|
const TypeOopPtr* receiver_type, bool is_virtual,
|
||||||
bool& call_does_dispatch, int& vtable_index) {
|
bool& call_does_dispatch, int& vtable_index) {
|
||||||
// Set default values for out-parameters.
|
// Set default values for out-parameters.
|
||||||
call_does_dispatch = true;
|
call_does_dispatch = true;
|
||||||
|
@ -956,7 +962,7 @@ ciMethod* Compile::optimize_virtual_call(ciMethod* caller, int bci, ciInstanceKl
|
||||||
call_does_dispatch = false;
|
call_does_dispatch = false;
|
||||||
} else if (!UseInlineCaches && is_virtual && callee->is_loaded()) {
|
} else if (!UseInlineCaches && is_virtual && callee->is_loaded()) {
|
||||||
// We can make a vtable call at this site
|
// We can make a vtable call at this site
|
||||||
vtable_index = callee->resolve_vtable_index(caller->holder(), klass);
|
vtable_index = callee->resolve_vtable_index(caller->holder(), holder);
|
||||||
}
|
}
|
||||||
return callee;
|
return callee;
|
||||||
}
|
}
|
||||||
|
@ -979,8 +985,10 @@ ciMethod* Compile::optimize_inlining(ciMethod* caller, int bci, ciInstanceKlass*
|
||||||
ciInstanceKlass* actual_receiver = klass;
|
ciInstanceKlass* actual_receiver = klass;
|
||||||
if (receiver_type != NULL) {
|
if (receiver_type != NULL) {
|
||||||
// Array methods are all inherited from Object, and are monomorphic.
|
// Array methods are all inherited from Object, and are monomorphic.
|
||||||
|
// finalize() call on array is not allowed.
|
||||||
if (receiver_type->isa_aryptr() &&
|
if (receiver_type->isa_aryptr() &&
|
||||||
callee->holder() == env()->Object_klass()) {
|
callee->holder() == env()->Object_klass() &&
|
||||||
|
callee->name() != ciSymbol::finalize_method_name()) {
|
||||||
return callee;
|
return callee;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1163,6 +1163,7 @@ CodeBuffer* Compile::init_buffer(uint* blk_starts) {
|
||||||
// Have we run out of code space?
|
// Have we run out of code space?
|
||||||
if ((cb->blob() == NULL) || (!CompileBroker::should_compile_new_jobs())) {
|
if ((cb->blob() == NULL) || (!CompileBroker::should_compile_new_jobs())) {
|
||||||
C->record_failure("CodeCache is full");
|
C->record_failure("CodeCache is full");
|
||||||
|
CompileBroker::handle_full_code_cache();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
// Configure the code buffer.
|
// Configure the code buffer.
|
||||||
|
@ -1487,6 +1488,7 @@ void Compile::fill_buffer(CodeBuffer* cb, uint* blk_starts) {
|
||||||
cb->insts()->maybe_expand_to_ensure_remaining(MAX_inst_size);
|
cb->insts()->maybe_expand_to_ensure_remaining(MAX_inst_size);
|
||||||
if ((cb->blob() == NULL) || (!CompileBroker::should_compile_new_jobs())) {
|
if ((cb->blob() == NULL) || (!CompileBroker::should_compile_new_jobs())) {
|
||||||
C->record_failure("CodeCache is full");
|
C->record_failure("CodeCache is full");
|
||||||
|
CompileBroker::handle_full_code_cache();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1643,6 +1645,7 @@ void Compile::fill_buffer(CodeBuffer* cb, uint* blk_starts) {
|
||||||
// One last check for failed CodeBuffer::expand:
|
// One last check for failed CodeBuffer::expand:
|
||||||
if ((cb->blob() == NULL) || (!CompileBroker::should_compile_new_jobs())) {
|
if ((cb->blob() == NULL) || (!CompileBroker::should_compile_new_jobs())) {
|
||||||
C->record_failure("CodeCache is full");
|
C->record_failure("CodeCache is full");
|
||||||
|
CompileBroker::handle_full_code_cache();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -557,8 +557,9 @@ class Parse : public GraphKit {
|
||||||
|
|
||||||
float dynamic_branch_prediction(float &cnt);
|
float dynamic_branch_prediction(float &cnt);
|
||||||
float branch_prediction(float &cnt, BoolTest::mask btest, int target_bci);
|
float branch_prediction(float &cnt, BoolTest::mask btest, int target_bci);
|
||||||
bool seems_never_taken(float prob);
|
bool seems_never_taken(float prob) const;
|
||||||
bool seems_stable_comparison(BoolTest::mask btest, Node* c);
|
bool path_is_suitable_for_uncommon_trap(float prob) const;
|
||||||
|
bool seems_stable_comparison() const;
|
||||||
|
|
||||||
void do_ifnull(BoolTest::mask btest, Node* c);
|
void do_ifnull(BoolTest::mask btest, Node* c);
|
||||||
void do_if(BoolTest::mask btest, Node* c);
|
void do_if(BoolTest::mask btest, Node* c);
|
||||||
|
|
|
@ -886,7 +886,7 @@ float Parse::branch_prediction(float& cnt,
|
||||||
// some branches (e.g., _213_javac.Assembler.eliminate) validly produce
|
// some branches (e.g., _213_javac.Assembler.eliminate) validly produce
|
||||||
// very small but nonzero probabilities, which if confused with zero
|
// very small but nonzero probabilities, which if confused with zero
|
||||||
// counts would keep the program recompiling indefinitely.
|
// counts would keep the program recompiling indefinitely.
|
||||||
bool Parse::seems_never_taken(float prob) {
|
bool Parse::seems_never_taken(float prob) const {
|
||||||
return prob < PROB_MIN;
|
return prob < PROB_MIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -898,7 +898,7 @@ bool Parse::seems_never_taken(float prob) {
|
||||||
// already acting in a stable fashion. If the comparison
|
// already acting in a stable fashion. If the comparison
|
||||||
// seems stable, we will put an expensive uncommon trap
|
// seems stable, we will put an expensive uncommon trap
|
||||||
// on the untaken path.
|
// on the untaken path.
|
||||||
bool Parse::seems_stable_comparison(BoolTest::mask btest, Node* cmp) {
|
bool Parse::seems_stable_comparison() const {
|
||||||
if (C->too_many_traps(method(), bci(), Deoptimization::Reason_unstable_if)) {
|
if (C->too_many_traps(method(), bci(), Deoptimization::Reason_unstable_if)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -1127,6 +1127,14 @@ void Parse::do_if(BoolTest::mask btest, Node* c) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Parse::path_is_suitable_for_uncommon_trap(float prob) const {
|
||||||
|
// Don't want to speculate on uncommon traps when running with -Xcomp
|
||||||
|
if (!UseInterpreter) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return (seems_never_taken(prob) && seems_stable_comparison());
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------adjust_map_after_if------------------------------
|
//----------------------------adjust_map_after_if------------------------------
|
||||||
// Adjust the JVM state to reflect the result of taking this path.
|
// Adjust the JVM state to reflect the result of taking this path.
|
||||||
// Basically, it means inspecting the CmpNode controlling this
|
// Basically, it means inspecting the CmpNode controlling this
|
||||||
|
@ -1140,7 +1148,7 @@ void Parse::adjust_map_after_if(BoolTest::mask btest, Node* c, float prob,
|
||||||
|
|
||||||
bool is_fallthrough = (path == successor_for_bci(iter().next_bci()));
|
bool is_fallthrough = (path == successor_for_bci(iter().next_bci()));
|
||||||
|
|
||||||
if (seems_never_taken(prob) && seems_stable_comparison(btest, c)) {
|
if (path_is_suitable_for_uncommon_trap(prob)) {
|
||||||
repush_if_args();
|
repush_if_args();
|
||||||
uncommon_trap(Deoptimization::Reason_unstable_if,
|
uncommon_trap(Deoptimization::Reason_unstable_if,
|
||||||
Deoptimization::Action_reinterpret,
|
Deoptimization::Action_reinterpret,
|
||||||
|
|
|
@ -34,6 +34,9 @@ void AbstractICache::initialize() {
|
||||||
ResourceMark rm;
|
ResourceMark rm;
|
||||||
|
|
||||||
BufferBlob* b = BufferBlob::create("flush_icache_stub", ICache::stub_size);
|
BufferBlob* b = BufferBlob::create("flush_icache_stub", ICache::stub_size);
|
||||||
|
if (b == NULL) {
|
||||||
|
vm_exit_out_of_memory(ICache::stub_size, OOM_MALLOC_ERROR, "CodeCache: no space for flush_icache_stub");
|
||||||
|
}
|
||||||
CodeBuffer c(b);
|
CodeBuffer c(b);
|
||||||
|
|
||||||
ICacheStubGenerator g(&c);
|
ICacheStubGenerator g(&c);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue