solidity
solidity copied to clipboard
[Yul] Cleanup sequence can produce invalid Yul code
Description
The compiler terminates with a Yul assertion failed: ./libyul/AsmAnalysis.cpp(147) when trying to compile the program below via the solc CLI with the following Yul optimization sequence [eT]j[t]s:O. The program compiles without issues using the standard sequence.
Environment
- Compiler version: 0.8.30+commit.73712a01.Linux.g+ and 0.8.26+commit.8a97fa7a.Darwin.appleclang
- Compilation pipeline (legacy, IR, EOF): IR
- Target EVM version (as per compiler settings): shanghai
- Framework/IDE (e.g. Foundry, Hardhat, Remix): CLI
- EVM execution environment / backend / blockchain client:
- Operating system: Linux x86/64 and macOS arm64
Steps to Reproduce
Command Ling Args.
--yul-optimizations "[eT]j[t]s:O" --optimize-yul --via-ir --bin-runtime --evm-version shanghai
Program
pragma solidity ^0.8.19;
contract u5fK4aEKO6y7uuWRlA_zTYfA4cJA6TD {
int128 public state_var_0 = int128(-77);
function dBpmmEjtox3Z(bool assert_in1) external returns (int256) {
return (((int256(49) % int256(942)) -
(assert_in1 ? int256(624) : int256(663))) *
((int256(227) + int256(61)) % (int256(43) + int256(180))));
}
}
contract e$ex4_uf4f2SGQzCeWIR39XOS {
int16 public state_var_0 = int16(59);
function ARU27YemecGbjU(int256 assert_out1) external returns (int256) {
return assert_out1;
}
}
contract PlaceholderContract {
function dBpmmEjtox3Z(bool assert_in1) internal returns (int256) {
return (((int256(49) % int256(942)) -
(assert_in1 ? int256(624) : int256(663))) *
((int256(227) + int256(61)) % (int256(43) + int256(180))));
}
function xP4HXv2U7zJ64Cua6f_0FFW4JgK() internal returns (int256) {
return int256(1);
}
function q3j9zq1kvglAkiFgCGfw(
bool assert_in0,
bool assert_in1
) internal returns (int256) {
return (xP4HXv2U7zJ64Cua6f_0FFW4JgK() *
((((((int256(49) % (int256(942) - int256(0))) * int256(1)) -
(assert_in1 ? int256(624) : int256(663))) *
((int256(61) + ((int256(227) * int256(1)) + int256(0))) %
((int256(43) + (int256(180) - int256(98))) + int256(98)))) +
int256(0)) /
(
(((((assert_in0 || (assert_in0 && true)) || false) &&
assert_in1) || false) && assert_in0)
? ((int256(260) % (int256(630) & int256(630))) %
(
((false || (assert_in1 && assert_in1)) &&
(false || assert_in1))
? int256(100)
: int256(187)
))
: (((int256(543) / int256(702)) | int256(0)) +
((
((!(!(true || true))) &&
((true || true) &&
((true || true) &&
((!(!true)) || (!(!true))))))
? ((((int256(0) + int256(657)) -
int256(49)) + int256(49)) & int256(657))
: (int256(114) & int256(114))
) &
(
true
? (((((-int256(49)) / int256(1)) +
int256(657)) + int256(49)) &
int256(657))
: int256(114)
)))
)));
}
function ARU27YemecGbjU(int256 assert_out1) internal returns (int256) {
return assert_out1;
}
function m3ucnLm3aNelBYVt2Y_tkunV(
int256 assert_out2
) internal returns (int256) {
return assert_out2;
}
function check_entrypoint(bool assert_in0, bool assert_in1) public {
unchecked {
int256 assert_out1 = ((new u5fK4aEKO6y7uuWRlA_zTYfA4cJA6TD())
.dBpmmEjtox3Z(assert_in1) /
(
((assert_in0 && assert_in0) && (assert_in1 || assert_in1))
? ((int256(260) % int256(630)) %
(assert_in1 ? int256(100) : int256(187)))
: ((int256(543) / int256(702)) +
(true ? int256(657) : int256(114)))
));
int256 assert_out2 = q3j9zq1kvglAkiFgCGfw(assert_in0, assert_in1);
assert(
((new e$ex4_uf4f2SGQzCeWIR39XOS()).ARU27YemecGbjU(
assert_out1
) == m3ucnLm3aNelBYVt2Y_tkunV(assert_out2))
);
}
}
}
Stack Trace
https://gist.github.com/sbauer00/68221c019075c4daad55c5ad4500ff00