You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by va...@apache.org on 2007/03/27 10:56:27 UTC

svn commit: r522818 - /harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/devirtualizer.cpp

Author: varlax
Date: Tue Mar 27 01:56:26 2007
New Revision: 522818

URL: http://svn.apache.org/viewvc?view=rev&rev=522818
Log:
Applied HARMONY-3242 [drlvm][jit] interface devirtualization bug
Tested on SLES10@ia32, SLES9@x64, WinXP@ia32.

Modified:
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/devirtualizer.cpp

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/devirtualizer.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/devirtualizer.cpp?view=diff&rev=522818&r1=522817&r2=522818
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/devirtualizer.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/devirtualizer.cpp Tue Mar 27 01:56:26 2007
@@ -269,12 +269,15 @@
                                                              ldSlot->getMethodDesc());
         virtualCallBlock->appendInst(ldSlot2);
         icall->setSrc(0, funPtr2);
-        // Move ldInterfaceVTable to the virtual call block
+        // Duplicate ldInterfaceVTable in virtual call block
         Inst* ldVTable = vtable->getInst();
         if (ldVTable->getOpcode() == Op_TauLdIntfcVTableAddr) {
-            ldVTable->unlink();
-            ldSlot->unlink();
-            ldVTable->insertBefore(ldSlot2);
+            Opnd* slot = ldVTable->getSrc(0);
+            Type* type = ldVTable->asTypeInst()->getTypeInfo();
+            Opnd* vtable2 = _opndManager.createSsaTmpOpnd(vtable->getType());
+            Inst* ldVTable2 = _instFactory.makeTauLdIntfcVTableAddr(vtable2, slot, type);
+            ldSlot2->setSrc(0, vtable2);
+            ldVTable2->insertBefore(ldSlot2);
         }
     }
     virtualCallBlock->appendInst(virtualCall);