solidity icon indicating copy to clipboard operation
solidity copied to clipboard

[Yul] Cleanup sequence can produce invalid Yul code

Open sbauer00 opened this issue 2 months ago • 2 comments

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

sbauer00 avatar Oct 01 '25 17:10 sbauer00