< prev index next >
src/share/vm/opto/machnode.cpp
Print this page
*** 666,677 ****
//=============================================================================
uint MachCallNode::cmp( const Node &n ) const
{ return _tf == ((MachCallNode&)n)._tf; }
! const Type *MachCallNode::bottom_type() const { return tf()->range(); }
! const Type* MachCallNode::Value(PhaseGVN* phase) const { return tf()->range(); }
#ifndef PRODUCT
void MachCallNode::dump_spec(outputStream *st) const {
st->print("# ");
if (tf() != NULL) tf()->dump_on(st);
--- 666,677 ----
//=============================================================================
uint MachCallNode::cmp( const Node &n ) const
{ return _tf == ((MachCallNode&)n)._tf; }
! const Type *MachCallNode::bottom_type() const { return tf()->range_cc(); }
! const Type* MachCallNode::Value(PhaseGVN* phase) const { return tf()->range_cc(); }
#ifndef PRODUCT
void MachCallNode::dump_spec(outputStream *st) const {
st->print("# ");
if (tf() != NULL) tf()->dump_on(st);
*** 679,693 ****
if (jvms() != NULL) jvms()->dump_spec(st);
}
#endif
bool MachCallNode::return_value_is_used() const {
! if (tf()->range()->cnt() == TypeFunc::Parms) {
// void return
return false;
}
// find the projection corresponding to the return value
for (DUIterator_Fast imax, i = fast_outs(imax); i < imax; i++) {
Node *use = fast_out(i);
if (!use->is_Proj()) continue;
if (use->as_Proj()->_con == TypeFunc::Parms) {
--- 679,695 ----
if (jvms() != NULL) jvms()->dump_spec(st);
}
#endif
bool MachCallNode::return_value_is_used() const {
! if (tf()->range_sig()->cnt() == TypeFunc::Parms) {
// void return
return false;
}
+ assert(tf()->returns_value_type_as_fields(), "multiple return values not supported");
+
// find the projection corresponding to the return value
for (DUIterator_Fast imax, i = fast_outs(imax); i < imax; i++) {
Node *use = fast_out(i);
if (!use->is_Proj()) continue;
if (use->as_Proj()->_con == TypeFunc::Parms) {
*** 699,713 ****
// Similar to cousin class CallNode::returns_pointer
// Because this is used in deoptimization, we want the type info, not the data
// flow info; the interpreter will "use" things that are dead to the optimizer.
bool MachCallNode::returns_pointer() const {
! const TypeTuple *r = tf()->range();
return (r->cnt() > TypeFunc::Parms &&
r->field_at(TypeFunc::Parms)->isa_ptr());
}
//------------------------------Registers--------------------------------------
const RegMask &MachCallNode::in_RegMask(uint idx) const {
// Values in the domain use the users calling convention, embodied in the
// _in_rms array of RegMasks.
if (idx < tf()->domain_sig()->cnt()) {
--- 701,719 ----
// Similar to cousin class CallNode::returns_pointer
// Because this is used in deoptimization, we want the type info, not the data
// flow info; the interpreter will "use" things that are dead to the optimizer.
bool MachCallNode::returns_pointer() const {
! const TypeTuple *r = tf()->range_sig();
return (r->cnt() > TypeFunc::Parms &&
r->field_at(TypeFunc::Parms)->isa_ptr());
}
+ bool MachCallNode::returns_vt() const {
+ return tf()->returns_value_type_as_fields();
+ }
+
//------------------------------Registers--------------------------------------
const RegMask &MachCallNode::in_RegMask(uint idx) const {
// Values in the domain use the users calling convention, embodied in the
// _in_rms array of RegMasks.
if (idx < tf()->domain_sig()->cnt()) {
< prev index next >