clean up bytecode
This commit is contained in:
233
streamline.cm
233
streamline.cm
@@ -35,14 +35,6 @@ var streamline = function(ir, log) {
|
||||
var T_FUNCTION = "function"
|
||||
var T_BLOB = "blob"
|
||||
|
||||
var int_result_ops = {
|
||||
add_int: true, sub_int: true, mul_int: true,
|
||||
div_int: true, mod_int: true
|
||||
}
|
||||
var float_result_ops = {
|
||||
add_float: true, sub_float: true, mul_float: true,
|
||||
div_float: true, mod_float: true
|
||||
}
|
||||
var numeric_ops = {
|
||||
add: true, subtract: true, multiply: true,
|
||||
divide: true, modulo: true, pow: true
|
||||
@@ -141,10 +133,6 @@ var streamline = function(ir, log) {
|
||||
} else if (op == "move") {
|
||||
src_type = slot_types[text(instr[2])]
|
||||
slot_types[text(instr[1])] = src_type != null ? src_type : T_UNKNOWN
|
||||
} else if (int_result_ops[op] == true) {
|
||||
slot_types[text(instr[1])] = T_INT
|
||||
} else if (float_result_ops[op] == true) {
|
||||
slot_types[text(instr[1])] = T_FLOAT
|
||||
} else if (op == "concat") {
|
||||
slot_types[text(instr[1])] = T_TEXT
|
||||
} else if (bool_result_ops[op] == true) {
|
||||
@@ -163,11 +151,7 @@ var streamline = function(ir, log) {
|
||||
slot_types[text(instr[1])] = T_FUNCTION
|
||||
} else if (op == "length") {
|
||||
slot_types[text(instr[1])] = T_INT
|
||||
} else if (op == "negate" || op == "neg_int") {
|
||||
slot_types[text(instr[1])] = T_UNKNOWN
|
||||
} else if (op == "neg_float") {
|
||||
slot_types[text(instr[1])] = T_FLOAT
|
||||
} else if (numeric_ops[op] == true) {
|
||||
} else if (op == "negate" || numeric_ops[op] == true) {
|
||||
slot_types[text(instr[1])] = T_UNKNOWN
|
||||
} else if (op == "bitnot" || op == "bitand" || op == "bitor" ||
|
||||
op == "bitxor" || op == "shl" || op == "shr" || op == "ushr") {
|
||||
@@ -262,30 +246,24 @@ var streamline = function(ir, log) {
|
||||
instr = instructions[i]
|
||||
if (is_array(instr)) {
|
||||
op = instr[0]
|
||||
if (op == "add_int" || op == "sub_int" || op == "mul_int" ||
|
||||
op == "div_int" || op == "mod_int" ||
|
||||
op == "eq_int" || op == "ne_int" || op == "lt_int" ||
|
||||
op == "gt_int" || op == "le_int" || op == "ge_int" ||
|
||||
op == "bitand" || op == "bitor" || op == "bitxor" ||
|
||||
op == "shl" || op == "shr" || op == "ushr") {
|
||||
merge_backward(backward_types, instr[2], T_INT)
|
||||
merge_backward(backward_types, instr[3], T_INT)
|
||||
} else if (op == "neg_int" || op == "bitnot") {
|
||||
merge_backward(backward_types, instr[2], T_INT)
|
||||
} else if (op == "subtract" || op == "multiply" ||
|
||||
op == "divide" || op == "modulo" || op == "pow") {
|
||||
if (op == "subtract" || op == "multiply" ||
|
||||
op == "divide" || op == "modulo" || op == "pow") {
|
||||
merge_backward(backward_types, instr[2], T_NUM)
|
||||
merge_backward(backward_types, instr[3], T_NUM)
|
||||
} else if (op == "negate") {
|
||||
merge_backward(backward_types, instr[2], T_NUM)
|
||||
} else if (op == "add_float" || op == "sub_float" || op == "mul_float" ||
|
||||
op == "div_float" || op == "mod_float" ||
|
||||
op == "eq_float" || op == "ne_float" || op == "lt_float" ||
|
||||
} else if (op == "eq_int" || op == "ne_int" || op == "lt_int" ||
|
||||
op == "gt_int" || op == "le_int" || op == "ge_int" ||
|
||||
op == "bitand" || op == "bitor" || op == "bitxor" ||
|
||||
op == "shl" || op == "shr" || op == "ushr") {
|
||||
merge_backward(backward_types, instr[2], T_INT)
|
||||
merge_backward(backward_types, instr[3], T_INT)
|
||||
} else if (op == "bitnot") {
|
||||
merge_backward(backward_types, instr[2], T_INT)
|
||||
} else if (op == "eq_float" || op == "ne_float" || op == "lt_float" ||
|
||||
op == "gt_float" || op == "le_float" || op == "ge_float") {
|
||||
merge_backward(backward_types, instr[2], T_FLOAT)
|
||||
merge_backward(backward_types, instr[3], T_FLOAT)
|
||||
} else if (op == "neg_float") {
|
||||
merge_backward(backward_types, instr[2], T_FLOAT)
|
||||
} else if (op == "concat" ||
|
||||
op == "eq_text" || op == "ne_text" || op == "lt_text" ||
|
||||
op == "gt_text" || op == "le_text" || op == "ge_text") {
|
||||
@@ -393,20 +371,11 @@ var streamline = function(ir, log) {
|
||||
} else if (op == "length") {
|
||||
slot = instr[1]
|
||||
typ = T_INT
|
||||
} else if (int_result_ops[op] == true) {
|
||||
slot = instr[1]
|
||||
typ = T_INT
|
||||
} else if (float_result_ops[op] == true) {
|
||||
slot = instr[1]
|
||||
typ = T_FLOAT
|
||||
} else if (op == "neg_int" || op == "bitnot" || op == "bitand" ||
|
||||
} else if (op == "bitnot" || op == "bitand" ||
|
||||
op == "bitor" || op == "bitxor" || op == "shl" ||
|
||||
op == "shr" || op == "ushr") {
|
||||
slot = instr[1]
|
||||
typ = T_INT
|
||||
} else if (op == "neg_float") {
|
||||
slot = instr[1]
|
||||
typ = T_FLOAT
|
||||
} else if (op == "negate") {
|
||||
slot = instr[1]
|
||||
typ = T_UNKNOWN
|
||||
@@ -764,11 +733,8 @@ var streamline = function(ir, log) {
|
||||
var instr = null
|
||||
var op = null
|
||||
var ilen = 0
|
||||
var v2 = null
|
||||
var v3 = null
|
||||
var sv = null
|
||||
var events = null
|
||||
var rule = null
|
||||
|
||||
if (instructions == null || length(instructions) == 0) {
|
||||
return null
|
||||
@@ -816,179 +782,6 @@ var streamline = function(ir, log) {
|
||||
}
|
||||
}
|
||||
|
||||
// Integer: x+0, x-0 → move x
|
||||
if (op == "add_int" || op == "sub_int") {
|
||||
v3 = slot_values[text(instr[3])]
|
||||
if (v3 == 0) {
|
||||
rule = op == "add_int" ? "add_zero" : "sub_zero"
|
||||
instructions[i] = ["move", instr[1], instr[2], instr[ilen - 2], instr[ilen - 1]]
|
||||
if (events != null) {
|
||||
events[] = {
|
||||
event: "rewrite", pass: "simplify_algebra",
|
||||
rule: rule, at: i,
|
||||
before: instr, after: instructions[i],
|
||||
why: {slot: instr[3], value: 0}
|
||||
}
|
||||
}
|
||||
i = i + 1
|
||||
continue
|
||||
}
|
||||
if (op == "add_int") {
|
||||
v2 = slot_values[text(instr[2])]
|
||||
if (v2 == 0) {
|
||||
instructions[i] = ["move", instr[1], instr[3], instr[ilen - 2], instr[ilen - 1]]
|
||||
if (events != null) {
|
||||
events[] = {
|
||||
event: "rewrite", pass: "simplify_algebra",
|
||||
rule: "add_zero", at: i,
|
||||
before: instr, after: instructions[i],
|
||||
why: {slot: instr[2], value: 0}
|
||||
}
|
||||
}
|
||||
i = i + 1
|
||||
continue
|
||||
}
|
||||
}
|
||||
} else if (op == "mul_int") {
|
||||
v3 = slot_values[text(instr[3])]
|
||||
v2 = slot_values[text(instr[2])]
|
||||
if (v3 == 1) {
|
||||
instructions[i] = ["move", instr[1], instr[2], instr[ilen - 2], instr[ilen - 1]]
|
||||
if (events != null) {
|
||||
events[] = {
|
||||
event: "rewrite", pass: "simplify_algebra",
|
||||
rule: "mul_one", at: i,
|
||||
before: instr, after: instructions[i],
|
||||
why: {slot: instr[3], value: 1}
|
||||
}
|
||||
}
|
||||
i = i + 1
|
||||
continue
|
||||
}
|
||||
if (v2 == 1) {
|
||||
instructions[i] = ["move", instr[1], instr[3], instr[ilen - 2], instr[ilen - 1]]
|
||||
if (events != null) {
|
||||
events[] = {
|
||||
event: "rewrite", pass: "simplify_algebra",
|
||||
rule: "mul_one", at: i,
|
||||
before: instr, after: instructions[i],
|
||||
why: {slot: instr[2], value: 1}
|
||||
}
|
||||
}
|
||||
i = i + 1
|
||||
continue
|
||||
}
|
||||
if (v3 == 0 || v2 == 0) {
|
||||
instructions[i] = ["int", instr[1], 0, instr[ilen - 2], instr[ilen - 1]]
|
||||
if (events != null) {
|
||||
events[] = {
|
||||
event: "rewrite", pass: "simplify_algebra",
|
||||
rule: "mul_zero", at: i,
|
||||
before: instr, after: instructions[i],
|
||||
why: {value: 0}
|
||||
}
|
||||
}
|
||||
slot_values[text(instr[1])] = 0
|
||||
i = i + 1
|
||||
continue
|
||||
}
|
||||
} else if (op == "div_int") {
|
||||
v3 = slot_values[text(instr[3])]
|
||||
if (v3 == 1) {
|
||||
instructions[i] = ["move", instr[1], instr[2], instr[ilen - 2], instr[ilen - 1]]
|
||||
if (events != null) {
|
||||
events[] = {
|
||||
event: "rewrite", pass: "simplify_algebra",
|
||||
rule: "div_one", at: i,
|
||||
before: instr, after: instructions[i],
|
||||
why: {slot: instr[3], value: 1}
|
||||
}
|
||||
}
|
||||
i = i + 1
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
// Float: x+0, x-0 → move x; x*1, x/1 → move x
|
||||
// (skip mul_float * 0 — not safe with NaN/Inf)
|
||||
if (op == "add_float" || op == "sub_float") {
|
||||
v3 = slot_values[text(instr[3])]
|
||||
if (v3 == 0) {
|
||||
rule = op == "add_float" ? "add_zero" : "sub_zero"
|
||||
instructions[i] = ["move", instr[1], instr[2], instr[ilen - 2], instr[ilen - 1]]
|
||||
if (events != null) {
|
||||
events[] = {
|
||||
event: "rewrite", pass: "simplify_algebra",
|
||||
rule: rule, at: i,
|
||||
before: instr, after: instructions[i],
|
||||
why: {slot: instr[3], value: 0}
|
||||
}
|
||||
}
|
||||
i = i + 1
|
||||
continue
|
||||
}
|
||||
if (op == "add_float") {
|
||||
v2 = slot_values[text(instr[2])]
|
||||
if (v2 == 0) {
|
||||
instructions[i] = ["move", instr[1], instr[3], instr[ilen - 2], instr[ilen - 1]]
|
||||
if (events != null) {
|
||||
events[] = {
|
||||
event: "rewrite", pass: "simplify_algebra",
|
||||
rule: "add_zero", at: i,
|
||||
before: instr, after: instructions[i],
|
||||
why: {slot: instr[2], value: 0}
|
||||
}
|
||||
}
|
||||
i = i + 1
|
||||
continue
|
||||
}
|
||||
}
|
||||
} else if (op == "mul_float") {
|
||||
v3 = slot_values[text(instr[3])]
|
||||
v2 = slot_values[text(instr[2])]
|
||||
if (v3 == 1) {
|
||||
instructions[i] = ["move", instr[1], instr[2], instr[ilen - 2], instr[ilen - 1]]
|
||||
if (events != null) {
|
||||
events[] = {
|
||||
event: "rewrite", pass: "simplify_algebra",
|
||||
rule: "mul_one", at: i,
|
||||
before: instr, after: instructions[i],
|
||||
why: {slot: instr[3], value: 1}
|
||||
}
|
||||
}
|
||||
i = i + 1
|
||||
continue
|
||||
}
|
||||
if (v2 == 1) {
|
||||
instructions[i] = ["move", instr[1], instr[3], instr[ilen - 2], instr[ilen - 1]]
|
||||
if (events != null) {
|
||||
events[] = {
|
||||
event: "rewrite", pass: "simplify_algebra",
|
||||
rule: "mul_one", at: i,
|
||||
before: instr, after: instructions[i],
|
||||
why: {slot: instr[2], value: 1}
|
||||
}
|
||||
}
|
||||
i = i + 1
|
||||
continue
|
||||
}
|
||||
} else if (op == "div_float") {
|
||||
v3 = slot_values[text(instr[3])]
|
||||
if (v3 == 1) {
|
||||
instructions[i] = ["move", instr[1], instr[2], instr[ilen - 2], instr[ilen - 1]]
|
||||
if (events != null) {
|
||||
events[] = {
|
||||
event: "rewrite", pass: "simplify_algebra",
|
||||
rule: "div_one", at: i,
|
||||
before: instr, after: instructions[i],
|
||||
why: {slot: instr[3], value: 1}
|
||||
}
|
||||
}
|
||||
i = i + 1
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
// Same-slot comparisons
|
||||
if (is_number(instr[2]) && instr[2] == instr[3]) {
|
||||
if (op == "eq_int" || op == "eq_float" || op == "eq_text" ||
|
||||
|
||||
Reference in New Issue
Block a user