clean up bytecode

This commit is contained in:
2026-02-13 09:03:00 -06:00
parent 0acaabd5fa
commit 3795533554
14 changed files with 23087 additions and 29051 deletions

View File

@@ -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" ||