From 4296197d8ec35a83f28d5990a8b3cc48c46c0c35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20=C5=9Aliwak?= Date: Fri, 28 Apr 2023 21:53:16 +0200 Subject: [PATCH] Move the second run of YulOptimizer to IRGenerator to make it more obvious we're running it twice --- libsolidity/codegen/ir/IRGenerator.cpp | 1 + libsolidity/interface/CompilerStack.cpp | 1 - test/cmdlineTests/name_simplifier/output | 48 +-- .../output | 344 ++++++++++++++++++ ...d_array_of_structs_calldata_to_storage.sol | 2 +- .../array/pop/array_pop_uint16_transition.sol | 2 +- 6 files changed, 371 insertions(+), 27 deletions(-) diff --git a/libsolidity/codegen/ir/IRGenerator.cpp b/libsolidity/codegen/ir/IRGenerator.cpp index cf11a8a02..c24888088 100644 --- a/libsolidity/codegen/ir/IRGenerator.cpp +++ b/libsolidity/codegen/ir/IRGenerator.cpp @@ -113,6 +113,7 @@ pair IRGenerator::run( solAssert(false, ir + "\n\nInvalid IR generated:\n" + errorMessage + "\n"); } asmStack.optimize(); + asmStack.optimize(); // FIXME: We should be getting good results without running this twice return {std::move(ir), asmStack.print(m_context.soliditySourceProvider())}; } diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index ad2618bc0..1bf61955c 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -1467,7 +1467,6 @@ void CompilerStack::generateEVMFromIR(ContractDefinition const& _contract) m_debugInfoSelection ); stack.parseAndAnalyze("", compiledContract.yulIROptimized); - stack.optimize(); //cout << yul::AsmPrinter{}(*stack.parserResult()->code) << endl; diff --git a/test/cmdlineTests/name_simplifier/output b/test/cmdlineTests/name_simplifier/output index 170e58ffb..749df6a47 100644 --- a/test/cmdlineTests/name_simplifier/output +++ b/test/cmdlineTests/name_simplifier/output @@ -32,43 +32,43 @@ object "C_59" { if gt(offset, _5) { revert(_3, _3) } if iszero(slt(add(offset, 35), calldatasize())) { revert(_3, _3) } let _6 := calldataload(add(_2, offset)) - let _7 := 36 if gt(_6, _5) { mstore(_3, shl(224, 0x4e487b71)) mstore(_2, 0x41) - revert(_3, _7) + revert(_3, 36) } - let _8 := shl(5, _6) - let _9 := not(31) - let newFreePtr := add(_1, and(add(_8, 63), _9)) + let _7 := shl(5, _6) + let _8 := not(31) + let newFreePtr := add(_1, and(add(_7, 63), _8)) if or(gt(newFreePtr, _5), lt(newFreePtr, _1)) { mstore(_3, shl(224, 0x4e487b71)) mstore(_2, 0x41) - revert(_3, _7) + revert(_3, 36) } - let _10 := 64 - mstore(_10, newFreePtr) + let _9 := 64 + mstore(_9, newFreePtr) let dst := _1 mstore(_1, _6) dst := add(_1, _4) let dst_1 := dst - let srcEnd := add(add(offset, _8), _7) + let _10 := 36 + let srcEnd := add(add(offset, _7), _10) if gt(srcEnd, calldatasize()) { revert(_3, _3) } - let src := add(offset, _7) + let src := add(offset, _10) for { } lt(src, srcEnd) { src := add(src, _4) } { if slt(sub(calldatasize(), src), _4) { revert(_3, _3) } - let memPtr := mload(_10) + let memPtr := mload(_9) let newFreePtr_1 := add(memPtr, _4) if or(gt(newFreePtr_1, _5), lt(newFreePtr_1, memPtr)) { mstore(_3, shl(224, 0x4e487b71)) mstore(_2, 0x41) - revert(_3, _7) + revert(_3, _10) } - mstore(_10, newFreePtr_1) + mstore(_9, newFreePtr_1) mstore(memPtr, calldataload(src)) mstore(dst, memPtr) dst := add(dst, _4) @@ -77,7 +77,7 @@ object "C_59" { { mstore(_3, shl(224, 0x4e487b71)) mstore(_2, 0x32) - revert(_3, _7) + revert(_3, _10) } sstore(_3, mload(/** @src 0:469:474 "_s[0]" */ mload(dst_1))) /// @src 0:346:625 "contract C {..." @@ -85,37 +85,37 @@ object "C_59" { { mstore(_3, shl(224, 0x4e487b71)) mstore(_2, 0x32) - revert(_3, _7) + revert(_3, _10) } - let _11 := mload(/** @src 0:489:494 "_s[1]" */ mload(/** @src 0:346:625 "contract C {..." */ add(_1, _10))) + let _11 := mload(/** @src 0:489:494 "_s[1]" */ mload(/** @src 0:346:625 "contract C {..." */ add(_1, _9))) sstore(0x02, _11) - let memPtr_1 := mload(_10) + let memPtr_1 := mload(_9) let newFreePtr_2 := add(memPtr_1, 160) if or(gt(newFreePtr_2, _5), lt(newFreePtr_2, memPtr_1)) { mstore(_3, shl(224, 0x4e487b71)) mstore(_2, 0x41) - revert(_3, _7) + revert(_3, _10) } - mstore(_10, newFreePtr_2) + mstore(_9, newFreePtr_2) mstore(memPtr_1, 100) mstore(add(memPtr_1, _4), "longstringlongstringlongstringlo") - mstore(add(memPtr_1, _10), "ngstringlongstringlongstringlong") + mstore(add(memPtr_1, _9), "ngstringlongstringlongstringlong") let _12 := 96 mstore(add(memPtr_1, _12), "stringlongstringlongstringlongst") mstore(add(memPtr_1, 128), "ring") - let memPos := mload(_10) + let memPos := mload(_9) mstore(memPos, _11) - mstore(add(memPos, _4), _10) + mstore(add(memPos, _4), _9) let length := mload(memPtr_1) - mstore(add(memPos, _10), length) + mstore(add(memPos, _9), length) let i := _3 for { } lt(i, length) { i := add(i, _4) } { mstore(add(add(memPos, i), _12), mload(add(add(memPtr_1, i), _4))) } mstore(add(add(memPos, length), _12), _3) - return(memPos, add(sub(add(memPos, and(add(length, 31), _9)), memPos), _12)) + return(memPos, add(sub(add(memPos, and(add(length, 31), _8)), memPos), _12)) } } revert(0, 0) diff --git a/test/cmdlineTests/yul_optimizer_steps_nested_brackets/output b/test/cmdlineTests/yul_optimizer_steps_nested_brackets/output index 1e19c3a5c..61bbe2a15 100644 --- a/test/cmdlineTests/yul_optimizer_steps_nested_brackets/output +++ b/test/cmdlineTests/yul_optimizer_steps_nested_brackets/output @@ -102,6 +102,92 @@ object "C_6" { let memPtr_84 := memPtr_1 let memPtr_85 := memPtr_1 let memPtr_86 := memPtr_1 + let memPtr_87 := memPtr_1 + let memPtr_88 := memPtr_1 + let memPtr_89 := memPtr_1 + let memPtr_90 := memPtr_1 + let memPtr_91 := memPtr_1 + let memPtr_92 := memPtr_1 + let memPtr_93 := memPtr_1 + let memPtr_94 := memPtr_1 + let memPtr_95 := memPtr_1 + let memPtr_96 := memPtr_1 + let memPtr_97 := memPtr_1 + let memPtr_98 := memPtr_1 + let memPtr_99 := memPtr_1 + let memPtr_100 := memPtr_1 + let memPtr_101 := memPtr_1 + let memPtr_102 := memPtr_1 + let memPtr_103 := memPtr_1 + let memPtr_104 := memPtr_1 + let memPtr_105 := memPtr_1 + let memPtr_106 := memPtr_1 + let memPtr_107 := memPtr_1 + let memPtr_108 := memPtr_1 + let memPtr_109 := memPtr_1 + let memPtr_110 := memPtr_1 + let memPtr_111 := memPtr_1 + let memPtr_112 := memPtr_1 + let memPtr_113 := memPtr_1 + let memPtr_114 := memPtr_1 + let memPtr_115 := memPtr_1 + let memPtr_116 := memPtr_1 + let memPtr_117 := memPtr_1 + let memPtr_118 := memPtr_1 + let memPtr_119 := memPtr_1 + let memPtr_120 := memPtr_1 + let memPtr_121 := memPtr_1 + let memPtr_122 := memPtr_1 + let memPtr_123 := memPtr_1 + let memPtr_124 := memPtr_1 + let memPtr_125 := memPtr_1 + let memPtr_126 := memPtr_1 + let memPtr_127 := memPtr_1 + let memPtr_128 := memPtr_1 + let memPtr_129 := memPtr_1 + let memPtr_130 := memPtr_1 + let memPtr_131 := memPtr_1 + let memPtr_132 := memPtr_1 + let memPtr_133 := memPtr_1 + let memPtr_134 := memPtr_1 + let memPtr_135 := memPtr_1 + let memPtr_136 := memPtr_1 + let memPtr_137 := memPtr_1 + let memPtr_138 := memPtr_1 + let memPtr_139 := memPtr_1 + let memPtr_140 := memPtr_1 + let memPtr_141 := memPtr_1 + let memPtr_142 := memPtr_1 + let memPtr_143 := memPtr_1 + let memPtr_144 := memPtr_1 + let memPtr_145 := memPtr_1 + let memPtr_146 := memPtr_1 + let memPtr_147 := memPtr_1 + let memPtr_148 := memPtr_1 + let memPtr_149 := memPtr_1 + let memPtr_150 := memPtr_1 + let memPtr_151 := memPtr_1 + let memPtr_152 := memPtr_1 + let memPtr_153 := memPtr_1 + let memPtr_154 := memPtr_1 + let memPtr_155 := memPtr_1 + let memPtr_156 := memPtr_1 + let memPtr_157 := memPtr_1 + let memPtr_158 := memPtr_1 + let memPtr_159 := memPtr_1 + let memPtr_160 := memPtr_1 + let memPtr_161 := memPtr_1 + let memPtr_162 := memPtr_1 + let memPtr_163 := memPtr_1 + let memPtr_164 := memPtr_1 + let memPtr_165 := memPtr_1 + let memPtr_166 := memPtr_1 + let memPtr_167 := memPtr_1 + let memPtr_168 := memPtr_1 + let memPtr_169 := memPtr_1 + let memPtr_170 := memPtr_1 + let memPtr_171 := memPtr_1 + let memPtr_172 := memPtr_1 memPtr := memPtr_1 } function revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb() @@ -210,6 +296,92 @@ object "C_6" { let newValue_84 := newValue_1 let newValue_85 := newValue_1 let newValue_86 := newValue_1 + let newValue_87 := newValue_1 + let newValue_88 := newValue_1 + let newValue_89 := newValue_1 + let newValue_90 := newValue_1 + let newValue_91 := newValue_1 + let newValue_92 := newValue_1 + let newValue_93 := newValue_1 + let newValue_94 := newValue_1 + let newValue_95 := newValue_1 + let newValue_96 := newValue_1 + let newValue_97 := newValue_1 + let newValue_98 := newValue_1 + let newValue_99 := newValue_1 + let newValue_100 := newValue_1 + let newValue_101 := newValue_1 + let newValue_102 := newValue_1 + let newValue_103 := newValue_1 + let newValue_104 := newValue_1 + let newValue_105 := newValue_1 + let newValue_106 := newValue_1 + let newValue_107 := newValue_1 + let newValue_108 := newValue_1 + let newValue_109 := newValue_1 + let newValue_110 := newValue_1 + let newValue_111 := newValue_1 + let newValue_112 := newValue_1 + let newValue_113 := newValue_1 + let newValue_114 := newValue_1 + let newValue_115 := newValue_1 + let newValue_116 := newValue_1 + let newValue_117 := newValue_1 + let newValue_118 := newValue_1 + let newValue_119 := newValue_1 + let newValue_120 := newValue_1 + let newValue_121 := newValue_1 + let newValue_122 := newValue_1 + let newValue_123 := newValue_1 + let newValue_124 := newValue_1 + let newValue_125 := newValue_1 + let newValue_126 := newValue_1 + let newValue_127 := newValue_1 + let newValue_128 := newValue_1 + let newValue_129 := newValue_1 + let newValue_130 := newValue_1 + let newValue_131 := newValue_1 + let newValue_132 := newValue_1 + let newValue_133 := newValue_1 + let newValue_134 := newValue_1 + let newValue_135 := newValue_1 + let newValue_136 := newValue_1 + let newValue_137 := newValue_1 + let newValue_138 := newValue_1 + let newValue_139 := newValue_1 + let newValue_140 := newValue_1 + let newValue_141 := newValue_1 + let newValue_142 := newValue_1 + let newValue_143 := newValue_1 + let newValue_144 := newValue_1 + let newValue_145 := newValue_1 + let newValue_146 := newValue_1 + let newValue_147 := newValue_1 + let newValue_148 := newValue_1 + let newValue_149 := newValue_1 + let newValue_150 := newValue_1 + let newValue_151 := newValue_1 + let newValue_152 := newValue_1 + let newValue_153 := newValue_1 + let newValue_154 := newValue_1 + let newValue_155 := newValue_1 + let newValue_156 := newValue_1 + let newValue_157 := newValue_1 + let newValue_158 := newValue_1 + let newValue_159 := newValue_1 + let newValue_160 := newValue_1 + let newValue_161 := newValue_1 + let newValue_162 := newValue_1 + let newValue_163 := newValue_1 + let newValue_164 := newValue_1 + let newValue_165 := newValue_1 + let newValue_166 := newValue_1 + let newValue_167 := newValue_1 + let newValue_168 := newValue_1 + let newValue_169 := newValue_1 + let newValue_170 := newValue_1 + let newValue_171 := newValue_1 + let newValue_172 := newValue_1 newValue := newValue_1 } function allocate_unbounded() -> memPtr @@ -300,6 +472,92 @@ object "C_6" { let memPtr_84 := memPtr_1 let memPtr_85 := memPtr_1 let memPtr_86 := memPtr_1 + let memPtr_87 := memPtr_1 + let memPtr_88 := memPtr_1 + let memPtr_89 := memPtr_1 + let memPtr_90 := memPtr_1 + let memPtr_91 := memPtr_1 + let memPtr_92 := memPtr_1 + let memPtr_93 := memPtr_1 + let memPtr_94 := memPtr_1 + let memPtr_95 := memPtr_1 + let memPtr_96 := memPtr_1 + let memPtr_97 := memPtr_1 + let memPtr_98 := memPtr_1 + let memPtr_99 := memPtr_1 + let memPtr_100 := memPtr_1 + let memPtr_101 := memPtr_1 + let memPtr_102 := memPtr_1 + let memPtr_103 := memPtr_1 + let memPtr_104 := memPtr_1 + let memPtr_105 := memPtr_1 + let memPtr_106 := memPtr_1 + let memPtr_107 := memPtr_1 + let memPtr_108 := memPtr_1 + let memPtr_109 := memPtr_1 + let memPtr_110 := memPtr_1 + let memPtr_111 := memPtr_1 + let memPtr_112 := memPtr_1 + let memPtr_113 := memPtr_1 + let memPtr_114 := memPtr_1 + let memPtr_115 := memPtr_1 + let memPtr_116 := memPtr_1 + let memPtr_117 := memPtr_1 + let memPtr_118 := memPtr_1 + let memPtr_119 := memPtr_1 + let memPtr_120 := memPtr_1 + let memPtr_121 := memPtr_1 + let memPtr_122 := memPtr_1 + let memPtr_123 := memPtr_1 + let memPtr_124 := memPtr_1 + let memPtr_125 := memPtr_1 + let memPtr_126 := memPtr_1 + let memPtr_127 := memPtr_1 + let memPtr_128 := memPtr_1 + let memPtr_129 := memPtr_1 + let memPtr_130 := memPtr_1 + let memPtr_131 := memPtr_1 + let memPtr_132 := memPtr_1 + let memPtr_133 := memPtr_1 + let memPtr_134 := memPtr_1 + let memPtr_135 := memPtr_1 + let memPtr_136 := memPtr_1 + let memPtr_137 := memPtr_1 + let memPtr_138 := memPtr_1 + let memPtr_139 := memPtr_1 + let memPtr_140 := memPtr_1 + let memPtr_141 := memPtr_1 + let memPtr_142 := memPtr_1 + let memPtr_143 := memPtr_1 + let memPtr_144 := memPtr_1 + let memPtr_145 := memPtr_1 + let memPtr_146 := memPtr_1 + let memPtr_147 := memPtr_1 + let memPtr_148 := memPtr_1 + let memPtr_149 := memPtr_1 + let memPtr_150 := memPtr_1 + let memPtr_151 := memPtr_1 + let memPtr_152 := memPtr_1 + let memPtr_153 := memPtr_1 + let memPtr_154 := memPtr_1 + let memPtr_155 := memPtr_1 + let memPtr_156 := memPtr_1 + let memPtr_157 := memPtr_1 + let memPtr_158 := memPtr_1 + let memPtr_159 := memPtr_1 + let memPtr_160 := memPtr_1 + let memPtr_161 := memPtr_1 + let memPtr_162 := memPtr_1 + let memPtr_163 := memPtr_1 + let memPtr_164 := memPtr_1 + let memPtr_165 := memPtr_1 + let memPtr_166 := memPtr_1 + let memPtr_167 := memPtr_1 + let memPtr_168 := memPtr_1 + let memPtr_169 := memPtr_1 + let memPtr_170 := memPtr_1 + let memPtr_171 := memPtr_1 + let memPtr_172 := memPtr_1 memPtr := memPtr_1 } function revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb() @@ -401,6 +659,92 @@ object "C_6" { let tail_84 := tail_1 let tail_85 := tail_1 let tail_86 := tail_1 + let tail_87 := tail_1 + let tail_88 := tail_1 + let tail_89 := tail_1 + let tail_90 := tail_1 + let tail_91 := tail_1 + let tail_92 := tail_1 + let tail_93 := tail_1 + let tail_94 := tail_1 + let tail_95 := tail_1 + let tail_96 := tail_1 + let tail_97 := tail_1 + let tail_98 := tail_1 + let tail_99 := tail_1 + let tail_100 := tail_1 + let tail_101 := tail_1 + let tail_102 := tail_1 + let tail_103 := tail_1 + let tail_104 := tail_1 + let tail_105 := tail_1 + let tail_106 := tail_1 + let tail_107 := tail_1 + let tail_108 := tail_1 + let tail_109 := tail_1 + let tail_110 := tail_1 + let tail_111 := tail_1 + let tail_112 := tail_1 + let tail_113 := tail_1 + let tail_114 := tail_1 + let tail_115 := tail_1 + let tail_116 := tail_1 + let tail_117 := tail_1 + let tail_118 := tail_1 + let tail_119 := tail_1 + let tail_120 := tail_1 + let tail_121 := tail_1 + let tail_122 := tail_1 + let tail_123 := tail_1 + let tail_124 := tail_1 + let tail_125 := tail_1 + let tail_126 := tail_1 + let tail_127 := tail_1 + let tail_128 := tail_1 + let tail_129 := tail_1 + let tail_130 := tail_1 + let tail_131 := tail_1 + let tail_132 := tail_1 + let tail_133 := tail_1 + let tail_134 := tail_1 + let tail_135 := tail_1 + let tail_136 := tail_1 + let tail_137 := tail_1 + let tail_138 := tail_1 + let tail_139 := tail_1 + let tail_140 := tail_1 + let tail_141 := tail_1 + let tail_142 := tail_1 + let tail_143 := tail_1 + let tail_144 := tail_1 + let tail_145 := tail_1 + let tail_146 := tail_1 + let tail_147 := tail_1 + let tail_148 := tail_1 + let tail_149 := tail_1 + let tail_150 := tail_1 + let tail_151 := tail_1 + let tail_152 := tail_1 + let tail_153 := tail_1 + let tail_154 := tail_1 + let tail_155 := tail_1 + let tail_156 := tail_1 + let tail_157 := tail_1 + let tail_158 := tail_1 + let tail_159 := tail_1 + let tail_160 := tail_1 + let tail_161 := tail_1 + let tail_162 := tail_1 + let tail_163 := tail_1 + let tail_164 := tail_1 + let tail_165 := tail_1 + let tail_166 := tail_1 + let tail_167 := tail_1 + let tail_168 := tail_1 + let tail_169 := tail_1 + let tail_170 := tail_1 + let tail_171 := tail_1 + let tail_172 := tail_1 tail := tail_1 } function external_fun_f() diff --git a/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_calldata_to_storage.sol b/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_calldata_to_storage.sol index 1f9011abd..19bcbc31f 100644 --- a/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_calldata_to_storage.sol +++ b/test/libsolidity/semanticTests/array/copying/nested_array_of_structs_calldata_to_storage.sol @@ -31,7 +31,7 @@ contract C { // compileViaYul: true // ---- // test1((uint8[],uint8[2])[][]): 0x20, 2, 0x40, 0x0140, 1, 0x20, 0x60, 3, 7, 2, 1, 2, 2, 0x40, 0x0100, 0x60, 17, 19, 2, 11, 13, 0x60, 31, 37, 2, 23, 29 -> 0x20, 2, 0x40, 0x0140, 1, 0x20, 0x60, 3, 7, 2, 1, 2, 2, 0x40, 0x0100, 0x60, 17, 19, 2, 11, 13, 0x60, 31, 37, 2, 23, 29 -// gas irOptimized: 304768 +// gas irOptimized: 304765 // test2((uint8[],uint8[2])[][1]): 0x20, 0x20, 1, 0x20, 0x60, 17, 19, 2, 11, 13 -> 0x20, 0x20, 1, 0x20, 0x60, 17, 19, 2, 11, 13 // gas irOptimized: 116476 // test3((uint8[],uint8[2])[1][]): 0x20, 2, 0x40, 0x0120, 0x20, 0x60, 3, 7, 2, 1, 2, 0x20, 0x60, 17, 19, 2, 11, 13 -> 0x20, 2, 0x40, 0x0120, 0x20, 0x60, 3, 7, 2, 1, 2, 0x20, 0x60, 17, 19, 2, 11, 13 diff --git a/test/libsolidity/semanticTests/array/pop/array_pop_uint16_transition.sol b/test/libsolidity/semanticTests/array/pop/array_pop_uint16_transition.sol index 2ef781a70..a6ddd2f10 100644 --- a/test/libsolidity/semanticTests/array/pop/array_pop_uint16_transition.sol +++ b/test/libsolidity/semanticTests/array/pop/array_pop_uint16_transition.sol @@ -18,7 +18,7 @@ contract c { } // ---- // test() -> 38, 28, 18 -// gas irOptimized: 148520 +// gas irOptimized: 148525 // gas legacy: 151594 // gas legacyOptimized: 142655 // storageEmpty -> 1