@@ -924,7 +924,7 @@ IR_FOLD(SHL(C_CHAR, C_CHAR))
924924IR_FOLD (SHL (C_I8 , C_I8 ))
925925{
926926 IR_ASSERT (IR_OPT_TYPE (opt ) == op1_insn -> type );
927- IR_FOLD_CONST_I (op1_insn -> val .i8 << op2_insn -> val .i8 );
927+ IR_FOLD_CONST_I (( int8_t )( op1_insn -> val .u8 << op2_insn -> val .u8 ) );
928928}
929929
930930IR_FOLD (SHL (C_U16 , C_U16 ))
@@ -936,7 +936,7 @@ IR_FOLD(SHL(C_U16, C_U16))
936936IR_FOLD (SHL (C_I16 , C_I16 ))
937937{
938938 IR_ASSERT (IR_OPT_TYPE (opt ) == op1_insn -> type );
939- IR_FOLD_CONST_I (op1_insn -> val .i16 << op2_insn -> val .i16 );
939+ IR_FOLD_CONST_I (( int16_t )( op1_insn -> val .u16 << op2_insn -> val .u16 ) );
940940}
941941
942942IR_FOLD (SHL (C_U32 , C_U32 ))
@@ -948,7 +948,7 @@ IR_FOLD(SHL(C_U32, C_U32))
948948IR_FOLD (SHL (C_I32 , C_I32 ))
949949{
950950 IR_ASSERT (IR_OPT_TYPE (opt ) == op1_insn -> type );
951- IR_FOLD_CONST_I (op1_insn -> val .i32 << op2_insn -> val .i32 );
951+ IR_FOLD_CONST_I (( int32_t )( op1_insn -> val .u32 << op2_insn -> val .u32 ) );
952952}
953953
954954IR_FOLD (SHL (C_U64 , C_U64 ))
@@ -980,7 +980,7 @@ IR_FOLD(SHR(C_U16, C_U16))
980980IR_FOLD (SHR (C_I16 , C_I16 ))
981981{
982982 IR_ASSERT (IR_OPT_TYPE (opt ) == op1_insn -> type );
983- IR_FOLD_CONST_U ((int16_t )(op1_insn -> val .u16 >> op2_insn -> val .u16 ));
983+ IR_FOLD_CONST_I ((int16_t )(op1_insn -> val .u16 >> op2_insn -> val .u16 ));
984984}
985985
986986IR_FOLD (SHR (C_U32 , C_U32 ))
@@ -992,7 +992,7 @@ IR_FOLD(SHR(C_U32, C_U32))
992992IR_FOLD (SHR (C_I32 , C_I32 ))
993993{
994994 IR_ASSERT (IR_OPT_TYPE (opt ) == op1_insn -> type );
995- IR_FOLD_CONST_U ((int32_t )(op1_insn -> val .u32 >> op2_insn -> val .u32 ));
995+ IR_FOLD_CONST_I ((int32_t )(op1_insn -> val .u32 >> op2_insn -> val .u32 ));
996996}
997997
998998IR_FOLD (SHR (C_U64 , C_U64 ))
@@ -2728,7 +2728,7 @@ IR_FOLD(ADD(ADD, C_ADDR))
27282728 /* (x + c1) + c2 => x + (c1 + c2) */
27292729 val .u64 = ctx -> ir_base [op1_insn -> op2 ].val .u64 + op2_insn -> val .u64 ;
27302730 op1 = op1_insn -> op1 ;
2731- op2 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
2731+ op2 = ir_const (ctx , val , op2_insn -> type );
27322732 IR_FOLD_RESTART ;
27332733 }
27342734 IR_FOLD_NEXT ;
@@ -2743,7 +2743,7 @@ IR_FOLD(ADD(ADD, C_I64))
27432743 /* (x + c1) + c2 => x + (c1 + c2) */
27442744 val .i64 = ctx -> ir_base [op1_insn -> op2 ].val .u64 + op2_insn -> val .u64 ;
27452745 op1 = op1_insn -> op1 ;
2746- op2 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
2746+ op2 = ir_const (ctx , val , op2_insn -> type );
27472747 IR_FOLD_RESTART ;
27482748 }
27492749 IR_FOLD_NEXT ;
@@ -2759,14 +2759,14 @@ IR_FOLD(ADD(SUB, C_ADDR))
27592759 /* (x - c1) + c2 => x + (c2 - c1) */
27602760 val .u64 = op2_insn -> val .u64 - ctx -> ir_base [op1_insn -> op2 ].val .u64 ;
27612761 op1 = op1_insn -> op1 ;
2762- op2 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
2762+ op2 = ir_const (ctx , val , op2_insn -> type );
27632763 IR_FOLD_RESTART ;
27642764 } else if (IR_IS_CONST_REF (op1_insn -> op1 ) && !IR_IS_SYM_CONST (ctx -> ir_base [op1_insn -> op1 ].op )) {
27652765 /* (c1 - x) + c2 => (c1 + c2) - x */
27662766 val .u64 = ctx -> ir_base [op1_insn -> op1 ].val .u64 + op2_insn -> val .u64 ;
27672767 opt ++ ; /* ADD -> SUB */
27682768 op2 = op1_insn -> op2 ;
2769- op1 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
2769+ op1 = ir_const (ctx , val , op2_insn -> type );
27702770 IR_FOLD_RESTART ;
27712771 }
27722772 IR_FOLD_NEXT ;
@@ -2785,14 +2785,14 @@ IR_FOLD(ADD(SUB, C_I64))
27852785 opt ++ ; /* ADD -> SUB */
27862786 }
27872787 op1 = op1_insn -> op1 ;
2788- op2 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
2788+ op2 = ir_const (ctx , val , op2_insn -> type );
27892789 IR_FOLD_RESTART ;
27902790 } else if (IR_IS_CONST_REF (op1_insn -> op1 ) && !IR_IS_SYM_CONST (ctx -> ir_base [op1_insn -> op1 ].op )) {
27912791 /* (c1 - x) + c2 => (c1 + c2) - x */
27922792 val .i64 = ctx -> ir_base [op1_insn -> op1 ].val .u64 + op2_insn -> val .u64 ;
27932793 opt ++ ; /* ADD -> SUB */
27942794 op2 = op1_insn -> op2 ;
2795- op1 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
2795+ op1 = ir_const (ctx , val , op2_insn -> type );
27962796 IR_FOLD_RESTART ;
27972797 }
27982798 IR_FOLD_NEXT ;
@@ -2809,7 +2809,7 @@ IR_FOLD(SUB(ADD, C_ADDR))
28092809 val .u64 = ctx -> ir_base [op1_insn -> op2 ].val .u64 - op2_insn -> val .u64 ;
28102810 opt -- ; /* SUB -> ADD */
28112811 op1 = op1_insn -> op1 ;
2812- op2 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
2812+ op2 = ir_const (ctx , val , op2_insn -> type );
28132813 IR_FOLD_RESTART ;
28142814 }
28152815 IR_FOLD_NEXT ;
@@ -2829,7 +2829,7 @@ IR_FOLD(SUB(ADD, C_I64))
28292829 opt -- ; /* SUB -> ADD */
28302830 }
28312831 op1 = op1_insn -> op1 ;
2832- op2 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
2832+ op2 = ir_const (ctx , val , op2_insn -> type );
28332833 IR_FOLD_RESTART ;
28342834 }
28352835 IR_FOLD_NEXT ;
@@ -2845,7 +2845,7 @@ IR_FOLD(SUB(C_ADDR, ADD))
28452845 /* c1 - (x + c2) => (c1 - c2) - x */
28462846 val .u64 = op1_insn -> val .u64 - ctx -> ir_base [op2_insn -> op2 ].val .u64 ;
28472847 op2 = op2_insn -> op1 ;
2848- op1 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
2848+ op1 = ir_const (ctx , val , op2_insn -> type );
28492849 IR_FOLD_RESTART ;
28502850 }
28512851 IR_FOLD_NEXT ;
@@ -2860,7 +2860,7 @@ IR_FOLD(SUB(C_I64, ADD))
28602860 /* c1 - (x + c2) => (c1 - c2) - x */
28612861 val .i64 = op1_insn -> val .u64 - ctx -> ir_base [op2_insn -> op2 ].val .u64 ;
28622862 op2 = op2_insn -> op1 ;
2863- op1 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
2863+ op1 = ir_const (ctx , val , op2_insn -> type );
28642864 IR_FOLD_RESTART ;
28652865 }
28662866 IR_FOLD_NEXT ;
@@ -2880,13 +2880,13 @@ IR_FOLD(SUB(SUB, C_ADDR))
28802880 opt -- ; /* SUB -> ADD */
28812881 }
28822882 op1 = op1_insn -> op1 ;
2883- op2 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
2883+ op2 = ir_const (ctx , val , op2_insn -> type );
28842884 IR_FOLD_RESTART ;
28852885 } else if (IR_IS_CONST_REF (op1_insn -> op1 ) && !IR_IS_SYM_CONST (ctx -> ir_base [op1_insn -> op1 ].op )) {
28862886 /* (c1 - x) - c2 => (c1 - c2) - x */
28872887 val .u64 = ctx -> ir_base [op1_insn -> op1 ].val .u64 - op2_insn -> val .u64 ;
28882888 op2 = op1_insn -> op2 ;
2889- op1 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
2889+ op1 = ir_const (ctx , val , op2_insn -> type );
28902890 IR_FOLD_RESTART ;
28912891 }
28922892 IR_FOLD_NEXT ;
@@ -2905,13 +2905,13 @@ IR_FOLD(SUB(SUB, C_I64))
29052905 opt -- ; /* SUB -> ADD */
29062906 }
29072907 op1 = op1_insn -> op1 ;
2908- op2 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
2908+ op2 = ir_const (ctx , val , op2_insn -> type );
29092909 IR_FOLD_RESTART ;
29102910 } else if (IR_IS_CONST_REF (op1_insn -> op1 ) && !IR_IS_SYM_CONST (ctx -> ir_base [op1_insn -> op1 ].op )) {
29112911 /* (c1 - x) - c2 => (c1 - c2) - x */
29122912 val .i64 = ctx -> ir_base [op1_insn -> op1 ].val .u64 - op2_insn -> val .u64 ;
29132913 op2 = op1_insn -> op2 ;
2914- op1 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
2914+ op1 = ir_const (ctx , val , op2_insn -> type );
29152915 IR_FOLD_RESTART ;
29162916 }
29172917 IR_FOLD_NEXT ;
@@ -2927,7 +2927,7 @@ IR_FOLD(SUB(C_ADDR, SUB))
29272927 /* c1 - (x - c2) => (c1 + c2) - x */
29282928 val .u64 = op1_insn -> val .u64 + ctx -> ir_base [op2_insn -> op2 ].val .u64 ;
29292929 op2 = op2_insn -> op1 ;
2930- op1 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
2930+ op1 = ir_const (ctx , val , op1_insn -> op1 );
29312931 IR_FOLD_RESTART ;
29322932 } else if (IR_IS_CONST_REF (op2_insn -> op1 ) && !IR_IS_SYM_CONST (ctx -> ir_base [op2_insn -> op1 ].op )) {
29332933 /* c1 - (c2 - x) => x + (c1 - c2) */
@@ -2937,7 +2937,7 @@ IR_FOLD(SUB(C_ADDR, SUB))
29372937 opt ++ ; /* ADD -> SUB */
29382938 }
29392939 op1 = op2_insn -> op2 ;
2940- op2 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
2940+ op2 = ir_const (ctx , val , op1_insn -> type );
29412941 IR_FOLD_RESTART ;
29422942 }
29432943 IR_FOLD_NEXT ;
@@ -2952,7 +2952,7 @@ IR_FOLD(SUB(C_I64, SUB))
29522952 /* c1 - (x - c2) => (c1 + c2) - x */
29532953 val .i64 = op1_insn -> val .u64 + ctx -> ir_base [op2_insn -> op2 ].val .u64 ;
29542954 op2 = op2_insn -> op1 ;
2955- op1 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
2955+ op1 = ir_const (ctx , val , op1_insn -> type );
29562956 IR_FOLD_RESTART ;
29572957 } else if (IR_IS_CONST_REF (op2_insn -> op1 ) && !IR_IS_SYM_CONST (ctx -> ir_base [op2_insn -> op1 ].op )) {
29582958 /* c1 - (c2 - x) => x + (c1 - c2) */
@@ -2962,7 +2962,7 @@ IR_FOLD(SUB(C_I64, SUB))
29622962 opt ++ ; /* ADD -> SUB */
29632963 }
29642964 op1 = op2_insn -> op2 ;
2965- op2 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
2965+ op2 = ir_const (ctx , val , op1_insn -> type );
29662966 IR_FOLD_RESTART ;
29672967 }
29682968 IR_FOLD_NEXT ;
@@ -2978,7 +2978,7 @@ IR_FOLD(MUL(MUL, C_ADDR))
29782978 /* (x * c1) * c2 => x * (c1 * c2) */
29792979 val .u64 = ctx -> ir_base [op1_insn -> op2 ].val .u64 * op2_insn -> val .u64 ;
29802980 op1 = op1_insn -> op1 ;
2981- op2 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
2981+ op2 = ir_const (ctx , val , op2_insn -> type );
29822982 IR_FOLD_RESTART ;
29832983 }
29842984 IR_FOLD_NEXT ;
@@ -2993,7 +2993,7 @@ IR_FOLD(MUL(MUL, C_I64))
29932993 /* (x * c1) * c2 => x * (c1 * c2) */
29942994 val .i64 = ctx -> ir_base [op1_insn -> op2 ].val .u64 * op2_insn -> val .u64 ;
29952995 op1 = op1_insn -> op1 ;
2996- op2 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
2996+ op2 = ir_const (ctx , val , op2_insn -> type );
29972997 IR_FOLD_RESTART ;
29982998 }
29992999 IR_FOLD_NEXT ;
@@ -3013,7 +3013,7 @@ IR_FOLD(AND(AND, C_ADDR))
30133013 /* (x & c1) & c2 => x & (c1 & c2) */
30143014 val .u64 = ctx -> ir_base [op1_insn -> op2 ].val .u64 & op2_insn -> val .u64 ;
30153015 op1 = op1_insn -> op1 ;
3016- op2 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
3016+ op2 = ir_const (ctx , val , op2_insn -> type );
30173017 IR_FOLD_RESTART ;
30183018 }
30193019 IR_FOLD_NEXT ;
@@ -3033,7 +3033,7 @@ IR_FOLD(OR(OR, C_ADDR))
30333033 /* (x | c1) | c2 => x | (c1 | c2) */
30343034 val .u64 = ctx -> ir_base [op1_insn -> op2 ].val .u64 | op2_insn -> val .u64 ;
30353035 op1 = op1_insn -> op1 ;
3036- op2 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
3036+ op2 = ir_const (ctx , val , op2_insn -> type );
30373037 IR_FOLD_RESTART ;
30383038 }
30393039 IR_FOLD_NEXT ;
@@ -3053,7 +3053,7 @@ IR_FOLD(XOR(XOR, C_ADDR))
30533053 /* (x ^ c1) ^ c2 => x ^ (c1 ^ c2) */
30543054 val .u64 = ctx -> ir_base [op1_insn -> op2 ].val .u64 ^ op2_insn -> val .u64 ;
30553055 op1 = op1_insn -> op1 ;
3056- op2 = ir_const (ctx , val , IR_OPT_TYPE ( opt ) );
3056+ op2 = ir_const (ctx , val , op2_insn -> type );
30573057 IR_FOLD_RESTART ;
30583058 }
30593059 IR_FOLD_NEXT ;
0 commit comments