Skip to content

Commit 70b694f

Browse files
committed
Enhance constant folding optimization
- Add comprehensive constant folding for arithmetic, bitwise, logical, and comparison operations - Include zero-division protection for division and modulo operations - Add unary operation constant folding (negate, bit_not, log_not)
1 parent d6462cc commit 70b694f

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed

src/ssa.c

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1354,11 +1354,54 @@ bool eval_const_arithmetic(insn_t *insn)
13541354
res = l * r;
13551355
break;
13561356
case OP_div:
1357+
if (r == 0)
1358+
return false; /* avoid division by zero */
13571359
res = l / r;
13581360
break;
13591361
case OP_mod:
1362+
if (r == 0)
1363+
return false; /* avoid modulo by zero */
13601364
res = l % r;
13611365
break;
1366+
case OP_lshift:
1367+
res = l << r;
1368+
break;
1369+
case OP_rshift:
1370+
res = l >> r;
1371+
break;
1372+
case OP_bit_and:
1373+
res = l & r;
1374+
break;
1375+
case OP_bit_or:
1376+
res = l | r;
1377+
break;
1378+
case OP_bit_xor:
1379+
res = l ^ r;
1380+
break;
1381+
case OP_log_and:
1382+
res = l && r;
1383+
break;
1384+
case OP_log_or:
1385+
res = l || r;
1386+
break;
1387+
case OP_eq:
1388+
res = l == r;
1389+
break;
1390+
case OP_neq:
1391+
res = l != r;
1392+
break;
1393+
case OP_lt:
1394+
res = l < r;
1395+
break;
1396+
case OP_leq:
1397+
res = l <= r;
1398+
break;
1399+
case OP_gt:
1400+
res = l > r;
1401+
break;
1402+
case OP_geq:
1403+
res = l >= r;
1404+
break;
13621405
default:
13631406
return false;
13641407
}
@@ -1371,12 +1414,45 @@ bool eval_const_arithmetic(insn_t *insn)
13711414
return true;
13721415
}
13731416

1417+
bool eval_const_unary(insn_t *insn)
1418+
{
1419+
if (!insn->rs1)
1420+
return false;
1421+
if (!insn->rs1->is_const)
1422+
return false;
1423+
1424+
int res;
1425+
int val = insn->rs1->init_val;
1426+
1427+
switch (insn->opcode) {
1428+
case OP_negate:
1429+
res = -val;
1430+
break;
1431+
case OP_bit_not:
1432+
res = ~val;
1433+
break;
1434+
case OP_log_not:
1435+
res = !val;
1436+
break;
1437+
default:
1438+
return false;
1439+
}
1440+
1441+
insn->rs1 = NULL;
1442+
insn->rd->is_const = 1;
1443+
insn->rd->init_val = res;
1444+
insn->opcode = OP_load_constant;
1445+
return true;
1446+
}
1447+
13741448
bool const_folding(insn_t *insn)
13751449
{
13761450
if (mark_const(insn))
13771451
return true;
13781452
if (eval_const_arithmetic(insn))
13791453
return true;
1454+
if (eval_const_unary(insn))
1455+
return true;
13801456
return false;
13811457
}
13821458

0 commit comments

Comments
 (0)