--- a/hotspot/src/share/vm/c1/c1_Instruction.hpp Fri Oct 11 19:51:31 2013 -0700
+++ b/hotspot/src/share/vm/c1/c1_Instruction.hpp Sat Oct 12 12:12:59 2013 +0200
@@ -107,6 +107,7 @@
class UnsafePrefetchRead;
class UnsafePrefetchWrite;
class ProfileCall;
+class ProfileReturnType;
class ProfileInvoke;
class RuntimeCall;
class MemBar;
@@ -211,6 +212,7 @@
virtual void do_UnsafePrefetchRead (UnsafePrefetchRead* x) = 0;
virtual void do_UnsafePrefetchWrite(UnsafePrefetchWrite* x) = 0;
virtual void do_ProfileCall (ProfileCall* x) = 0;
+ virtual void do_ProfileReturnType (ProfileReturnType* x) = 0;
virtual void do_ProfileInvoke (ProfileInvoke* x) = 0;
virtual void do_RuntimeCall (RuntimeCall* x) = 0;
virtual void do_MemBar (MemBar* x) = 0;
@@ -2518,6 +2520,38 @@
}
};
+LEAF(ProfileReturnType, Instruction)
+ private:
+ ciMethod* _method;
+ ciMethod* _callee;
+ int _bci_of_invoke;
+ Value _ret;
+
+ public:
+ ProfileReturnType(ciMethod* method, int bci, ciMethod* callee, Value ret)
+ : Instruction(voidType)
+ , _method(method)
+ , _callee(callee)
+ , _bci_of_invoke(bci)
+ , _ret(ret)
+ {
+ set_needs_null_check(true);
+ // The ProfileType has side-effects and must occur precisely where located
+ pin();
+ }
+
+ ciMethod* method() const { return _method; }
+ ciMethod* callee() const { return _callee; }
+ int bci_of_invoke() const { return _bci_of_invoke; }
+ Value ret() const { return _ret; }
+
+ virtual void input_values_do(ValueVisitor* f) {
+ if (_ret != NULL) {
+ f->visit(&_ret);
+ }
+ }
+};
+
// Call some C runtime function that doesn't safepoint,
// optionally passing the current thread as the first argument.
LEAF(RuntimeCall, Instruction)