From 664bf300fe955472e3f5f984486a93a06da6d619 Mon Sep 17 00:00:00 2001 From: Daniel Kirchner Date: Tue, 15 Jun 2021 13:19:20 +0200 Subject: [PATCH] Yul IR: Change evaluation order for operands of binary operators. --- Changelog.md | 1 + .../codegen/ir/IRGeneratorForStatements.cpp | 2 +- test/cmdlineTests/exp_base_literal/output | 22 +++++++++---------- .../semanticTests/viaYul/unary_operations.sol | 22 +++++++++---------- 4 files changed, 24 insertions(+), 23 deletions(-) diff --git a/Changelog.md b/Changelog.md index ddf61619c..4857c3c48 100644 --- a/Changelog.md +++ b/Changelog.md @@ -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. diff --git a/libsolidity/codegen/ir/IRGeneratorForStatements.cpp b/libsolidity/codegen/ir/IRGeneratorForStatements.cpp index b4d2e5db0..f470ce43a 100644 --- a/libsolidity/codegen/ir/IRGeneratorForStatements.cpp +++ b/libsolidity/codegen/ir/IRGeneratorForStatements.cpp @@ -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)) diff --git a/test/cmdlineTests/exp_base_literal/output b/test/cmdlineTests/exp_base_literal/output index 14b1a616a..d17d84638 100644 --- a/test/cmdlineTests/exp_base_literal/output +++ b/test/cmdlineTests/exp_base_literal/output @@ -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 diff --git a/test/libsolidity/semanticTests/viaYul/unary_operations.sol b/test/libsolidity/semanticTests/viaYul/unary_operations.sol index 37a6e90d8..a5193ef5a 100644 --- a/test/libsolidity/semanticTests/viaYul/unary_operations.sol +++ b/test/libsolidity/semanticTests/viaYul/unary_operations.sol @@ -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