Skip to content

Commit f386319

Browse files
committed
Merge binary/comparison operations folding in SCCP
This unified the constant folding logic for binary operations (add, sub, mul) and comparison operations (eq, neq, lt, leq, gt, geq) into a single case statement.
1 parent 9091e24 commit f386319

File tree

1 file changed

+9
-32
lines changed

1 file changed

+9
-32
lines changed

src/opt-sccp.c

Lines changed: 9 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -112,13 +112,19 @@ bool simple_sccp(func_t *func)
112112
case OP_add:
113113
case OP_sub:
114114
case OP_mul:
115-
/* Fold binary operations with constants */
115+
case OP_eq:
116+
case OP_neq:
117+
case OP_lt:
118+
case OP_leq:
119+
case OP_gt:
120+
case OP_geq:
121+
/* Unified constant folding for binary and comparison ops */
116122
if (insn->rs1 && insn->rs1->is_const && insn->rs2 &&
117-
insn->rs2->is_const &&
118-
!insn->rd->is_global) { /* Don't modify globals */
123+
insn->rs2->is_const && !insn->rd->is_global) {
119124
int result = 0;
120125
int l = insn->rs1->init_val, r = insn->rs2->init_val;
121126

127+
/* Compute result based on operation type */
122128
switch (insn->opcode) {
123129
case OP_add:
124130
result = l + r;
@@ -129,35 +135,6 @@ bool simple_sccp(func_t *func)
129135
case OP_mul:
130136
result = l * r;
131137
break;
132-
default:
133-
continue;
134-
}
135-
136-
/* Convert to constant load */
137-
insn->opcode = OP_load_constant;
138-
insn->rd->is_const = true;
139-
insn->rd->init_val = result;
140-
insn->rs1 = NULL;
141-
insn->rs2 = NULL;
142-
changed = true;
143-
}
144-
break;
145-
146-
case OP_eq:
147-
case OP_neq:
148-
case OP_lt:
149-
case OP_leq:
150-
case OP_gt:
151-
case OP_geq:
152-
/* Fold comparison operations */
153-
if (insn->rs1 && insn->rs1->is_const && insn->rs2 &&
154-
insn->rs2->is_const &&
155-
!insn->rd->is_global) { /* Don't modify globals */
156-
int result = 0;
157-
int l = insn->rs1->init_val;
158-
int r = insn->rs2->init_val;
159-
160-
switch (insn->opcode) {
161138
case OP_eq:
162139
result = (l == r);
163140
break;

0 commit comments

Comments
 (0)