You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ap...@apache.org on 2006/12/26 16:01:02 UTC
svn commit: r490306 -
/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp
Author: apetrenko
Date: Tue Dec 26 07:01:01 2006
New Revision: 490306
URL: http://svn.apache.org/viewvc?view=rev&rev=490306
Log:
Patch for HARMONY-2806 "[drlvm][jit][opt] Simplifier does not optimize loading of fun addr slot of known type"
Modified:
harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp?view=diff&rev=490306&r1=490305&r2=490306
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/simplifier.cpp Tue Dec 26 07:01:01 2006
@@ -3541,23 +3541,30 @@
// if vtable is an interface vtable and the base of that
// interface vtable is exact or final then change this
// to a ldvirtfunaddrslot
+ // if vtable is of exact type (loaded by getvtable) then
+ // change this to a ldvirtfunaddrslot
Inst* ldVTableInst = vtable->getInst();
+ Type* baseType = NULL;
if (ldVTableInst->getOpcode() == Op_TauLdVTableAddr ||
ldVTableInst->getOpcode() == Op_TauLdIntfcVTableAddr) {
Opnd* baseRef = ldVTableInst->getSrc(0);
if (isExactType(baseRef)) {
// base has exact type
- Type* baseType = baseRef->getType();
- MethodDesc* newMethodDesc =
- irManager.getCompilationInterface().getOverriddenMethod(
- (NamedType*)baseType, methodDesc);
- //
+ baseType = baseRef->getType();
+ }
+ } else if (ldVTableInst->getOpcode() == Op_GetVTableAddr) {
+ TypeInst* typeInst = ldVTableInst->asTypeInst();
+ assert(typeInst != NULL);
+ baseType = typeInst->getTypeInfo();
+ }
+ if (baseType != NULL) {
+ MethodDesc* newMethodDesc =
+ irManager.getCompilationInterface().getOverriddenMethod((NamedType*)baseType, methodDesc);
+ if (newMethodDesc) {
// change to ldvirtfunaddrslot of newMethodDesc
- //
- if (newMethodDesc)
- return genLdFunAddrSlot(newMethodDesc)->getDst();
+ return genLdFunAddrSlot(newMethodDesc)->getDst();
}
- } else {
+
}
return NULL;
}