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,12 +24,14 @@
#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,10 +85,11 @@
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,10 +141,11 @@
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,10 +156,11 @@
// 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,10 +236,18 @@
}
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