Optimized IR:
/// @use-src 0:"input.sol"
object "C_25" {
    code {
        {
            mstore(64, memoryguard(0x80))
            if callvalue()
            {
                revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb()
            }
            constructor_C()
            let _1 := allocate_unbounded()
            codecopy(_1, dataoffset("C_25_deployed"), datasize("C_25_deployed"))
            return(_1, datasize("C_25_deployed"))
        }
        function allocate_unbounded() -> memPtr
        { memPtr := mload(64) }
        function revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb()
        { revert(0, 0) }
        function shift_left(value) -> newValue
        { newValue := shl(0, value) }
        function update_byte_slice_shift(value, toInsert) -> result
        {
            let mask := not(0)
            toInsert := shift_left(toInsert)
            value := and(value, not(mask))
            result := or(value, and(toInsert, mask))
        }
        function cleanup_rational_by(value) -> cleaned
        { cleaned := value }
        function cleanup_uint256(value) -> cleaned
        { cleaned := value }
        function identity(value) -> ret
        { ret := value }
        function convert_rational_by_to_uint256(value) -> converted
        {
            converted := cleanup_uint256(identity(cleanup_rational_by(value)))
        }
        function prepare_store_uint256(value) -> ret
        { ret := value }
        function update_storage_value_offset_rational_by_to_uint256(slot, value)
        {
            let convertedValue := convert_rational_by_to_uint256(value)
            sstore(slot, update_byte_slice_shift(sload(slot), prepare_store_uint256(convertedValue)))
        }
        function constructor_C()
        {
            let expr := 0xeeeeeeeeee
            update_storage_value_offset_rational_by_to_uint256(0x00, expr)
        }
    }
    /// @use-src 0:"input.sol"
    object "C_25_deployed" {
        code {
            {
                mstore(64, memoryguard(0x80))
                if iszero(lt(calldatasize(), 4))
                {
                    let selector := shift_right_unsigned(calldataload(0))
                    switch selector
                    case 0xc2985578 { external_fun_foo() }
                    case 0xff2558ff { external_fun_varStorage() }
                    default { }
                }
                revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74()
            }
            function shift_right_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(headStart, dataEnd)
            {
                if slt(sub(dataEnd, headStart), 0)
                {
                    revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b()
                }
            }
            function cleanup_uint256(value) -> cleaned
            { cleaned := value }
            function abi_encode_uint256_to_uint256(value, pos)
            {
                mstore(pos, cleanup_uint256(value))
            }
            function abi_encode_uint256(headStart, value0) -> tail
            {
                tail := add(headStart, 32)
                abi_encode_uint256_to_uint256(value0, add(headStart, 0))
            }
            function external_fun_foo()
            {
                if callvalue()
                {
                    revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb()
                }
                abi_decode(4, calldatasize())
                let ret := fun_foo()
                let memPos := allocate_unbounded()
                let memEnd := abi_encode_uint256(memPos, ret)
                return(memPos, sub(memEnd, memPos))
            }
            function shift_right_unsigned_dynamic(bits, value) -> newValue
            { newValue := shr(bits, value) }
            function cleanup_from_storage_uint256(value) -> cleaned
            { cleaned := value }
            function extract_from_storage_value_dynamict_uint256(slot_value, offset) -> value
            {
                value := cleanup_from_storage_uint256(shift_right_unsigned_dynamic(mul(offset, 8), slot_value))
            }
            function read_from_storage_split_dynamic_uint256(slot, offset) -> value
            {
                value := extract_from_storage_value_dynamict_uint256(sload(slot), offset)
            }
            function getter_fun_varStorage() -> ret
            {
                let slot := 0
                let offset := 0
                ret := read_from_storage_split_dynamic_uint256(slot, offset)
            }
            function external_fun_varStorage()
            {
                if callvalue()
                {
                    revert_error_ca66f745a3ce8ff40e2ccaf1ad45db7774001b90d25810abd9040049be7bf4bb()
                }
                abi_decode(4, calldatasize())
                let ret := getter_fun_varStorage()
                let memPos := allocate_unbounded()
                let memEnd := abi_encode_uint256(memPos, ret)
                return(memPos, sub(memEnd, memPos))
            }
            function revert_error_42b3090547df1d2001c96683413b8cf91c1b902ef5e3cb8d9f6f304cf7446f74()
            { revert(0, 0) }
            function zero_value_for_split_uint256() -> ret
            { ret := 0 }
            function cleanup_rational_by(value) -> cleaned
            { cleaned := value }
            function identity(value) -> ret
            { ret := value }
            function convert_rational_by_to_uint256(value) -> converted
            {
                converted := cleanup_uint256(identity(cleanup_rational_by(value)))
            }
            function shift_left(value) -> newValue
            { newValue := shl(0, value) }
            function update_byte_slice_shift(value, toInsert) -> result
            {
                let mask := not(0)
                toInsert := shift_left(toInsert)
                value := and(value, not(mask))
                result := or(value, and(toInsert, mask))
            }
            function convert_uint256_to_uint256(value) -> converted
            {
                converted := cleanup_uint256(identity(cleanup_uint256(value)))
            }
            function prepare_store_uint256(value) -> ret
            { ret := value }
            function update_transient_storage_value_offset_uint256_to_uint256(slot, value)
            {
                let convertedValue := convert_uint256_to_uint256(value)
                tstore(slot, update_byte_slice_shift(tload(slot), prepare_store_uint256(convertedValue)))
            }
            function shift_left_dynamic(bits, value) -> newValue
            { newValue := shl(bits, value) }
            function update_byte_slice_dynamic32(value, shiftBytes, toInsert) -> result
            {
                let shiftBits := mul(shiftBytes, 8)
                let mask := shift_left_dynamic(shiftBits, not(0))
                toInsert := shift_left_dynamic(shiftBits, toInsert)
                value := and(value, not(mask))
                result := or(value, and(toInsert, mask))
            }
            function update_transient_storage_value_uint256_to_uint256(slot, offset, value)
            {
                let convertedValue := convert_uint256_to_uint256(value)
                tstore(slot, update_byte_slice_dynamic32(tload(slot), offset, prepare_store_uint256(convertedValue)))
            }
            function transient_storage_set_to_zero_uint256(slot, offset)
            {
                let zero := zero_value_for_split_uint256()
                update_transient_storage_value_uint256_to_uint256(slot, offset, zero)
            }
            function update_storage_value_uint256_to_uint256(slot, offset, value)
            {
                let convertedValue := convert_uint256_to_uint256(value)
                sstore(slot, update_byte_slice_dynamic32(sload(slot), offset, prepare_store_uint256(convertedValue)))
            }
            function storage_set_to_zero_uint256(slot, offset)
            {
                let zero := zero_value_for_split_uint256()
                update_storage_value_uint256_to_uint256(slot, offset, zero)
            }
            function shift_right_0_unsigned(value) -> newValue
            { newValue := shr(0, value) }
            function extract_from_storage_value_offset_uint256(slot_value) -> value
            {
                value := cleanup_from_storage_uint256(shift_right_0_unsigned(slot_value))
            }
            function read_from_storage_split_offset_uint256(slot) -> value
            {
                value := extract_from_storage_value_offset_uint256(sload(slot))
            }
            function fun_foo() -> var
            {
                let zero_uint256 := zero_value_for_split_uint256()
                var := zero_uint256
                let expr := 0xffffffff
                let _1 := convert_rational_by_to_uint256(expr)
                update_transient_storage_value_offset_uint256_to_uint256(0x00, _1)
                transient_storage_set_to_zero_uint256(0x00, 0)
                storage_set_to_zero_uint256(0x00, 0)
                let _2 := read_from_storage_split_offset_uint256(0x00)
                let expr_1 := _2
                var := expr_1
                leave
            }
        }
        data ".metadata" hex"<BYTECODE REMOVED>"
    }
}
