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/04/09 14:22:17 UTC

svn commit: r526726 - in /harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32: Ia32IRManager.cpp Ia32IRManager.h Ia32Inst.cpp Ia32Inst.h

Author: varlax
Date: Mon Apr  9 05:22:16 2007
New Revision: 526726

URL: http://svn.apache.org/viewvc?view=rev&rev=526726
Log:
HARMONY-3175 [drlvm][jit] Jitrino.OPT fails to compile some switch insts combinations when is built in debug mode.
Redone the patch + cleaned up a mess in IRManager::newSwitchInst(). 

Modified:
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.h
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Inst.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Inst.h

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp?view=diff&rev=526726&r1=526725&r2=526726
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.cpp Mon Apr  9 05:22:16 2007
@@ -189,18 +189,6 @@
 }
 
 //_____________________________________________________________________________________________
-Opnd * IRManager::newSwitchTableConstantMemOpnd(uint32 numTargets, Opnd * index)
-{
-    ConstantAreaItem * item=newSwitchTableConstantAreaItem(numTargets);
-#ifdef _EM64T_
-    Opnd * switchTable=newImmOpnd(typeManager.getInt32Type(), Opnd::RuntimeInfo::Kind_ConstantAreaItem, item);
-#else
-    Opnd * switchTable=newImmOpnd(typeManager.getIntPtrType(), Opnd::RuntimeInfo::Kind_ConstantAreaItem, item);
-#endif
-    return newMemOpnd(typeManager.getIntPtrType(), MemOpndKind_ConstantArea, 0, index, newImmOpnd(typeManager.getInt32Type(), sizeof(POINTER_SIZE_INT)), switchTable);
-}
-
-//_____________________________________________________________________________________________
 Opnd * IRManager::newInternalStringConstantImmOpnd(const char * str)
 {
     ConstantAreaItem * item=newInternalStringConstantAreaItem(str);
@@ -217,30 +205,25 @@
 //_____________________________________________________________________________________________
 SwitchInst * IRManager::newSwitchInst(uint32 numTargets, Opnd * index)
 {
-    Inst * instList = NULL;
-#ifndef _EM64T_
     assert(numTargets>0);
     assert(index!=NULL);
-    Opnd* targetOpnd=newSwitchTableConstantMemOpnd(numTargets, index);
-    // Extract the switch table constant address that is stored as 
-    // displacement on IA32. 
+    Inst * instList = NULL;
+    ConstantAreaItem * item=newSwitchTableConstantAreaItem(numTargets);
     // This tableAddress in SwitchInst is kept separately [from getOpnd(0)]
     // so it allows to replace an Opnd (used in SpillGen) and keep the table 
     // itself intact.
-    Opnd* tableAddr = targetOpnd->getMemOpndSubOpnd(MemOpndSubOpndKind_Displacement);
-    SwitchInst * inst=new(memoryManager, 1) SwitchInst(Mnemonic_JMP, instId++, tableAddr);
+    Opnd * tableAddr=newImmOpnd(typeManager.getIntPtrType(), Opnd::RuntimeInfo::Kind_ConstantAreaItem, item);
+#ifndef _EM64T_
+    Opnd * targetOpnd = newMemOpnd(typeManager.getIntPtrType(), 
+        MemOpndKind_ConstantArea, 0, index, newImmOpnd(typeManager.getInt32Type(), sizeof(POINTER_SIZE_INT)), tableAddr);
 #else
-    
-    ConstantAreaItem * item=newSwitchTableConstantAreaItem(numTargets);
-    Opnd * tableAddr = newImmOpnd(typeManager.getInt64Type(), Opnd::RuntimeInfo::Kind_ConstantAreaItem, item);
-
-    SwitchInst * inst=new(memoryManager, 1) SwitchInst(Mnemonic_JMP, instId++, tableAddr);
-    assert(numTargets>0);
-    assert(index!=NULL);
+    // on EM64T immediate displacement cannot be of 64 bit size, so move it to a register first
     Opnd * baseOpnd = newOpnd(typeManager.getInt64Type());
     appendToInstList(instList, newCopyPseudoInst(Mnemonic_MOV, baseOpnd, tableAddr));
-    Opnd * targetOpnd =  newMemOpnd(typeManager.getUnmanagedPtrType(typeManager.getIntPtrType()), MemOpndKind_ConstantArea, baseOpnd, index, newImmOpnd(typeManager.getInt32Type(), sizeof(POINTER_SIZE_INT)), 0);
+    Opnd * targetOpnd = newMemOpnd(typeManager.getUnmanagedPtrType(typeManager.getIntPtrType()), 
+        MemOpndKind_ConstantArea, baseOpnd, index, newImmOpnd(typeManager.getInt32Type(), sizeof(POINTER_SIZE_INT)), 0);
 #endif
+    SwitchInst * inst=new(memoryManager, 1) SwitchInst(Mnemonic_JMP, instId++, tableAddr);
     inst->insertOpnd(0, targetOpnd, Inst::OpndRole_Explicit);
     inst->assignOpcodeGroup(this);
     appendToInstList(instList, inst);

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.h?view=diff&rev=526726&r1=526725&r2=526726
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32IRManager.h Mon Apr  9 05:22:16 2007
@@ -150,7 +150,6 @@
 
     Opnd * newFPConstantMemOpnd(float f, Opnd * baseOpnd=0, BasicBlock * bb=0);
     Opnd * newFPConstantMemOpnd(double f, Opnd * baseOpnd=0, BasicBlock * bb=0);
-    Opnd * newSwitchTableConstantMemOpnd(uint32 numTargets, Opnd * index);
 
     Opnd * newInternalStringConstantImmOpnd(const char * str);
     Opnd * newBinaryConstantImmOpnd(uint32 size, const void * pv);

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Inst.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Inst.cpp?view=diff&rev=526726&r1=526725&r2=526726
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Inst.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Inst.cpp Mon Apr  9 05:22:16 2007
@@ -682,12 +682,14 @@
 //   class SwitchInst
 //=========================================================================================================
 
+ConstantAreaItem * SwitchInst::getConstantAreaItem() const 
+{
+    return (ConstantAreaItem *)tableAddrRI->getValue(0);
+}
+
 Node* SwitchInst::getTarget(uint32 i)const
 {
-    Opnd * tableAddr=getTableAddress();
-    Opnd::RuntimeInfo * ri=tableAddr->getRuntimeInfo();
-    assert(ri->getKind()==Opnd::RuntimeInfo::Kind_ConstantAreaItem);
-    ConstantAreaItem * cai = (ConstantAreaItem *)ri->getValue(0);
+    ConstantAreaItem * cai = getConstantAreaItem();
     assert(i<cai->getSize()/sizeof(Node*));
     return ((Node**)cai->getValue())[i];
 }
@@ -714,21 +716,15 @@
 //_________________________________________________________________________________________________
 uint32 SwitchInst::getNumTargets() const 
 {
-    Opnd * tableAddr=getTableAddress();
-    Opnd::RuntimeInfo * ri= tableAddr->getRuntimeInfo();
-    assert(ri->getKind()==Opnd::RuntimeInfo::Kind_ConstantAreaItem);
-    ConstantAreaItem * cai = (ConstantAreaItem *)ri->getValue(0);
-    return cai->getSize() / sizeof(Node*);
+    return getConstantAreaItem()->getSize() / sizeof(Node*);
 }
 
 //_________________________________________________________________________________________________
 void SwitchInst::setTarget(uint32 i, Node* bb)
 {
     assert(bb->isBlockNode());
-    Opnd * tableAddr=getTableAddress();
-    Opnd::RuntimeInfo * ri=tableAddr->getRuntimeInfo();
-    assert(ri->getKind()==Opnd::RuntimeInfo::Kind_ConstantAreaItem);
-    ConstantAreaItem * cai = (ConstantAreaItem *)ri->getValue(0);
+    
+    ConstantAreaItem * cai = getConstantAreaItem();
     assert(i<cai->getSize()/sizeof(Node*));
     ((Node**)cai->getValue())[i]=bb;
 }
@@ -737,10 +733,7 @@
 void SwitchInst::replaceTarget(Node * bbFrom, Node * bbTo)
 {
     assert(bbTo->isBlockNode());
-    Opnd * tableAddr=getTableAddress();
-    Opnd::RuntimeInfo * ri=tableAddr->getRuntimeInfo();
-    assert(ri->getKind()==Opnd::RuntimeInfo::Kind_ConstantAreaItem);
-    ConstantAreaItem * cai = (ConstantAreaItem *)ri->getValue(0);
+    ConstantAreaItem * cai = getConstantAreaItem();
     Node** bbs=(Node**)cai->getValue();
 #ifdef _DEBUG
     bool found = false;
@@ -771,7 +764,7 @@
 // called from CFG when 2 blocks are merging and one of  the branches is redundant.
 void SwitchInst::removeRedundantBranch()
 {
-    assert(0);
+   unlink();
 }
 
 //_________________________________________________________________________________________________
@@ -942,4 +935,5 @@
 
 
 }};  // namespace Ia32
+
 

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Inst.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Inst.h?view=diff&rev=526726&r1=526725&r2=526726
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Inst.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32Inst.h Mon Apr  9 05:22:16 2007
@@ -42,6 +42,7 @@
 class Inst;
 class BasicBlock;
 class I8Lowerer;
+class ConstantAreaItem;
 
 //=========================================================================================================
 //      class Opnd
@@ -1124,12 +1125,17 @@
     void setTarget(uint32 i, Node* bb);
 
     Opnd * getTableAddress() const;
+    ConstantAreaItem * getConstantAreaItem() const;
     
     virtual void verify() const;
 protected:
     SwitchInst(Mnemonic mnemonic,  int id, Opnd * addr = 0) : 
             ControlTransferInst(mnemonic, id), tableAddr(addr)
-        {kind=Kind_SwitchInst; }
+        {
+            kind=Kind_SwitchInst; 
+            tableAddrRI = addr->getRuntimeInfo();
+            assert(tableAddrRI->getKind()==Opnd::RuntimeInfo::Kind_ConstantAreaItem);
+        }
 
 
     // called by CFG to detect BB->BB block edges
@@ -1140,7 +1146,13 @@
     virtual void removeRedundantBranch();
 
     void replaceTarget(Node* bbFrom, Node* bbTo);
+
+private:
     Opnd * tableAddr;
+    //keep original opnd runtime info.
+    //if orig opnd is spilled by spillgen and it's replacement has no runtime info
+    Opnd::RuntimeInfo* tableAddrRI;
+    
 };
 
 //=========================================================================================================
@@ -1328,9 +1340,6 @@
 
 };
 
-}}; // namespace Ia32
-
-
 //=========================================================================================================
 //      class ConstantAreaItem
 //=========================================================================================================
@@ -1368,5 +1377,6 @@
     void *              address;
 };
 
+}}; // namespace Ia32
 
 #endif