--- old/src/share/vm/c1/c1_LIR.hpp 2015-08-12 14:09:13.000000000 +0200 +++ new/src/share/vm/c1/c1_LIR.hpp 2015-08-12 14:09:13.000000000 +0200 @@ -36,6 +36,7 @@ class CodeStub; class CodeStubList; class ArrayCopyStub; +class C1ThreadLocalSafepoint; class LIR_Op; class ciType; class ValueType; @@ -873,6 +874,7 @@ class LIR_OpLabel; class LIR_Op1; class LIR_OpBranch; +class LIR_Op1Safepoint; class LIR_OpConvert; class LIR_OpAllocObj; class LIR_OpRoundFP; @@ -1142,6 +1144,7 @@ virtual LIR_OpAllocObj* as_OpAllocObj() { return NULL; } virtual LIR_OpRoundFP* as_OpRoundFP() { return NULL; } virtual LIR_OpBranch* as_OpBranch() { return NULL; } + virtual LIR_Op1Safepoint* as_Op1Safepoint() { return NULL; } virtual LIR_OpRTCall* as_OpRTCall() { return NULL; } virtual LIR_OpConvert* as_OpConvert() { return NULL; } virtual LIR_Op0* as_Op0() { return NULL; } @@ -1468,6 +1471,19 @@ virtual void print_instr(outputStream* out) const PRODUCT_RETURN; }; +class LIR_Op1Safepoint: public LIR_Op1 { + friend class LIR_OpVisitState; + + private: + C1ThreadLocalSafepoint* _tls_stub; + + public: + LIR_Op1Safepoint(LIR_Code code, LIR_Opr opr, CodeEmitInfo* info); + + C1ThreadLocalSafepoint* tls_stub() const { return _tls_stub; } + + virtual LIR_Op1Safepoint* as_Op1Safepoint() { return this; } +}; class ConversionStub; @@ -2140,9 +2156,9 @@ void metadata2reg (Metadata* o, LIR_Opr reg) { assert(reg->type() == T_METADATA, "bad reg"); append(new LIR_Op1(lir_move, LIR_OprFact::metadataConst(o), reg)); } void klass2reg_patch(Metadata* o, LIR_Opr reg, CodeEmitInfo* info); - void return_op(LIR_Opr result) { append(new LIR_Op1(lir_return, result)); } + void return_op(LIR_Opr result) { append(new LIR_Op1Safepoint(lir_return, result, NULL)); } - void safepoint(LIR_Opr tmp, CodeEmitInfo* info) { append(new LIR_Op1(lir_safepoint, tmp, info)); } + void safepoint(LIR_Opr tmp, CodeEmitInfo* info) { append(new LIR_Op1Safepoint(lir_safepoint, tmp, info)); } #ifdef PPC void convert(Bytecodes::Code code, LIR_Opr left, LIR_Opr dst, LIR_Opr tmp1, LIR_Opr tmp2) { append(new LIR_OpConvert(code, left, dst, NULL, tmp1, tmp2)); }