File tree Expand file tree Collapse file tree 1 file changed +76
-0
lines changed Expand file tree Collapse file tree 1 file changed +76
-0
lines changed Original file line number Diff line number Diff line change @@ -1354,11 +1354,54 @@ bool eval_const_arithmetic(insn_t *insn)
1354
1354
res = l * r ;
1355
1355
break ;
1356
1356
case OP_div :
1357
+ if (r == 0 )
1358
+ return false; /* avoid division by zero */
1357
1359
res = l / r ;
1358
1360
break ;
1359
1361
case OP_mod :
1362
+ if (r == 0 )
1363
+ return false; /* avoid modulo by zero */
1360
1364
res = l % r ;
1361
1365
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 ;
1362
1405
default :
1363
1406
return false;
1364
1407
}
@@ -1371,12 +1414,45 @@ bool eval_const_arithmetic(insn_t *insn)
1371
1414
return true;
1372
1415
}
1373
1416
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
+
1374
1448
bool const_folding (insn_t * insn )
1375
1449
{
1376
1450
if (mark_const (insn ))
1377
1451
return true;
1378
1452
if (eval_const_arithmetic (insn ))
1379
1453
return true;
1454
+ if (eval_const_unary (insn ))
1455
+ return true;
1380
1456
return false;
1381
1457
}
1382
1458
You can’t perform that action at this time.
0 commit comments