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 2006/12/21 11:39:01 UTC
svn commit: r489319 -
/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32SpillGen.cpp
Author: varlax
Date: Thu Dec 21 02:39:00 2006
New Revision: 489319
URL: http://svn.apache.org/viewvc?view=rev&rev=489319
Log:
Applied HARMONY-2747 [drlvm][jit] Jitrino SpillGen improvements
Tested on SUSE9@ia32, SUSE9@x64.
Modified:
harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32SpillGen.cpp
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32SpillGen.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32SpillGen.cpp?view=diff&rev=489319&r1=489318&r2=489319
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32SpillGen.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/codegenerator/ia32/Ia32SpillGen.cpp Thu Dec 21 02:39:00 2006
@@ -225,11 +225,7 @@
void assignMem (Opline&, Instx* begx, Instx* endx);
void saveOpnd (Opline&, Instx*, Opnd*);
void saveOpnd (Opline&, Instx*, Opnd*, RegMask, int, bool);
-#ifdef _OLD_
- void loadOpnd (Opline&, Instx*, Opnd*);
-#else
bool loadOpnd (Opline&, Instx*, Opnd*);
-#endif
void loadOpndMem (Opline&);
Opnd* opndMem (Opline&);
Opnd* opndMem (const Opnd*);
@@ -606,11 +602,7 @@
}
lives_start = irManager->getLiveAtEntry(bblock);
-#ifdef _OLD_
- lives_exit->resize(lives_start->getSetSize());
-#else
lives_exit->resize(opndcount);
-#endif
irManager->getLiveAtExit(bblock, *lives_exit);
size_t bfails = 0;
@@ -644,11 +636,7 @@
size_t oldcount = opndcount;
opndcount = irManager->getOpndCount();
lives_exit->resize(opndcount);
-#ifdef _OLD_
- lives_start->resize(opndcount);
-#else
irManager->fixLivenessInfo();
-#endif
actsmap.resize(opndcount);
for (; oldcount < opndcount; ++oldcount)
@@ -670,6 +658,8 @@
log(LogStream::DBG) << endl << "FAILS: " << fails << endl;
#endif
+ assert(fails == 0);
+
if (fails != 0)
Jitrino::crash("SpillGen failed");
@@ -845,7 +835,7 @@
}
else
{
- DBGOUT("Cannot assign " << *opnd << endl;)
+ DBGOUT("Cannot assign " << *opnd << " @ " << *opline->instx->inst << endl;)
}
}
else
@@ -956,7 +946,7 @@
if (!tryEvict(opline, c))
if (!tryRepair(opline, c))
{// Cannot assign operand, so let it remains in the original form
- DBGOUT("Cannot assign " << opline.opnd << endl;)
+ DBGOUT("Cannot assign " << opline.opnd << " @ " << *opline.instx->inst << endl;)
++fails;
if (simplify(opline.instx->inst, opline.opnd))
@@ -1042,15 +1032,11 @@
int count = 0;
for (opline.forw(); opline.go(); opline.forw())
{
-#ifdef _OLD_
- RegMask tmp = mk & mkpost & ~opline.instx->regusage[opline.idx];
-#else
RegMask tmp = mk & mkpost;
if (opline.isEnd())
tmp &= ~opline.instx->regusage[opline.idx-1];
else
tmp &= ~opline.instx->regusage[opline.idx];
-#endif
if (tmp == 0)
break;
@@ -1075,8 +1061,8 @@
count += cnt;
}
- DBGOUT(" -reg [" << *begx->inst << " - " << *endx->inst
- << "] avail:" << RegMasks(cx, mk) << " count:" << count << endl;)
+ DBGOUT(" -reg [" << (const Inst*)begx->inst << " - " << (const Inst*)endx->inst
+ << "] avail:" << RegMasks(cx, mk) << " count:" << count << endl;)
if (count == 0)
{
@@ -1204,18 +1190,24 @@
unsigned mask = (1<<inst->getOpndCount())-1;
Constraint cx = ((Inst*)inst)->getConstraint(it, mask, OpndSize_Default);
RegMask used = usedRegs(opline.instx, opline.idx, need_load);
- RegMask usable = (cx & registers[opline.idx]).getMask() & ~used & ~mk;
- if (usable != 0)
+ RegMask usable = (cx & registers[opline.idx]).getMask() & ~mk;
+ if ((usable & ~used) != 0)
{
- rx = findFree(usable, opline.idx, opline.instx);
+ rx = findFree(usable & ~used, opline.idx, opline.instx);
ox_out = opndReg(ox, rx);
break;
}
+ else if (!(cx & OpndKind_Memory).isNull())
+ {
+ ox_out = opndMem(ox);
+ break;
+ }
else
{
- if (!(cx & OpndKind_Memory).isNull())
+ rx = findEvict(usable, opline.idx, opline.instx, opline.instx);
+ if (rx != RegName_Null)
{
- ox_out = opndMem(ox);
+ ox_out = opndReg(ox, rx);
break;
}
}
@@ -1343,12 +1335,8 @@
DBGOUT("assignReg " << *opline.opnd << " [" << *begx->inst
<< " - " << *endx->inst << "] to " << *opnd_reg << endl;)
-#ifdef _OLD_
- loadOpnd(opline, begx, opnd_reg);
-#else
if (loadOpnd(opline, begx, opnd_reg))
(begx-1)->regusage[opline.idx] |= mk;
-#endif
for (Instx* ptrx = begx; ptrx <= endx; ++ptrx)
{
@@ -1370,16 +1358,9 @@
ptrx->evicts->push_back(opnd_reg);
}
-#ifdef _OLD_
- ptrx->regusage[opline.idx] |= mk;
- }
- if (begx != endx)
- endx->regusage[opline.idx] &= ~mk;
-#else
if (ptrx != endx)
ptrx->regusage[opline.idx] |= mk;
}
-#endif
bool before = false;
if (endx->inst->getMnemonic() == Mnemonic_CALL && !opline.isDef(endx->inst))
@@ -1442,45 +1423,6 @@
// Load operand from memory to 'opnd' at the poinr 'instx'
//
-#ifdef _OLD_
-void SpillGen::loadOpnd (Opline& opline, Instx* instx, Opnd* opnd)
-{
- if (opline.save_instx == 0)
- return;
-
- if (!opline.isUse(instx->inst))
- return;
-
- if (opline.save_opnd->hasAssignedPhysicalLocation())
- {
- opndMem(opline);
- if (opline.save_changed)
- {
- emitMove(opline.save_before,
- opline.save_instx->inst,
- opline.opnd_mem,
- opline.save_opnd);
- if (opline.save_regmsk != 0)
- opline.save_instx->regusage[opline.save_regidx] |= opline.save_regmsk;
- opline.save_changed = false;
- }
- emitMove(true, instx->inst, opnd, opline.opnd_mem);
- }
- else
- {
- if (opnd->hasAssignedPhysicalLocation())
- {// Assigned <- UnAssigned
- emitMove(true, instx->inst, opnd, opline.save_opnd);
- }
- else
- {// UnAssigned <- UnAssigned
- assert(opnd == opline.save_opnd);
- opline.save_opnd = opnd;
- opline.save_instx = instx;
- }
- }
-}
-#else
bool SpillGen::loadOpnd (Opline& opline, Instx* instx, Opnd* opnd)
{
if (opline.save_instx == 0 || !opline.isUse(instx->inst))
@@ -1516,7 +1458,6 @@
}
return true;
}
-#endif
// Save operand to memory
@@ -1751,18 +1692,6 @@
assert((usable & mk));
Instx* ptrx;
-#ifdef _OLD_
- for (ptrx = evict->begx; ptrx <= evict->endx; ++ptrx)
- {
- // mark register assigned to the operand as free
- ptrx->regusage[idx] &= ~mk;
-
- // clear the operand as a candidate to evict
- killEvict(evict->opnd, ptrx);
- }
- if (ptrx <= &instxs.back())
- ptrx->regusage[idx] |= mk;
-#else
for (ptrx = evict->begx; ptrx <= evict->endx; ++ptrx)
{
// mark register assigned to the operand as free
@@ -1772,7 +1701,6 @@
// clear the operand as a candidate to evict
killEvict(evict->opnd, ptrx);
}
-#endif
return rn;
}
@@ -1815,7 +1743,6 @@
merge(used[idx], msk);
}
}
-
if (inst->hasKind(Inst::Kind_CallInst) && lives_catch != 0)
{
if (catched == 0)
@@ -1835,7 +1762,6 @@
}
used.merge(*catched);
}
-
if (inst == instxp->inst)
{
if (instxp->evicts == 0)