Yul IR: Change evaluation order for operands of binary operators.

This commit is contained in:
Daniel Kirchner 2021-06-15 13:19:20 +02:00
parent b2ffa91058
commit 664bf300fe
4 changed files with 24 additions and 23 deletions

View File

@ -8,6 +8,7 @@ Compiler Features:
Bugfixes:
* Control Flow Graph: Fix incorrectly reported unreachable code.
* Yul IR Code Generator: Change the evaluation order for binary expressions to right-hand-side first.

View File

@ -745,8 +745,8 @@ bool IRGeneratorForStatements::visit(BinaryOperation const& _binOp)
return false; // skip sub-expressions
}
_binOp.leftExpression().accept(*this);
_binOp.rightExpression().accept(*this);
_binOp.leftExpression().accept(*this);
setLocation(_binOp);
if (TokenTraits::isCompareOp(op))

View File

@ -217,53 +217,53 @@ object "C_81" {
let zero_t_uint256_4 := zero_value_for_split_t_uint256()
var__19 := zero_t_uint256_4
let expr_23 := 0x02
let _5 := var_a_4
let expr_24 := _5
let expr_23 := 0x02
let _6 := convert_t_rational_2_by_1_to_t_uint256(expr_23)
let expr_25 := checked_exp_t_rational_2_by_1_t_uint256(expr_24)
let var_w_22 := expr_25
let _7 := var_b_6
let expr_32 := _7
let expr_29 := 0x02
let expr_30 := 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe
let expr_31 := expr_30
let _7 := var_b_6
let expr_32 := _7
let _8 := convert_t_rational_minus_2_by_1_to_t_int256(expr_31)
let expr_33 := checked_exp_t_rational_minus_2_by_1_t_uint256(expr_32)
let var_x_28 := expr_33
let expr_37 := 0x0a
let _9 := var_c_8
let expr_38 := _9
let expr_37 := 0x0a
let _10 := convert_t_rational_10_by_1_to_t_uint256(expr_37)
let expr_39 := checked_exp_t_rational_10_by_1_t_uint256(expr_38)
let var_y_36 := expr_39
let expr_47 := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
let expr_48 := expr_47
let _11 := var_d_10
let expr_49 := _11
let expr_47 := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
let expr_48 := expr_47
let _12 := convert_t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639935_by_1_to_t_uint256(expr_48)
let expr_50 := checked_exp_t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639935_by_1_t_uint256(expr_49)
let var_z_42 := expr_50
let expr_53 := 0x00
let expr_54 := expr_53
let _13 := var_a_4
let expr_55 := _13
let expr_53 := 0x00
let expr_54 := expr_53
let _14 := convert_t_rational_0_by_1_to_t_uint256(expr_54)
let expr_56 := checked_exp_t_rational_0_by_1_t_uint256(expr_55)
var_w_22 := expr_56
let expr_57 := expr_56
let _15 := var_b_6
let expr_63 := _15
let expr_60 := 0x01
let expr_61 := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
let expr_62 := expr_61
let _15 := var_b_6
let expr_63 := _15
let _16 := convert_t_rational_minus_1_by_1_to_t_int256(expr_62)
let expr_64 := checked_exp_t_rational_minus_1_by_1_t_uint256(expr_63)
var_x_28 := expr_64
let expr_65 := expr_64
let expr_68 := 0x01
let _17 := var_c_8
let expr_69 := _17
let expr_68 := 0x01
let _18 := convert_t_rational_1_by_1_to_t_uint256(expr_68)
let expr_70 := checked_exp_t_rational_1_by_1_t_uint256(expr_69)
var_y_36 := expr_70

View File

@ -83,8 +83,8 @@ contract C {
}
}
// ====
// compileViaYul: true
// compileToEwasm: also
// compileViaYul: true
// ----
// preincr_s8(int8): 128 -> FAILURE
// postincr_s8(int8): 128 -> FAILURE
@ -106,16 +106,16 @@ contract C {
// postincr_u8(uint8): 254 -> FAILURE, hex"4e487b71", 0x11
// predecr_u8(uint8): 0 -> FAILURE, hex"4e487b71", 0x11
// postdecr_u8(uint8): 0 -> FAILURE, hex"4e487b71", 0x11
// predecr_u8(uint8): 1 -> 0
// postdecr_u8(uint8): 1 -> 1
// preincr_u8(uint8): 2 -> 6
// postincr_u8(uint8): 2 -> 5
// predecr_u8(uint8): 2 -> 2
// postdecr_u8(uint8): 2 -> 3
// preincr(uint256): 2 -> 6
// postincr(uint256): 2 -> 5
// predecr(uint256): 2 -> 2
// postdecr(uint256): 2 -> 3
// predecr_u8(uint8): 1 -> 1
// postdecr_u8(uint8): 1 -> 2
// preincr_u8(uint8): 2 -> 5
// postincr_u8(uint8): 2 -> 4
// predecr_u8(uint8): 2 -> 3
// postdecr_u8(uint8): 2 -> 4
// preincr(uint256): 2 -> 5
// postincr(uint256): 2 -> 4
// predecr(uint256): 2 -> 3
// postdecr(uint256): 2 -> 4
// not(bool): true -> false
// not(bool): false -> true
// bitnot(int256): 5 -> -6