further refactoring of phi, and work towards optimized phi

This commit is contained in:
Alon Zakai 2011-11-18 10:47:52 -08:00
Родитель 846c77ae55
Коммит 1c2bf36059
2 изменённых файлов: 51 добавлений и 23 удалений

Просмотреть файл

@ -621,19 +621,15 @@ function analyzer(data) {
// we need __lastLabel__.
func.needsLastLabel = false;
func.labels.forEach(function(label) {
var phis = [];
var phis = [], phi;
label.lines.forEach(function(line) {
if (line.value && line.value.intertype == 'phi') {
for (var i = 0; i < line.value.params.length; i++) {
var remarkableLabelId = line.value.params[i].label;
var remarkableLabel = func.labelsDict[remarkableLabelId];
assert(remarkableLabel);
var lastLine = remarkableLabel.lines.slice(-1)[0];
if (lastLine.intertype === 'assign') {
lastLine.value.currLabelId = remarkableLabelId;
} else {
lastLine.currLabelId = remarkableLabelId;
}
if ((phi = line.value) && phi.intertype == 'phi') {
for (var i = 0; i < phi.params.length; i++) {
var sourceLabelId = phi.params[i].label;
var sourceLabel = func.labelsDict[sourceLabelId];
var lastLine = sourceLabel.lines.slice(-1)[0];
assert(lastLine.intertype == 'branch', 'Only branches can lead to labels with phis');
lastLine.currLabelId = sourceLabelId;
}
phis.push(line);
func.needsLastLabel = true;
@ -661,8 +657,36 @@ function analyzer(data) {
}
}
});
} else { // MICRO_OPTS
assert(0, 'TODO');
} else {
// MICRO_OPTS == 1: Properly implement phis, by pushing them back into the branch
// that leads to here. We will only have the |var| definition in this location.
// First, push phis back
func.labels.forEach(function(label) {
label.lines.forEach(function(line) {
var phi;
if ((phi = line.value) && phi.intertype == 'phi') {
for (var i = 0; i < phi.params.length; i++) {
var param = phi.params[i];
var sourceLabelId = param.label;
var sourceLabel = func.labelsDict[sourceLabelId];
var lastLine = sourceLabel.lines.slice(-1)[0];
assert(lastLine.intertype == 'branch', 'Only branches can lead to labels with phis');
if (!lastLine.phi) {
// We store the phi assignments in the branch's params (which are otherwise unused)
lastLine.phi = true;
assert(!lastLine.params);
lastLine.params = [];
};
lastLine.params.push({
intertype: 'phiassign',
ident: line.ident,
value: param.value
});
}
}
});
});
}
});
this.forwardItem(item, 'StackAnalyzer');

Просмотреть файл

@ -671,7 +671,7 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) {
function makeBranch(label, lastLabel, labelIsVariable) {
var pre = '';
if (lastLabel) {
if (!MICRO_OPTS && lastLabel) {
pre = '__lastLabel__ = ' + getLabelId(lastLabel) + '; ';
}
if (label[0] == 'B') {
@ -819,16 +819,20 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) {
});
makeFuncLineActor('phi', function(item) {
var params = item.params;
function makeOne(i) {
if (i === params.length-1) {
return finalizeLLVMParameter(params[i].value);
if (!MICRO_OPTS) {
function makeOne(i) {
if (i === params.length-1) {
return finalizeLLVMParameter(params[i].value);
}
return '__lastLabel__ == ' + getLabelId(params[i].label) + ' ? ' +
finalizeLLVMParameter(params[i].value) + ' : (' + makeOne(i+1) + ')';
}
return '__lastLabel__ == ' + getLabelId(params[i].label) + ' ? ' +
finalizeLLVMParameter(params[i].value) + ' : (' + makeOne(i+1) + ')';
var ret = makeOne(0);
if (item.postSet) ret += item.postSet;
return ret;
} else { // MICRO_OPTS == 1
assert(0, 'TODO');
}
var ret = makeOne(0);
if (item.postSet) ret += item.postSet;
return ret;
});
makeFuncLineActor('mathop', processMathop);