@@ -1464,7 +1464,9 @@ IR_FOLD(EQ(SEXT, C_I32))
14641464IR_FOLD (EQ (SEXT , C_I64 ))
14651465IR_FOLD (EQ (SEXT , C_ADDR ))
14661466{
1467- if (op2_insn -> val .u64 == 0 && ctx -> ir_base [op1_insn -> op1 ].type == IR_BOOL ) {
1467+ if (ctx -> use_lists && ctx -> use_lists [op1_insn -> op1 ].count != 1 ) {
1468+ /* pass */
1469+ } else if (op2_insn -> val .u64 == 0 && ctx -> ir_base [op1_insn -> op1 ].type == IR_BOOL ) {
14681470 opt = IR_OPT (IR_NOT , IR_BOOL );
14691471 op1 = op1_insn -> op1 ;
14701472 op2 = IR_UNUSED ;
@@ -1509,7 +1511,9 @@ IR_FOLD(NE(SEXT, C_I32))
15091511IR_FOLD (NE (SEXT , C_I64 ))
15101512IR_FOLD (NE (SEXT , C_ADDR ))
15111513{
1512- if (op2_insn -> val .u64 == 0 && ctx -> ir_base [op1_insn -> op1 ].type == IR_BOOL ) {
1514+ if (ctx -> use_lists && ctx -> use_lists [op1_insn -> op1 ].count != 1 ) {
1515+ /* pass */
1516+ } else if (op2_insn -> val .u64 == 0 && ctx -> ir_base [op1_insn -> op1 ].type == IR_BOOL ) {
15131517 IR_FOLD_COPY (op1_insn -> op1 );
15141518 } else {
15151519 ir_type type = ctx -> ir_base [op1_insn -> op1 ].type ;
@@ -2464,6 +2468,17 @@ IR_FOLD(SEXT(AND))
24642468 IR_FOLD_NEXT ;
24652469}
24662470
2471+ IR_FOLD (SEXT (SHR ))
2472+ {
2473+ if (IR_IS_CONST_REF (op1_insn -> op2 )
2474+ && !IR_IS_SYM_CONST (ctx -> ir_base [op1_insn -> op2 ].op )
2475+ && ctx -> ir_base [op1_insn -> op2 ].val .u64 != 0 ) {
2476+ opt = IR_OPT (IR_ZEXT , IR_OPT_TYPE (opt ));
2477+ IR_FOLD_RESTART ;
2478+ }
2479+ IR_FOLD_NEXT ;
2480+ }
2481+
24672482IR_FOLD (TRUNC (AND ))
24682483{
24692484 if (IR_IS_CONST_REF (op1_insn -> op2 )) {
@@ -2490,6 +2505,44 @@ IR_FOLD(TRUNC(AND))
24902505 IR_FOLD_NEXT ;
24912506}
24922507
2508+ IR_FOLD (AND (ZEXT , C_I16 ))
2509+ IR_FOLD (AND (ZEXT , C_U16 ))
2510+ IR_FOLD (AND (ZEXT , C_I32 ))
2511+ IR_FOLD (AND (ZEXT , C_U32 ))
2512+ IR_FOLD (AND (ZEXT , C_I64 ))
2513+ IR_FOLD (AND (ZEXT , C_U64 ))
2514+ IR_FOLD (AND (ZEXT , C_ADDR ))
2515+ {
2516+ ir_type src_size = ir_type_size [ctx -> ir_base [op1_insn -> op1 ].type ];
2517+
2518+ if ((src_size == 1 && op2_insn -> val .u64 == 0xff )
2519+ || (src_size == 2 && op2_insn -> val .u64 == 0xffff )
2520+ || (src_size == 4 && op2_insn -> val .u64 == 0xffffffff )) {
2521+ IR_FOLD_COPY (op1 );
2522+ }
2523+ IR_FOLD_NEXT ;
2524+ }
2525+
2526+ IR_FOLD (AND (SEXT , C_I16 ))
2527+ IR_FOLD (AND (SEXT , C_U16 ))
2528+ IR_FOLD (AND (SEXT , C_I32 ))
2529+ IR_FOLD (AND (SEXT , C_U32 ))
2530+ IR_FOLD (AND (SEXT , C_I64 ))
2531+ IR_FOLD (AND (SEXT , C_U64 ))
2532+ IR_FOLD (AND (SEXT , C_ADDR ))
2533+ {
2534+ ir_type src_size = ir_type_size [ctx -> ir_base [op1_insn -> op1 ].type ];
2535+
2536+ if ((src_size == 1 && op2_insn -> val .u64 == 0xff )
2537+ || (src_size == 2 && op2_insn -> val .u64 == 0xffff )
2538+ || (src_size == 4 && op2_insn -> val .u64 == 0xffffffff )) {
2539+ opt = IR_OPT (IR_ZEXT , IR_OPT_TYPE (opt ));
2540+ op1 = op1_insn -> op1 ;
2541+ op2 = IR_UNUSED ;
2542+ IR_FOLD_RESTART ;
2543+ }
2544+ IR_FOLD_NEXT ;
2545+ }
24932546IR_FOLD (AND (SHR , C_I8 ))
24942547IR_FOLD (AND (SHR , C_U8 ))
24952548{
0 commit comments