91 //
92 // The non-Parm edges of the returned map will contain updated global state,
93 // and one or two edges before jvms->sp() will carry any return values.
94 // Other map edges may contain locals or monitors, and should not
95 // be changed in meaning.
96 //
97 // If the call traps, the returned map must have a control edge of top.
98 // If the call can throw, the returned map must report has_exceptions().
99 //
100 // If the result is NULL, it means that this CallGenerator was unable
101 // to handle the given call, and another CallGenerator should be consulted.
102 virtual JVMState* generate(JVMState* jvms) = 0;
103
104 // How to generate a call site that is inlined:
105 static CallGenerator* for_inline(ciMethod* m, float expected_uses = -1);
106 // How to generate code for an on-stack replacement handler.
107 static CallGenerator* for_osr(ciMethod* m, int osr_bci);
108
109 // How to generate vanilla out-of-line call sites:
110 static CallGenerator* for_direct_call(ciMethod* m, bool separate_io_projs = false); // static, special
111 static CallGenerator* for_dynamic_call(ciMethod* m); // invokedynamic
112 static CallGenerator* for_virtual_call(ciMethod* m, int vtable_index); // virtual, interface
113
114 static CallGenerator* for_method_handle_inline(Node* method_handle, JVMState* jvms, ciMethod* caller, ciMethod* callee, ciCallProfile profile);
115 static CallGenerator* for_invokedynamic_inline(ciCallSite* call_site, JVMState* jvms, ciMethod* caller, ciMethod* callee, ciCallProfile profile);
116
117 // How to generate a replace a direct call with an inline version
118 static CallGenerator* for_late_inline(ciMethod* m, CallGenerator* inline_cg);
119
120 // How to make a call but defer the decision whether to inline or not.
121 static CallGenerator* for_warm_call(WarmCallInfo* ci,
122 CallGenerator* if_cold,
123 CallGenerator* if_hot);
124
125 // How to make a call that optimistically assumes a receiver type:
126 static CallGenerator* for_predicted_call(ciKlass* predicted_receiver,
127 CallGenerator* if_missed,
128 CallGenerator* if_hit,
129 float hit_prob);
130
131 // How to make a call that optimistically assumes a MethodHandle target:
132 static CallGenerator* for_predicted_dynamic_call(ciMethodHandle* predicted_method_handle,
|
91 //
92 // The non-Parm edges of the returned map will contain updated global state,
93 // and one or two edges before jvms->sp() will carry any return values.
94 // Other map edges may contain locals or monitors, and should not
95 // be changed in meaning.
96 //
97 // If the call traps, the returned map must have a control edge of top.
98 // If the call can throw, the returned map must report has_exceptions().
99 //
100 // If the result is NULL, it means that this CallGenerator was unable
101 // to handle the given call, and another CallGenerator should be consulted.
102 virtual JVMState* generate(JVMState* jvms) = 0;
103
104 // How to generate a call site that is inlined:
105 static CallGenerator* for_inline(ciMethod* m, float expected_uses = -1);
106 // How to generate code for an on-stack replacement handler.
107 static CallGenerator* for_osr(ciMethod* m, int osr_bci);
108
109 // How to generate vanilla out-of-line call sites:
110 static CallGenerator* for_direct_call(ciMethod* m, bool separate_io_projs = false); // static, special
111 static CallGenerator* for_virtual_call(ciMethod* m, int vtable_index); // virtual, interface
112 static CallGenerator* for_dynamic_call(ciMethod* m); // invokedynamic
113
114 static CallGenerator* for_method_handle_call(Node* method_handle, JVMState* jvms, ciMethod* caller, ciMethod* callee, ciCallProfile profile);
115 static CallGenerator* for_invokedynamic_call( JVMState* jvms, ciMethod* caller, ciMethod* callee, ciCallProfile profile);
116
117 static CallGenerator* for_method_handle_inline(Node* method_handle, JVMState* jvms, ciMethod* caller, ciMethod* callee, ciCallProfile profile);
118 static CallGenerator* for_invokedynamic_inline(ciCallSite* call_site, JVMState* jvms, ciMethod* caller, ciMethod* callee, ciCallProfile profile);
119
120 // How to generate a replace a direct call with an inline version
121 static CallGenerator* for_late_inline(ciMethod* m, CallGenerator* inline_cg);
122
123 // How to make a call but defer the decision whether to inline or not.
124 static CallGenerator* for_warm_call(WarmCallInfo* ci,
125 CallGenerator* if_cold,
126 CallGenerator* if_hot);
127
128 // How to make a call that optimistically assumes a receiver type:
129 static CallGenerator* for_predicted_call(ciKlass* predicted_receiver,
130 CallGenerator* if_missed,
131 CallGenerator* if_hit,
132 float hit_prob);
133
134 // How to make a call that optimistically assumes a MethodHandle target:
135 static CallGenerator* for_predicted_dynamic_call(ciMethodHandle* predicted_method_handle,
|