Mercurial > hg > graal-jvmci-8
comparison src/share/vm/opto/parse3.cpp @ 1138:dd57230ba8fe
6893268: additional dynamic language related optimizations in C2
Summary: C2 needs some additional optimizations to be able to handle MethodHandle invokes and invokedynamic instructions at the best performance.
Reviewed-by: kvn, never
author | twisti |
---|---|
date | Tue, 05 Jan 2010 15:21:25 +0100 |
parents | f96a1a986f7b |
children | f516d5d7a019 |
comparison
equal
deleted
inserted
replaced
1137:97125851f396 | 1138:dd57230ba8fe |
---|---|
123 } | 123 } |
124 | 124 |
125 | 125 |
126 void Parse::do_get_xxx(const TypePtr* obj_type, Node* obj, ciField* field, bool is_field) { | 126 void Parse::do_get_xxx(const TypePtr* obj_type, Node* obj, ciField* field, bool is_field) { |
127 // Does this field have a constant value? If so, just push the value. | 127 // Does this field have a constant value? If so, just push the value. |
128 if (field->is_constant() && push_constant(field->constant_value())) return; | 128 if (field->is_constant()) { |
129 if (field->is_static()) { | |
130 // final static field | |
131 if (push_constant(field->constant_value())) | |
132 return; | |
133 } | |
134 else { | |
135 // final non-static field of a trusted class ({java,sun}.dyn | |
136 // classes). | |
137 if (obj->is_Con()) { | |
138 const TypeOopPtr* oop_ptr = obj->bottom_type()->isa_oopptr(); | |
139 ciObject* constant_oop = oop_ptr->const_oop(); | |
140 ciConstant constant = field->constant_value_of(constant_oop); | |
141 | |
142 if (push_constant(constant, true)) | |
143 return; | |
144 } | |
145 } | |
146 } | |
129 | 147 |
130 ciType* field_klass = field->type(); | 148 ciType* field_klass = field->type(); |
131 bool is_vol = field->is_volatile(); | 149 bool is_vol = field->is_volatile(); |
132 | 150 |
133 // Compute address and memory type. | 151 // Compute address and memory type. |
143 | 161 |
144 if( bt == T_OBJECT ) { | 162 if( bt == T_OBJECT ) { |
145 if (!field->type()->is_loaded()) { | 163 if (!field->type()->is_loaded()) { |
146 type = TypeInstPtr::BOTTOM; | 164 type = TypeInstPtr::BOTTOM; |
147 must_assert_null = true; | 165 must_assert_null = true; |
148 } else if (field->is_constant()) { | 166 } else if (field->is_constant() && field->is_static()) { |
149 // This can happen if the constant oop is non-perm. | 167 // This can happen if the constant oop is non-perm. |
150 ciObject* con = field->constant_value().as_object(); | 168 ciObject* con = field->constant_value().as_object(); |
151 // Do not "join" in the previous type; it doesn't add value, | 169 // Do not "join" in the previous type; it doesn't add value, |
152 // and may yield a vacuous result if the field is of interface type. | 170 // and may yield a vacuous result if the field is of interface type. |
153 type = TypeOopPtr::make_from_constant(con)->isa_oopptr(); | 171 type = TypeOopPtr::make_from_constant(con)->isa_oopptr(); |