@@ -1750,18 +1750,40 @@ void read_expr_operand(block_t *parent, basic_block_t **bb)
1750
1750
read_expr_operand (parent , bb );
1751
1751
1752
1752
rs1 = opstack_pop ();
1753
- vd = require_var (parent );
1754
- gen_name_to (vd -> var_name );
1755
- opstack_push (vd );
1756
- add_insn (parent , * bb , OP_log_not , vd , rs1 , NULL , 0 , NULL );
1753
+
1754
+ /* Constant folding for logical NOT */
1755
+ if (rs1 && rs1 -> is_const && !rs1 -> ptr_level && !rs1 -> is_global ) {
1756
+ vd = require_var (parent );
1757
+ gen_name_to (vd -> var_name );
1758
+ vd -> is_const = true;
1759
+ vd -> init_val = !rs1 -> init_val ;
1760
+ opstack_push (vd );
1761
+ add_insn (parent , * bb , OP_load_constant , vd , NULL , NULL , 0 , NULL );
1762
+ } else {
1763
+ vd = require_var (parent );
1764
+ gen_name_to (vd -> var_name );
1765
+ opstack_push (vd );
1766
+ add_insn (parent , * bb , OP_log_not , vd , rs1 , NULL , 0 , NULL );
1767
+ }
1757
1768
} else if (lex_accept (T_bit_not )) {
1758
1769
read_expr_operand (parent , bb );
1759
1770
1760
1771
rs1 = opstack_pop ();
1761
- vd = require_var (parent );
1762
- gen_name_to (vd -> var_name );
1763
- opstack_push (vd );
1764
- add_insn (parent , * bb , OP_bit_not , vd , rs1 , NULL , 0 , NULL );
1772
+
1773
+ /* Constant folding for bitwise NOT */
1774
+ if (rs1 && rs1 -> is_const && !rs1 -> ptr_level && !rs1 -> is_global ) {
1775
+ vd = require_var (parent );
1776
+ gen_name_to (vd -> var_name );
1777
+ vd -> is_const = true;
1778
+ vd -> init_val = ~rs1 -> init_val ;
1779
+ opstack_push (vd );
1780
+ add_insn (parent , * bb , OP_load_constant , vd , NULL , NULL , 0 , NULL );
1781
+ } else {
1782
+ vd = require_var (parent );
1783
+ gen_name_to (vd -> var_name );
1784
+ opstack_push (vd );
1785
+ add_insn (parent , * bb , OP_bit_not , vd , rs1 , NULL , 0 , NULL );
1786
+ }
1765
1787
} else if (lex_accept (T_ampersand )) {
1766
1788
handle_address_of_operator (parent , bb );
1767
1789
} else if (lex_accept (T_asterisk )) {
@@ -2179,10 +2201,22 @@ void read_expr_operand(block_t *parent, basic_block_t **bb)
2179
2201
2180
2202
if (is_neg ) {
2181
2203
rs1 = opstack_pop ();
2182
- vd = require_var (parent );
2183
- gen_name_to (vd -> var_name );
2184
- opstack_push (vd );
2185
- add_insn (parent , * bb , OP_negate , vd , rs1 , NULL , 0 , NULL );
2204
+
2205
+ /* Constant folding for negation */
2206
+ if (rs1 && rs1 -> is_const && !rs1 -> ptr_level && !rs1 -> is_global ) {
2207
+ vd = require_var (parent );
2208
+ gen_name_to (vd -> var_name );
2209
+ vd -> is_const = true;
2210
+ vd -> init_val = - rs1 -> init_val ;
2211
+ opstack_push (vd );
2212
+ add_insn (parent , * bb , OP_load_constant , vd , NULL , NULL , 0 ,
2213
+ NULL );
2214
+ } else {
2215
+ vd = require_var (parent );
2216
+ gen_name_to (vd -> var_name );
2217
+ opstack_push (vd );
2218
+ add_insn (parent , * bb , OP_negate , vd , rs1 , NULL , 0 , NULL );
2219
+ }
2186
2220
}
2187
2221
}
2188
2222
}
0 commit comments