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)
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+
13741448bool 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
You can’t perform that action at this time.
0 commit comments