summaryrefslogtreecommitdiff
path: root/src/compiler/codegen/RallocUtil.cc
diff options
context:
space:
mode:
author buzbee <buzbee@google.com> 2011-09-11 15:25:43 -0700
committer buzbee <buzbee@google.com> 2011-09-11 18:14:46 -0700
commitec5adf351879cb6235faf2c6c068c2553d85a7d2 (patch)
treef3f8e9ab69690e729a523188468d7150ede27bf7 /src/compiler/codegen/RallocUtil.cc
parent005ab2eb9e9ab4762c00e73c7028de2850bd5108 (diff)
Mark top of managed stack on helper transitions
To assist with unwind from a helper function, store current SP prior to helper call in Thread. NOTE: we may wish to push this into a trampoline to reduce code expansion. NOTE #2: Because any helper function which can throw will be non-leaf, it will spill lr at the saved address - 4 (the word immediately below caller's Method*). To identify the callsite, load the spilled lr, clear the low bit, subtract 2, and use that address in the native <-> dalvik mapping to identify the callsite. Also in this CL are a ralloc fix and some extra SSA logging. Change-Id: Idd442f0c55413a5146c24709b1db1150604f4554
Diffstat (limited to 'src/compiler/codegen/RallocUtil.cc')
-rw-r--r--src/compiler/codegen/RallocUtil.cc32
1 files changed, 28 insertions, 4 deletions
diff --git a/src/compiler/codegen/RallocUtil.cc b/src/compiler/codegen/RallocUtil.cc
index 1fe680f2d8..76cff17648 100644
--- a/src/compiler/codegen/RallocUtil.cc
+++ b/src/compiler/codegen/RallocUtil.cc
@@ -833,7 +833,11 @@ static void copyRegInfo(CompilationUnit* cUnit, int newReg, int oldReg)
{
RegisterInfo* newInfo = getRegInfo(cUnit, newReg);
RegisterInfo* oldInfo = getRegInfo(cUnit, oldReg);
+ // Target temp status must not change
+ bool isTemp = newInfo->isTemp;
*newInfo = *oldInfo;
+ // Restore target's temp status
+ newInfo->isTemp = isTemp;
newInfo->reg = newReg;
}
@@ -1011,7 +1015,12 @@ extern RegLocation oatGetDest(CompilationUnit* cUnit, MIR* mir, int num)
{
RegLocation res = cUnit->regLocation[mir->ssaRep->defs[num]];
#ifdef SSA_WORKAROUND
- res.wide = false;
+ if (res.wide) {
+ LOG(WARNING) << "Invalid SSA renaming: " << PrettyMethod(cUnit->method);
+ cUnit->printMe = true;
+ cUnit->dumpCFG = true;
+ res.wide = false;
+ }
#endif
assert(!res.wide);
return res;
@@ -1020,7 +1029,12 @@ extern RegLocation oatGetSrc(CompilationUnit* cUnit, MIR* mir, int num)
{
RegLocation res = cUnit->regLocation[mir->ssaRep->uses[num]];
#ifdef SSA_WORKAROUND
- res.wide = false;
+ if (res.wide) {
+ LOG(WARNING) << "Invalid SSA renaming: " << PrettyMethod(cUnit->method);
+ cUnit->printMe = true;
+ cUnit->dumpCFG = true;
+ res.wide = false;
+ }
#endif
assert(!res.wide);
return res;
@@ -1035,7 +1049,12 @@ extern RegLocation oatGetDestWide(CompilationUnit* cUnit, MIR* mir,
{
RegLocation res = cUnit->regLocation[mir->ssaRep->defs[low]];
#ifdef SSA_WORKAROUND
- res.wide = true;
+ if (!res.wide) {
+ LOG(WARNING) << "Invalid SSA renaming: " << PrettyMethod(cUnit->method);
+ cUnit->printMe = true;
+ cUnit->dumpCFG = true;
+ res.wide = true;
+ }
#endif
assert(res.wide);
return res;
@@ -1046,7 +1065,12 @@ extern RegLocation oatGetSrcWide(CompilationUnit* cUnit, MIR* mir,
{
RegLocation res = cUnit->regLocation[mir->ssaRep->uses[low]];
#ifdef SSA_WORKAROUND
- res.wide = true;
+ if (!res.wide) {
+ LOG(WARNING) << "Invalid SSA renaming: " << PrettyMethod(cUnit->method);
+ cUnit->printMe = true;
+ cUnit->dumpCFG = true;
+ res.wide = true;
+ }
#endif
assert(res.wide);
return res;