Mercurial > hg > graal-compiler
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 /** |