Skip to content

Commit c332331

Browse files
committed
Enhance constant propagation and folding
Extended the constant folding optimizer to support a wider range of operations beyond basic arithmetic. Added support for: - Bitwise operations: AND, OR, XOR, left shift, right shift - Comparison operations: ==, \!=, <, <=, >, >= - Logical operations: &&, || - Unary operations: negation, bitwise NOT, logical NOT
1 parent e7267e4 commit c332331

File tree

1 file changed

+96
-6
lines changed

1 file changed

+96
-6
lines changed

src/ssa.c

Lines changed: 96 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1412,6 +1412,7 @@ bool eval_const_arithmetic(insn_t *insn)
14121412
int l = insn->rs1->init_val, r = insn->rs2->init_val;
14131413

14141414
switch (insn->opcode) {
1415+
/* Arithmetic operations */
14151416
case OP_add:
14161417
res = l + r;
14171418
break;
@@ -1422,11 +1423,65 @@ bool eval_const_arithmetic(insn_t *insn)
14221423
res = l * r;
14231424
break;
14241425
case OP_div:
1426+
if (r == 0)
1427+
return false; /* Division by zero protection */
14251428
res = l / r;
14261429
break;
14271430
case OP_mod:
1431+
if (r == 0)
1432+
return false; /* Modulo by zero protection */
14281433
res = l % r;
14291434
break;
1435+
1436+
/* Bitwise operations */
1437+
case OP_bit_and:
1438+
res = l & r;
1439+
break;
1440+
case OP_bit_or:
1441+
res = l | r;
1442+
break;
1443+
case OP_bit_xor:
1444+
res = l ^ r;
1445+
break;
1446+
case OP_lshift:
1447+
if (r < 0 || r >= 32)
1448+
return false; /* Safe shift range */
1449+
res = l << r;
1450+
break;
1451+
case OP_rshift:
1452+
if (r < 0 || r >= 32)
1453+
return false; /* Safe shift range */
1454+
res = l >> r;
1455+
break;
1456+
1457+
/* Comparison operations */
1458+
case OP_eq:
1459+
res = (l == r);
1460+
break;
1461+
case OP_neq:
1462+
res = (l != r);
1463+
break;
1464+
case OP_lt:
1465+
res = (l < r);
1466+
break;
1467+
case OP_leq:
1468+
res = (l <= r);
1469+
break;
1470+
case OP_gt:
1471+
res = (l > r);
1472+
break;
1473+
case OP_geq:
1474+
res = (l >= r);
1475+
break;
1476+
1477+
/* Logical operations */
1478+
case OP_log_and:
1479+
res = (l && r);
1480+
break;
1481+
case OP_log_or:
1482+
res = (l || r);
1483+
break;
1484+
14301485
default:
14311486
return false;
14321487
}
@@ -1439,12 +1494,47 @@ bool eval_const_arithmetic(insn_t *insn)
14391494
return true;
14401495
}
14411496

1497+
bool eval_const_unary(insn_t *insn)
1498+
{
1499+
if (!insn->rs1)
1500+
return false;
1501+
if (!insn->rs1->is_const)
1502+
return false;
1503+
if (insn->rs2) /* Should be unary operation */
1504+
return false;
1505+
1506+
int res;
1507+
int operand = insn->rs1->init_val;
1508+
1509+
switch (insn->opcode) {
1510+
case OP_negate:
1511+
res = -operand;
1512+
break;
1513+
case OP_bit_not:
1514+
res = ~operand;
1515+
break;
1516+
case OP_log_not:
1517+
res = !operand;
1518+
break;
1519+
default:
1520+
return false;
1521+
}
1522+
1523+
insn->rs1 = NULL;
1524+
insn->rd->is_const = 1;
1525+
insn->rd->init_val = res;
1526+
insn->opcode = OP_load_constant;
1527+
return true;
1528+
}
1529+
14421530
bool const_folding(insn_t *insn)
14431531
{
14441532
if (mark_const(insn))
14451533
return true;
14461534
if (eval_const_arithmetic(insn))
14471535
return true;
1536+
if (eval_const_unary(insn))
1537+
return true;
14481538
return false;
14491539
}
14501540

@@ -1984,22 +2074,22 @@ bool enhanced_const_fold(insn_t *insn)
19842074
result = l ^ r;
19852075
break;
19862076
case OP_eq:
1987-
result = (l == r) ? 1 : 0;
2077+
result = (l == r);
19882078
break;
19892079
case OP_neq:
1990-
result = (l != r) ? 1 : 0;
2080+
result = (l != r);
19912081
break;
19922082
case OP_lt:
1993-
result = (l < r) ? 1 : 0;
2083+
result = (l < r);
19942084
break;
19952085
case OP_leq:
1996-
result = (l <= r) ? 1 : 0;
2086+
result = (l <= r);
19972087
break;
19982088
case OP_gt:
1999-
result = (l > r) ? 1 : 0;
2089+
result = (l > r);
20002090
break;
20012091
case OP_geq:
2002-
result = (l >= r) ? 1 : 0;
2092+
result = (l >= r);
20032093
break;
20042094
default:
20052095
return false;

0 commit comments

Comments
 (0)