backward inference
This commit is contained in:
@@ -147,7 +147,7 @@ var streamline = function(ir, log) {
|
||||
slot_types[text(instr[1])] = T_BOOL
|
||||
} else if (op == "load_field" || op == "load_index" || op == "load_dynamic") {
|
||||
slot_types[text(instr[1])] = T_UNKNOWN
|
||||
} else if (op == "invoke") {
|
||||
} else if (op == "invoke" || op == "tail_invoke") {
|
||||
slot_types[text(instr[2])] = T_UNKNOWN
|
||||
} else if (op == "pop" || op == "get") {
|
||||
slot_types[text(instr[1])] = T_UNKNOWN
|
||||
@@ -284,6 +284,13 @@ var streamline = function(ir, log) {
|
||||
merge_backward(backward_types, instr[1], T_RECORD)
|
||||
} else if (op == "push") {
|
||||
merge_backward(backward_types, instr[1], T_ARRAY)
|
||||
} else if (op == "load_index") {
|
||||
merge_backward(backward_types, instr[2], T_ARRAY)
|
||||
merge_backward(backward_types, instr[3], T_INT)
|
||||
} else if (op == "load_field") {
|
||||
merge_backward(backward_types, instr[2], T_RECORD)
|
||||
} else if (op == "pop") {
|
||||
merge_backward(backward_types, instr[2], T_ARRAY)
|
||||
}
|
||||
}
|
||||
i = i + 1
|
||||
@@ -867,7 +874,7 @@ var streamline = function(ir, log) {
|
||||
}
|
||||
|
||||
// Clear value tracking for dest-producing ops (not reads-only)
|
||||
if (op == "invoke") {
|
||||
if (op == "invoke" || op == "tail_invoke") {
|
||||
slot_values[text(instr[2])] = null
|
||||
} else if (op != "int" && op != "access" && op != "true" &&
|
||||
op != "false" && op != "move" && op != "null" &&
|
||||
@@ -1050,7 +1057,7 @@ var streamline = function(ir, log) {
|
||||
if (after_return) {
|
||||
nc = nc + 1
|
||||
instructions[i] = "_nop_ur_" + text(nc)
|
||||
} else if (instr[0] == "return" || instr[0] == "disrupt") {
|
||||
} else if (instr[0] == "return") {
|
||||
after_return = true
|
||||
}
|
||||
}
|
||||
@@ -1156,10 +1163,10 @@ var streamline = function(ir, log) {
|
||||
return eliminate_moves(func, log)
|
||||
})
|
||||
if (verify_fn) verify_fn(func, "after eliminate_moves")
|
||||
// NOTE: eliminate_unreachable is disabled because disruption handler
|
||||
// code is placed after return/disrupt without label boundaries.
|
||||
// Re-enable once mcode.cm emits labels for handler entry points.
|
||||
//eliminate_unreachable(func)
|
||||
run_pass(func, "eliminate_unreachable", function() {
|
||||
return eliminate_unreachable(func)
|
||||
})
|
||||
if (verify_fn) verify_fn(func, "after eliminate_unreachable")
|
||||
run_pass(func, "eliminate_dead_jumps", function() {
|
||||
return eliminate_dead_jumps(func, log)
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user