@@ -1464,7 +1464,9 @@ IR_FOLD(EQ(SEXT, C_I32))
1464
1464
IR_FOLD (EQ (SEXT , C_I64 ))
1465
1465
IR_FOLD (EQ (SEXT , C_ADDR ))
1466
1466
{
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 ) {
1468
1470
opt = IR_OPT (IR_NOT , IR_BOOL );
1469
1471
op1 = op1_insn -> op1 ;
1470
1472
op2 = IR_UNUSED ;
@@ -1509,7 +1511,9 @@ IR_FOLD(NE(SEXT, C_I32))
1509
1511
IR_FOLD (NE (SEXT , C_I64 ))
1510
1512
IR_FOLD (NE (SEXT , C_ADDR ))
1511
1513
{
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 ) {
1513
1517
IR_FOLD_COPY (op1_insn -> op1 );
1514
1518
} else {
1515
1519
ir_type type = ctx -> ir_base [op1_insn -> op1 ].type ;
@@ -2464,6 +2468,17 @@ IR_FOLD(SEXT(AND))
2464
2468
IR_FOLD_NEXT ;
2465
2469
}
2466
2470
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
+
2467
2482
IR_FOLD (TRUNC (AND ))
2468
2483
{
2469
2484
if (IR_IS_CONST_REF (op1_insn -> op2 )) {
@@ -2490,6 +2505,44 @@ IR_FOLD(TRUNC(AND))
2490
2505
IR_FOLD_NEXT ;
2491
2506
}
2492
2507
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
+ }
2493
2546
IR_FOLD (AND (SHR , C_I8 ))
2494
2547
IR_FOLD (AND (SHR , C_U8 ))
2495
2548
{
0 commit comments