mirror of
https://github.com/corda/corda.git
synced 2025-02-15 23:22:54 +00:00
avoid unnecessary moves in resolveJunctionSite; distinguish between branches and other events when deciding when to marshal values at junctions
This commit is contained in:
parent
f6c4496166
commit
83d5d6fde4
@ -3881,7 +3881,7 @@ finish(MyThread* t, Context* context)
|
|||||||
strcmp
|
strcmp
|
||||||
(reinterpret_cast<const char*>
|
(reinterpret_cast<const char*>
|
||||||
(&byteArrayBody(t, methodName(t, context->method), 0)),
|
(&byteArrayBody(t, methodName(t, context->method), 0)),
|
||||||
"getName") == 0)
|
"replace") == 0)
|
||||||
{
|
{
|
||||||
asm("int3");
|
asm("int3");
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ const bool DebugAppend = true;
|
|||||||
const bool DebugCompile = true;
|
const bool DebugCompile = true;
|
||||||
const bool DebugStack = false;
|
const bool DebugStack = false;
|
||||||
const bool DebugRegisters = true;
|
const bool DebugRegisters = true;
|
||||||
const bool DebugFrameIndexes = false;
|
const bool DebugFrameIndexes = true;
|
||||||
|
|
||||||
const int AnyFrameIndex = -2;
|
const int AnyFrameIndex = -2;
|
||||||
const int NoFrameIndex = -1;
|
const int NoFrameIndex = -1;
|
||||||
@ -506,6 +506,8 @@ class Event {
|
|||||||
|
|
||||||
virtual void compilePostsync(Context*) { }
|
virtual void compilePostsync(Context*) { }
|
||||||
|
|
||||||
|
virtual bool isBranch() { return false; }
|
||||||
|
|
||||||
Event* next;
|
Event* next;
|
||||||
Stack* stackBefore;
|
Stack* stackBefore;
|
||||||
Local* localsBefore;
|
Local* localsBefore;
|
||||||
@ -1635,8 +1637,6 @@ validate(Context* c, uint32_t mask, Stack* stack, Local* locals,
|
|||||||
current->value = value;
|
current->value = value;
|
||||||
current->site = site;
|
current->site = site;
|
||||||
return current;
|
return current;
|
||||||
} else {
|
|
||||||
removeSite(c, current->value, current->site);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2565,6 +2565,8 @@ class BranchEvent: public Event {
|
|||||||
nextRead(c, this, address);
|
nextRead(c, this, address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual bool isBranch() { return true; }
|
||||||
|
|
||||||
UnaryOperation type;
|
UnaryOperation type;
|
||||||
Value* address;
|
Value* address;
|
||||||
};
|
};
|
||||||
@ -2775,7 +2777,7 @@ resolveJunctionSite(Context* c, Event* e, Value* v, unsigned index,
|
|||||||
Site* target = e->junctionSites[index];
|
Site* target = e->junctionSites[index];
|
||||||
unsigned copyCost;
|
unsigned copyCost;
|
||||||
Site* site = pick(c, v->sites, target, ©Cost);
|
Site* site = pick(c, v->sites, target, ©Cost);
|
||||||
if (v->visited or copyCost) {
|
if ((v->visited and target->type(c) == RegisterOperand) or copyCost) {
|
||||||
move(c, e->stackAfter, e->localsAfter, r->size, v, site, target);
|
move(c, e->stackAfter, e->localsAfter, r->size, v, site, target);
|
||||||
} else {
|
} else {
|
||||||
target = site;
|
target = site;
|
||||||
@ -2931,7 +2933,8 @@ setSites(Context* c, Event* e, Site** sites)
|
|||||||
if (live(v)) {
|
if (live(v)) {
|
||||||
// fprintf(stderr, "set sites %p for %p at %d\n", sites[i], v, i);
|
// fprintf(stderr, "set sites %p for %p at %d\n", sites[i], v, i);
|
||||||
|
|
||||||
addSite(c, 0, 0, v->reads->size, v, sites[i]);
|
addSite(c, e->stackBefore, e->localsBefore, v->reads->size, v,
|
||||||
|
sites[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2944,7 +2947,8 @@ setSites(Context* c, Event* e, Site** sites)
|
|||||||
if (live(v)) {
|
if (live(v)) {
|
||||||
// fprintf(stderr, "set sites %p for %p at %d\n", sites[i], v, i);
|
// fprintf(stderr, "set sites %p for %p at %d\n", sites[i], v, i);
|
||||||
|
|
||||||
addSite(c, 0, 0, v->reads->size, v, sites[i]);
|
addSite(c, e->stackBefore, e->localsBefore, v->reads->size, v,
|
||||||
|
sites[i]);
|
||||||
}
|
}
|
||||||
i -= stack->size;
|
i -= stack->size;
|
||||||
}
|
}
|
||||||
@ -3120,9 +3124,14 @@ compile(Context* c)
|
|||||||
|
|
||||||
populateSources(c, e);
|
populateSources(c, e);
|
||||||
|
|
||||||
|
bool branch = e->isBranch();
|
||||||
|
if (branch and e->successors) {
|
||||||
|
populateSiteTables(c, e);
|
||||||
|
}
|
||||||
|
|
||||||
e->compile(c);
|
e->compile(c);
|
||||||
|
|
||||||
if (e->successors) {
|
if ((not branch) and e->successors) {
|
||||||
populateSiteTables(c, e);
|
populateSiteTables(c, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user