From f4689093eedfc27924652ef90f88452225cd1fab Mon Sep 17 00:00:00 2001 From: Joel Dice Date: Sun, 4 Jan 2009 13:35:09 -0700 Subject: [PATCH] try harder to find an acceptable source site in resolveSourceJunctionSites --- src/compiler.cpp | 58 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/src/compiler.cpp b/src/compiler.cpp index b3790afefe..71abd04f1a 100644 --- a/src/compiler.cpp +++ b/src/compiler.cpp @@ -101,6 +101,8 @@ class Site { virtual void thaw(Context*, Value*, unsigned) { } + virtual bool frozen(Context*, unsigned) { return false; } + virtual bool usesRegister(Context*, int) { return false; } virtual OperandType type(Context*) = 0; @@ -1049,7 +1051,7 @@ frameCost(Context* c, Value* v, int frameIndex, unsigned size) highCost = 0; } - return lowCost + highCost; + return lowCost + highCost + 1; } Target @@ -1353,6 +1355,12 @@ class RegisterSite: public Site { } } + virtual bool frozen(Context* c UNUSED, unsigned size) { + assert(c, low); + + return low->freezeCount or (size > BytesPerWord and high->freezeCount); + } + virtual bool usesRegister(Context* c, int r) { sync(c); return register_.low == r or register_.high == r; @@ -1552,6 +1560,17 @@ class MemorySite: public Site { } } + virtual bool frozen(Context* c, unsigned size) { + if (value.base == c->arch->stack()) { + FrameResource* low = c->frameResources + + offsetToFrameIndex(c, value.offset); + + return low->freezeCount or (size > BytesPerWord and low[1].freezeCount); + } else { + return false; + } + } + virtual bool usesRegister(Context* c, int r) { sync(c); return value.base == r or value.index == r; @@ -3427,22 +3446,25 @@ append(Context* c, Event* e) } Site* -pickSourceSite(Context* c, Read* read, Value* value, Site* target = 0, - unsigned* cost = 0, uint8_t typeMask = ~static_cast(0), - bool includeBuddies = true) +pickSourceSite(Context* c, Read* read, Site* target = 0, + unsigned* cost = 0, uint8_t typeMask = ~0, + bool includeBuddies = true, bool includeFrozen = true, + bool intersectRead = true) { uint64_t registerMask = ~static_cast(0); int frameIndex = AnyFrameIndex; - if (read) { + if (intersectRead) { read->intersect(&typeMask, ®isterMask, &frameIndex); } Site* site = 0; unsigned copyCost = 0xFFFFFFFF; - for (SiteIterator it(value, includeBuddies); it.hasMore();) { + for (SiteIterator it(read->value, includeBuddies); it.hasMore();) { Site* s = it.next(); - if (s->match(c, typeMask, registerMask, frameIndex)) { + if ((includeFrozen or not s->frozen(c, read->size)) + and s->match(c, typeMask, registerMask, frameIndex)) + { unsigned v = s->copyCost(c, target); if (v < copyCost) { site = s; @@ -3455,19 +3477,13 @@ pickSourceSite(Context* c, Read* read, Value* value, Site* target = 0, char srcb[256]; site->toString(c, srcb, 256); char dstb[256]; target->toString(c, dstb, 256); fprintf(stderr, "pick source %s to %s for %p cost %d\n", - srcb, dstb, value, copyCost); + srcb, dstb, read->value, copyCost); } if (cost) *cost = copyCost; return site; } -Site* -pickSourceSite(Context* c, Read* read) -{ - return pickSourceSite(c, read, read->value); -} - Site* readSource(Context* c, Stack* stack, Local* locals, Read* r) { @@ -3485,7 +3501,7 @@ readSource(Context* c, Stack* stack, Local* locals, Read* r) } else { Site* target = pickTargetSite(c, r, true); unsigned copyCost; - site = pickSourceSite(c, 0, r->value, target, ©Cost); + site = pickSourceSite(c, r, target, ©Cost, ~0, true, true, false); assert(c, copyCost); move(c, stack, locals, r->size, r->value, site, target); return target; @@ -3553,7 +3569,7 @@ acquireJunctionSite(Context* c, Event* e, Site* target, Value* v, assert(c, hasSite(v)); unsigned copyCost; - Site* site = pickSourceSite(c, 0, v, target, ©Cost); + Site* site = pickSourceSite(c, r, target, ©Cost, ~0, true, true, false); if (copyCost) { target = target->copy(c); @@ -3606,9 +3622,15 @@ resolveSourceJunctionSites(Context* c, Event* e, SiteRecord* frozenSites, if (r and e->junctionSites[el.localIndex] == 0) { const uint32_t mask = (1 << RegisterOperand) | (1 << MemoryOperand); - Site* s = pickSourceSite(c, r, v, 0, 0, mask, false); + Site* s = pickSourceSite(c, r, 0, 0, mask, false, false, true); if (s == 0) { - s = pickSourceSite(c, 0, v, 0, 0, mask, false); + s = pickSourceSite(c, r, 0, 0, mask, false, false, false); + if (s == 0) { + s = pickSourceSite(c, r, 0, 0, mask, true, false, true); + if (s == 0) { + s = pickSourceSite(c, r, 0, 0, mask, true, false, false); + } + } } if (s) {