@@ -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