mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Command-line tests checking behavior of msize without optimizer
This commit is contained in:
parent
7ab730d410
commit
8e35e8dd8e
1
test/cmdlineTests/strict_asm_msize_with_optimizer/args
Normal file
1
test/cmdlineTests/strict_asm_msize_with_optimizer/args
Normal file
@ -0,0 +1 @@
|
||||
--strict-assembly --debug-info none --optimize
|
13
test/cmdlineTests/strict_asm_msize_with_optimizer/input.yul
Normal file
13
test/cmdlineTests/strict_asm_msize_with_optimizer/input.yul
Normal file
@ -0,0 +1,13 @@
|
||||
{
|
||||
function f() -> x {
|
||||
x := mload(0)
|
||||
}
|
||||
|
||||
// In pure Yul optimization in presence of msize is allowed.
|
||||
// Everything in this file should get optimized out.
|
||||
pop(msize())
|
||||
|
||||
let x := 0
|
||||
let y := x
|
||||
mstore(0, f())
|
||||
}
|
14
test/cmdlineTests/strict_asm_msize_with_optimizer/output
Normal file
14
test/cmdlineTests/strict_asm_msize_with_optimizer/output
Normal file
@ -0,0 +1,14 @@
|
||||
|
||||
======= strict_asm_msize_with_optimizer/input.yul (EVM) =======
|
||||
|
||||
Pretty printed source:
|
||||
object "object" {
|
||||
code { { } }
|
||||
}
|
||||
|
||||
|
||||
Binary representation:
|
||||
00
|
||||
|
||||
Text representation:
|
||||
stop
|
@ -0,0 +1 @@
|
||||
--strict-assembly --debug-info none
|
@ -0,0 +1,13 @@
|
||||
{
|
||||
function f() -> x {
|
||||
x := mload(0)
|
||||
}
|
||||
|
||||
// In pure Yul without optimizer presence of msize disables stack optimization.
|
||||
// This file should remain untouched when passed through the optimizer.
|
||||
pop(msize())
|
||||
|
||||
let x := 0
|
||||
let y := x
|
||||
mstore(0, f())
|
||||
}
|
40
test/cmdlineTests/strict_asm_msize_without_optimizer/output
Normal file
40
test/cmdlineTests/strict_asm_msize_without_optimizer/output
Normal file
@ -0,0 +1,40 @@
|
||||
|
||||
======= strict_asm_msize_without_optimizer/input.yul (EVM) =======
|
||||
|
||||
Pretty printed source:
|
||||
object "object" {
|
||||
code {
|
||||
function f() -> x
|
||||
{ x := mload(0) }
|
||||
pop(msize())
|
||||
let x := 0
|
||||
let y := x
|
||||
mstore(0, f())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Binary representation:
|
||||
600b565b5f8051905090565b5f8060136003565b5f525050
|
||||
|
||||
Text representation:
|
||||
jump(tag_2)
|
||||
tag_1:
|
||||
0x00
|
||||
dup1
|
||||
mload
|
||||
swap1
|
||||
pop
|
||||
swap1
|
||||
jump // out
|
||||
tag_2:
|
||||
0x00
|
||||
dup1
|
||||
tag_4
|
||||
tag_1
|
||||
jump // in
|
||||
tag_4:
|
||||
0x00
|
||||
mstore
|
||||
pop
|
||||
pop
|
1
test/cmdlineTests/viair_msize_without_optimizer/args
Normal file
1
test/cmdlineTests/viair_msize_without_optimizer/args
Normal file
@ -0,0 +1 @@
|
||||
--via-ir --ir-optimized --asm --debug-info none
|
21
test/cmdlineTests/viair_msize_without_optimizer/input.sol
Normal file
21
test/cmdlineTests/viair_msize_without_optimizer/input.sol
Normal file
@ -0,0 +1,21 @@
|
||||
// SPDX-License-Identifier: GPL-3.0
|
||||
pragma solidity *;
|
||||
|
||||
contract C {
|
||||
function f() pure public {
|
||||
assembly ("memory-safe") {
|
||||
function f() -> x {
|
||||
x := mload(0)
|
||||
}
|
||||
|
||||
// Presence of msize disables all Yul optimizations, including the minimal steps or
|
||||
// stack optimization that would normally be performed even with the optimizer nominally disabled.
|
||||
// This block should remain untouched when passed through the optimizer.
|
||||
pop(msize())
|
||||
|
||||
let x := 0
|
||||
let y := x
|
||||
mstore(0, f())
|
||||
}
|
||||
}
|
||||
}
|
261
test/cmdlineTests/viair_msize_without_optimizer/output
Normal file
261
test/cmdlineTests/viair_msize_without_optimizer/output
Normal file
@ -0,0 +1,261 @@
|
||||
|
||||
======= viair_msize_without_optimizer/input.sol:C =======
|
||||
EVM assembly:
|
||||
mstore(0x40, 0x80)
|
||||
jumpi(tag_4, iszero(callvalue))
|
||||
tag_5
|
||||
tag_2
|
||||
jump // in
|
||||
tag_5:
|
||||
tag_4:
|
||||
tag_6
|
||||
tag_3
|
||||
jump // in
|
||||
tag_6:
|
||||
tag_7
|
||||
tag_1
|
||||
jump // in
|
||||
tag_7:
|
||||
dataSize(sub_0)
|
||||
dataOffset(sub_0)
|
||||
dup3
|
||||
codecopy
|
||||
dataSize(sub_0)
|
||||
dup2
|
||||
return
|
||||
tag_1:
|
||||
0x00
|
||||
mload(0x40)
|
||||
swap1
|
||||
pop
|
||||
swap1
|
||||
jump // out
|
||||
tag_2:
|
||||
0x00
|
||||
dup1
|
||||
revert
|
||||
tag_3:
|
||||
jump // out
|
||||
stop
|
||||
|
||||
sub_0: assembly {
|
||||
mstore(0x40, 0x80)
|
||||
jumpi(tag_10, lt(calldatasize, 0x04))
|
||||
tag_11
|
||||
calldataload(0x00)
|
||||
tag_1
|
||||
jump // in
|
||||
tag_11:
|
||||
dup1
|
||||
0x26121ff0
|
||||
dup2
|
||||
sub
|
||||
tag_12
|
||||
jumpi
|
||||
tag_14
|
||||
tag_7
|
||||
jump // in
|
||||
tag_14:
|
||||
tag_12:
|
||||
pop
|
||||
pop
|
||||
tag_10:
|
||||
tag_15
|
||||
tag_8
|
||||
jump // in
|
||||
tag_15:
|
||||
jump(tag_16)
|
||||
tag_1:
|
||||
0x00
|
||||
dup2
|
||||
0xe0
|
||||
shr
|
||||
swap1
|
||||
pop
|
||||
swap2
|
||||
swap1
|
||||
pop
|
||||
jump // out
|
||||
tag_2:
|
||||
0x00
|
||||
mload(0x40)
|
||||
swap1
|
||||
pop
|
||||
swap1
|
||||
jump // out
|
||||
tag_3:
|
||||
0x00
|
||||
dup1
|
||||
revert
|
||||
tag_4:
|
||||
0x00
|
||||
dup1
|
||||
revert
|
||||
tag_5:
|
||||
0x00
|
||||
dup2
|
||||
dup4
|
||||
sub
|
||||
slt
|
||||
iszero
|
||||
tag_22
|
||||
jumpi
|
||||
tag_23
|
||||
tag_4
|
||||
jump // in
|
||||
tag_23:
|
||||
tag_22:
|
||||
pop
|
||||
pop
|
||||
jump // out
|
||||
tag_6:
|
||||
0x00
|
||||
dup1
|
||||
dup3
|
||||
add
|
||||
swap1
|
||||
pop
|
||||
swap2
|
||||
swap1
|
||||
pop
|
||||
jump // out
|
||||
tag_7:
|
||||
jumpi(tag_26, iszero(callvalue))
|
||||
tag_27
|
||||
tag_3
|
||||
jump // in
|
||||
tag_27:
|
||||
tag_26:
|
||||
tag_28
|
||||
calldatasize
|
||||
0x04
|
||||
tag_5
|
||||
jump // in
|
||||
tag_28:
|
||||
tag_29
|
||||
tag_9
|
||||
jump // in
|
||||
tag_29:
|
||||
tag_30
|
||||
tag_2
|
||||
jump // in
|
||||
tag_30:
|
||||
tag_31
|
||||
dup2
|
||||
tag_6
|
||||
jump // in
|
||||
tag_31:
|
||||
dup2
|
||||
dup2
|
||||
sub
|
||||
dup3
|
||||
return
|
||||
tag_8:
|
||||
0x00
|
||||
dup1
|
||||
revert
|
||||
tag_9:
|
||||
jump(tag_35)
|
||||
tag_34:
|
||||
0x00
|
||||
dup1
|
||||
mload
|
||||
swap1
|
||||
pop
|
||||
swap1
|
||||
jump // out
|
||||
tag_35:
|
||||
0x00
|
||||
dup1
|
||||
tag_37
|
||||
tag_34
|
||||
jump // in
|
||||
tag_37:
|
||||
0x00
|
||||
mstore
|
||||
pop
|
||||
pop
|
||||
jump // out
|
||||
tag_16:
|
||||
|
||||
auxdata: <AUXDATA REMOVED>
|
||||
}
|
||||
|
||||
Optimized IR:
|
||||
/// @use-src 0:"viair_msize_without_optimizer/input.sol"
|
||||
object "C_7" {
|
||||
code {
|
||||
mstore(64, memoryguard(128))
|
||||
if callvalue()
|
||||
{
|
||||
revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb()
|
||||
}
|
||||
constructor_C_7()
|
||||
let _1 := allocate_unbounded()
|
||||
codecopy(_1, dataoffset("C_7_deployed"), datasize("C_7_deployed"))
|
||||
return(_1, datasize("C_7_deployed"))
|
||||
function allocate_unbounded() -> memPtr
|
||||
{ memPtr := mload(64) }
|
||||
function revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb()
|
||||
{ revert(0, 0) }
|
||||
function constructor_C_7()
|
||||
{ }
|
||||
}
|
||||
/// @use-src 0:"viair_msize_without_optimizer/input.sol"
|
||||
object "C_7_deployed" {
|
||||
code {
|
||||
mstore(64, memoryguard(128))
|
||||
if iszero(lt(calldatasize(), 4))
|
||||
{
|
||||
let selector := shift_right_224_unsigned(calldataload(0))
|
||||
switch selector
|
||||
case 0x26121ff0 { external_fun_f_6() }
|
||||
default { }
|
||||
}
|
||||
revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74()
|
||||
function shift_right_224_unsigned(value) -> newValue
|
||||
{ newValue := shr(224, value) }
|
||||
function allocate_unbounded() -> memPtr
|
||||
{ memPtr := mload(64) }
|
||||
function revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb()
|
||||
{ revert(0, 0) }
|
||||
function revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b()
|
||||
{ revert(0, 0) }
|
||||
function abi_decode_tuple_(headStart, dataEnd)
|
||||
{
|
||||
if slt(sub(dataEnd, headStart), 0)
|
||||
{
|
||||
revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b()
|
||||
}
|
||||
}
|
||||
function abi_encode_tuple__to__fromStack(headStart) -> tail
|
||||
{ tail := add(headStart, 0) }
|
||||
function external_fun_f_6()
|
||||
{
|
||||
if callvalue()
|
||||
{
|
||||
revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb()
|
||||
}
|
||||
abi_decode_tuple_(4, calldatasize())
|
||||
fun_f_6()
|
||||
let memPos := allocate_unbounded()
|
||||
let memEnd := abi_encode_tuple__to__fromStack(memPos)
|
||||
return(memPos, sub(memEnd, memPos))
|
||||
}
|
||||
function revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74()
|
||||
{ revert(0, 0) }
|
||||
function fun_f_6()
|
||||
{
|
||||
{
|
||||
function usr$f() -> usr$x
|
||||
{ usr$x := mload(0) }
|
||||
pop(msize())
|
||||
let usr$x := 0
|
||||
let usr$y := usr$x
|
||||
mstore(0, usr$f())
|
||||
}
|
||||
}
|
||||
}
|
||||
data ".metadata" hex"<BYTECODE REMOVED>"
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user