--- old/src/hotspot/share/c1/c1_LIR.hpp 2019-02-13 17:02:40.051733866 -0800 +++ new/src/hotspot/share/c1/c1_LIR.hpp 2019-02-13 17:02:39.831725560 -0800 @@ -873,6 +873,7 @@ class LIR_OpUpdateCRC32; class LIR_OpLock; class LIR_OpTypeCheck; +class LIR_OpFlattenedStoreCheck; class LIR_OpCompareAndSwap; class LIR_OpProfileCall; class LIR_OpProfileType; @@ -987,6 +988,9 @@ , lir_checkcast , lir_store_check , end_opTypeCheck + , begin_opFlattenedStoreCheck + , lir_flattened_store_check + , end_opFlattenedStoreCheck , begin_opCompareAndSwap , lir_cas_long , lir_cas_obj @@ -1137,6 +1141,7 @@ virtual LIR_OpArrayCopy* as_OpArrayCopy() { return NULL; } virtual LIR_OpUpdateCRC32* as_OpUpdateCRC32() { return NULL; } virtual LIR_OpTypeCheck* as_OpTypeCheck() { return NULL; } + virtual LIR_OpFlattenedStoreCheck* as_OpFlattenedStoreCheck() { return NULL; } virtual LIR_OpCompareAndSwap* as_OpCompareAndSwap() { return NULL; } virtual LIR_OpProfileCall* as_OpProfileCall() { return NULL; } virtual LIR_OpProfileType* as_OpProfileType() { return NULL; } @@ -1595,6 +1600,34 @@ void print_instr(outputStream* out) const PRODUCT_RETURN; }; +// LIR_OpFlattenedStoreCheck +class LIR_OpFlattenedStoreCheck: public LIR_Op { + friend class LIR_OpVisitState; + + private: + LIR_Opr _object; + ciKlass* _element_klass; + LIR_Opr _tmp1; + LIR_Opr _tmp2; + CodeEmitInfo* _info_for_exception; + CodeStub* _stub; + +public: + LIR_OpFlattenedStoreCheck(LIR_Opr object, ciKlass* element_klass, LIR_Opr tmp1, LIR_Opr tmp2, + CodeEmitInfo* info_for_exception); + + LIR_Opr object() const { return _object; } + LIR_Opr tmp1() const { return _tmp1; } + LIR_Opr tmp2() const { return _tmp2; } + ciKlass* element_klass() const { return _element_klass; } + CodeEmitInfo* info_for_exception() const { return _info_for_exception; } + CodeStub* stub() const { return _stub; } + + virtual void emit_code(LIR_Assembler* masm); + virtual LIR_OpFlattenedStoreCheck* as_OpFlattenedStoreCheck() { return this; } + virtual void print_instr(outputStream* out) const PRODUCT_RETURN; +}; + // LIR_Op2 class LIR_Op2: public LIR_Op { friend class LIR_OpVisitState; @@ -2252,6 +2285,7 @@ void instanceof(LIR_Opr result, LIR_Opr object, ciKlass* klass, LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, bool fast_check, CodeEmitInfo* info_for_patch, ciMethod* profiled_method, int profiled_bci); void store_check(LIR_Opr object, LIR_Opr array, LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, CodeEmitInfo* info_for_exception, ciMethod* profiled_method, int profiled_bci); + void flattened_store_check(LIR_Opr object, ciKlass* element_klass, LIR_Opr tmp1, LIR_Opr tmp2, CodeEmitInfo* info_for_exception); void checkcast (LIR_Opr result, LIR_Opr object, ciKlass* klass, LIR_Opr tmp1, LIR_Opr tmp2, LIR_Opr tmp3, bool fast_check,