comparison graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/java/MethodCallTargetNode.java @ 21381:d339bcb65015

Single-implementer optimization is an optimistic optimization, even though it does not register an assumption
author Christian Wimmer <christian.wimmer@oracle.com>
date Thu, 14 May 2015 16:06:42 -0700
parents 754f2b20d8bc
children 48c1ebd24120
comparison
equal deleted inserted replaced
21380:af9d0db304e8 21381:d339bcb65015
173 /* 173 /*
174 * We need to check the invoke kind to avoid recursive simplification for virtual 174 * We need to check the invoke kind to avoid recursive simplification for virtual
175 * interface methods calls. 175 * interface methods calls.
176 */ 176 */
177 if (declaredReceiverType.isInterface()) { 177 if (declaredReceiverType.isInterface()) {
178 tryCheckCastSingleImplementor(receiver, declaredReceiverType); 178 tryCheckCastSingleImplementor(graph().getAssumptions(), receiver, declaredReceiverType);
179 } 179 }
180 180
181 if (receiver instanceof UncheckedInterfaceProvider) { 181 if (receiver instanceof UncheckedInterfaceProvider) {
182 UncheckedInterfaceProvider uncheckedInterfaceProvider = (UncheckedInterfaceProvider) receiver; 182 UncheckedInterfaceProvider uncheckedInterfaceProvider = (UncheckedInterfaceProvider) receiver;
183 Stamp uncheckedStamp = uncheckedInterfaceProvider.uncheckedStamp(); 183 Stamp uncheckedStamp = uncheckedInterfaceProvider.uncheckedStamp();
184 if (uncheckedStamp != null) { 184 if (uncheckedStamp != null) {
185 ResolvedJavaType uncheckedReceiverType = StampTool.typeOrNull(uncheckedStamp); 185 ResolvedJavaType uncheckedReceiverType = StampTool.typeOrNull(uncheckedStamp);
186 if (uncheckedReceiverType.isInterface()) { 186 if (uncheckedReceiverType.isInterface()) {
187 tryCheckCastSingleImplementor(receiver, uncheckedReceiverType); 187 tryCheckCastSingleImplementor(graph().getAssumptions(), receiver, uncheckedReceiverType);
188 } 188 }
189 } 189 }
190 } 190 }
191 } 191 }
192 } 192 }
193 193
194 private void tryCheckCastSingleImplementor(ValueNode receiver, ResolvedJavaType declaredReceiverType) { 194 private void tryCheckCastSingleImplementor(Assumptions assumptions, ValueNode receiver, ResolvedJavaType declaredReceiverType) {
195 if (assumptions == null) {
196 /*
197 * Even though we are not registering an assumption (see comment below), the
198 * optimization is only valid when speculative optimizations are enabled.
199 */
200 return;
201 }
202
195 ResolvedJavaType singleImplementor = declaredReceiverType.getSingleImplementor(); 203 ResolvedJavaType singleImplementor = declaredReceiverType.getSingleImplementor();
196 if (singleImplementor != null && !singleImplementor.equals(declaredReceiverType)) { 204 if (singleImplementor != null && !singleImplementor.equals(declaredReceiverType)) {
197 ResolvedJavaMethod singleImplementorMethod = singleImplementor.resolveMethod(targetMethod(), invoke().getContextType(), true); 205 ResolvedJavaMethod singleImplementorMethod = singleImplementor.resolveMethod(targetMethod(), invoke().getContextType(), true);
198 if (singleImplementorMethod != null) { 206 if (singleImplementorMethod != null) {
199 /** 207 /**