src/share/vm/c1/c1_Compilation.hpp
Print this page
rev 4136 : 7153771: array bound check elimination for c1
Summary: when possible optimize out array bound checks, inserting predicates when needed.
Reviewed-by:
*** 24,35 ****
--- 24,37 ----
#ifndef SHARE_VM_C1_C1_COMPILATION_HPP
#define SHARE_VM_C1_C1_COMPILATION_HPP
#include "ci/ciEnv.hpp"
+ #include "ci/ciMethodData.hpp"
#include "code/exceptionHandlerTable.hpp"
#include "memory/resourceArea.hpp"
+ #include "runtime/deoptimization.hpp"
class CompilationResourceObj;
class XHandlers;
class ExceptionInfo;
class DebugInformationRecorder;
*** 83,92 ****
--- 85,95 ----
ExceptionHandlerTable _exception_handler_table;
ImplicitExceptionTable _implicit_exception_table;
LinearScan* _allocator;
CodeOffsets _offsets;
CodeBuffer _code;
+ bool _has_access_indexed;
// compilation helpers
void initialize();
void build_hir();
void emit_lir();
*** 138,147 ****
--- 141,151 ----
FrameMap* frame_map() const { return _frame_map; }
CodeBuffer* code() { return &_code; }
C1_MacroAssembler* masm() const { return _masm; }
CodeOffsets* offsets() { return &_offsets; }
Arena* arena() { return _arena; }
+ bool has_access_indexed() { return _has_access_indexed; }
// Instruction ids
int get_next_id() { return _next_id++; }
int number_of_instructions() const { return _next_id; }
*** 152,161 ****
--- 156,166 ----
// setters
void set_has_exception_handlers(bool f) { _has_exception_handlers = f; }
void set_has_fpu_code(bool f) { _has_fpu_code = f; }
void set_has_unsafe_access(bool f) { _has_unsafe_access = f; }
void set_would_profile(bool f) { _would_profile = f; }
+ void set_has_access_indexed(bool f) { _has_access_indexed = f; }
// Add a set of exception handlers covering the given PC offset
void add_exception_handlers_for_pco(int pco, XHandlers* exception_handlers);
// Statistics gathering
void notice_inlined_method(ciMethod* method);
*** 231,240 ****
--- 236,253 ----
}
bool profile_checkcasts() {
return env()->comp_level() == CompLevel_full_profile &&
C1UpdateMethodData && C1ProfileCheckcasts;
}
+
+ // will compilation make optimistic assumptions that might lead to
+ // deoptimization and that the runtime will account for?
+ bool is_optimistic() const {
+ return !TieredCompilation &&
+ (RangeCheckElimination || UseLoopInvariantCodeMotion) &&
+ method()->method_data()->trap_count(Deoptimization::Reason_none) == 0;
+ }
};
// Macro definitions for unified bailout-support
// The methods bailout() and bailed_out() are present in all classes