diff --git a/Cargo.lock b/Cargo.lock index 051291d4ab..589bfb8955 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -862,6 +862,12 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" +[[package]] +name = "binary-merge" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597bb81c80a54b6a4381b23faba8d7774b144c94cbd1d6fe3f1329bd776554ab" + [[package]] name = "bit-set" version = "0.8.0" @@ -2982,6 +2988,15 @@ dependencies = [ "serde_core", ] +[[package]] +name = "inplace-vec-builder" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf64c2edc8226891a71f127587a2861b132d2b942310843814d5001d99a1d307" +dependencies = [ + "smallvec 1.15.1", +] + [[package]] name = "insta" version = "1.46.3" @@ -5038,7 +5053,7 @@ dependencies = [ [[package]] name = "sonatina-codegen" version = "0.0.3-alpha" -source = "git+https://github.com/fe-lang/sonatina?rev=74c797f#74c797f88e4b47970ac8e53b4a208c9a6fec467e" +source = "git+https://github.com/fe-lang/sonatina?rev=f1d0743#f1d0743d1490ff7e0eeab4defaec31395ee0b8de" dependencies = [ "bit-set", "cranelift-entity 0.126.2", @@ -5052,12 +5067,13 @@ dependencies = [ "sonatina-triple", "sonatina-verifier", "tracing", + "vec-collections", ] [[package]] name = "sonatina-ir" version = "0.0.3-alpha" -source = "git+https://github.com/fe-lang/sonatina?rev=74c797f#74c797f88e4b47970ac8e53b4a208c9a6fec467e" +source = "git+https://github.com/fe-lang/sonatina?rev=f1d0743#f1d0743d1490ff7e0eeab4defaec31395ee0b8de" dependencies = [ "bitflags 2.11.0", "cranelift-entity 0.126.2", @@ -5072,12 +5088,13 @@ dependencies = [ "smol_str 0.3.5", "sonatina-macros", "sonatina-triple", + "vec-collections", ] [[package]] name = "sonatina-macros" version = "0.0.3-alpha" -source = "git+https://github.com/fe-lang/sonatina?rev=74c797f#74c797f88e4b47970ac8e53b4a208c9a6fec467e" +source = "git+https://github.com/fe-lang/sonatina?rev=f1d0743#f1d0743d1490ff7e0eeab4defaec31395ee0b8de" dependencies = [ "proc-macro2", "quote", @@ -5087,7 +5104,7 @@ dependencies = [ [[package]] name = "sonatina-parser" version = "0.0.3-alpha" -source = "git+https://github.com/fe-lang/sonatina?rev=74c797f#74c797f88e4b47970ac8e53b4a208c9a6fec467e" +source = "git+https://github.com/fe-lang/sonatina?rev=f1d0743#f1d0743d1490ff7e0eeab4defaec31395ee0b8de" dependencies = [ "annotate-snippets", "bimap", @@ -5108,7 +5125,7 @@ dependencies = [ [[package]] name = "sonatina-triple" version = "0.0.3-alpha" -source = "git+https://github.com/fe-lang/sonatina?rev=74c797f#74c797f88e4b47970ac8e53b4a208c9a6fec467e" +source = "git+https://github.com/fe-lang/sonatina?rev=f1d0743#f1d0743d1490ff7e0eeab4defaec31395ee0b8de" dependencies = [ "thiserror 2.0.18", ] @@ -5116,7 +5133,7 @@ dependencies = [ [[package]] name = "sonatina-verifier" version = "0.0.3-alpha" -source = "git+https://github.com/fe-lang/sonatina?rev=74c797f#74c797f88e4b47970ac8e53b4a208c9a6fec467e" +source = "git+https://github.com/fe-lang/sonatina?rev=f1d0743#f1d0743d1490ff7e0eeab4defaec31395ee0b8de" dependencies = [ "cranelift-entity 0.126.2", "rayon", @@ -5129,6 +5146,12 @@ dependencies = [ "tracing", ] +[[package]] +name = "sorted-iter" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bceb57dc07c92cdae60f5b27b3fa92ecaaa42fe36c55e22dbfb0b44893e0b1f7" + [[package]] name = "spki" version = "0.7.3" @@ -5749,6 +5772,20 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "vec-collections" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9965c8f2ffed1dbcd16cafe18a009642f540fa22661c6cfd6309ddb02e4982" +dependencies = [ + "binary-merge", + "inplace-vec-builder", + "lazy_static", + "num-traits", + "smallvec 1.15.1", + "sorted-iter", +] + [[package]] name = "version_check" version = "0.9.5" diff --git a/Cargo.toml b/Cargo.toml index 745ccbe460..389dc97e16 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,10 +46,10 @@ tracing-tree = "0.4.0" wasm-bindgen-test = "0.3" semver = "1.0.26" petgraph = "0.8" -sonatina-ir = { git = "https://github.com/fe-lang/sonatina", rev = "74c797f" } -sonatina-triple = { git = "https://github.com/fe-lang/sonatina", rev = "74c797f" } -sonatina-codegen = { git = "https://github.com/fe-lang/sonatina", rev = "74c797f" } -sonatina-verifier = { git = "https://github.com/fe-lang/sonatina", rev = "74c797f" } +sonatina-ir = { git = "https://github.com/fe-lang/sonatina", rev = "f1d0743" } +sonatina-triple = { git = "https://github.com/fe-lang/sonatina", rev = "f1d0743" } +sonatina-codegen = { git = "https://github.com/fe-lang/sonatina", rev = "f1d0743" } +sonatina-verifier = { git = "https://github.com/fe-lang/sonatina", rev = "f1d0743" } [profile.dev] # Set to 0 to make the build faster and debugging more difficult. diff --git a/crates/codegen/src/sonatina/lower.rs b/crates/codegen/src/sonatina/lower.rs index 61b1e6fa5a..be2635b2a2 100644 --- a/crates/codegen/src/sonatina/lower.rs +++ b/crates/codegen/src/sonatina/lower.rs @@ -4,10 +4,13 @@ use driver::DriverDataBase; use hir::analysis::ty::adt_def::AdtRef; -use hir::analysis::ty::ty_def::{PrimTy, TyBase, TyData}; +use hir::analysis::ty::ty_def::{CapabilityKind, PrimTy, TyBase, TyData}; use hir::hir_def::expr::{ArithBinOp, BinOp, CompBinOp, LogicalBinOp, UnOp}; use hir::projection::{IndexSource, Projection}; -use mir::ir::{AddressSpaceKind, IntrinsicOp, Place, SyntheticValue}; +use mir::ir::{ + AddressSpaceKind, BuiltinTerminatorKind, CheckedArithmeticOp, CheckedIntrinsic, IntrinsicOp, + Place, SyntheticValue, +}; use mir::layout; use mir::layout::TargetDataLayout; use num_bigint::BigUint; @@ -17,9 +20,9 @@ use sonatina_ir::{ BlockId, GlobalVariableData, I256, Immediate, Linkage, Type, Value, ValueId, global_variable::GvInitializer, inst::{ - arith::{Add, Mul, Neg, Shl, Shr, Sub}, + arith::{Add, Mul, Neg, Sar, Shl, Shr, Sub}, cast::{Bitcast, IntToPtr, PtrToInt, Sext, Trunc, Zext}, - cmp::{Eq, Gt, IsZero, Lt, Ne}, + cmp::{Eq, Gt, IsZero, Lt, Ne, Slt}, control_flow::{Br, BrTable, Call, Jump, Return}, data::{Alloca, Gep, Mload, Mstore, SymAddr, SymSize, SymbolRef}, evm::{ @@ -56,10 +59,7 @@ pub(super) fn lower_instruction<'db, C: sonatina_ir::func_cursor::FuncCursor>( )); }; let value = lower_alloc(ctx, *dest_local, *address_space)?; - let dest_var = ctx.local_vars.get(dest_local).copied().ok_or_else(|| { - LowerError::Internal(format!("missing SSA variable for local {dest_local:?}")) - })?; - ctx.fb.def_var(dest_var, value); + def_local_value(ctx, *dest_local, value, format!("{rvalue:?}"))?; return Ok(()); } @@ -70,18 +70,12 @@ pub(super) fn lower_instruction<'db, C: sonatina_ir::func_cursor::FuncCursor>( )); }; let value = lower_const_aggregate(ctx, data)?; - let dest_var = ctx.local_vars.get(dest_local).copied().ok_or_else(|| { - LowerError::Internal(format!("missing SSA variable for local {dest_local:?}")) - })?; - ctx.fb.def_var(dest_var, value); + def_local_value(ctx, *dest_local, value, format!("{rvalue:?}"))?; return Ok(()); } let result = lower_rvalue(ctx, rvalue, *dest)?; if let (Some(dest_local), Some(result_val)) = (dest, result) { - let dest_var = ctx.local_vars.get(dest_local).copied().ok_or_else(|| { - LowerError::Internal(format!("missing SSA variable for local {dest_local:?}")) - })?; // Apply from_word conversion for Load operations let converted = if matches!(rvalue, mir::Rvalue::Load { .. }) { let dest_ty = ctx @@ -96,7 +90,7 @@ pub(super) fn lower_instruction<'db, C: sonatina_ir::func_cursor::FuncCursor>( } else { result_val }; - ctx.fb.def_var(dest_var, converted); + def_local_value(ctx, *dest_local, converted, format!("{rvalue:?}"))?; } } MirInst::Store { place, value, .. } => { @@ -124,6 +118,30 @@ pub(super) fn lower_instruction<'db, C: sonatina_ir::func_cursor::FuncCursor>( Ok(()) } +fn def_local_value<'db, C: sonatina_ir::func_cursor::FuncCursor>( + ctx: &mut LowerCtx<'_, 'db, C>, + dest_local: mir::LocalId, + value: ValueId, + source: String, +) -> Result<(), LowerError> { + let dest_var = ctx.local_vars.get(&dest_local).copied().ok_or_else(|| { + LowerError::Internal(format!("missing SSA variable for local {dest_local:?}")) + })?; + let expected_ty = ctx + .local_runtime_tys + .get(dest_local.index()) + .copied() + .ok_or_else(|| LowerError::Internal(format!("missing local type for {dest_local:?}")))?; + let actual_ty = ctx.fb.type_of(value); + if actual_ty != expected_ty { + return Err(LowerError::Internal(format!( + "assignment type mismatch for {dest_local:?}: expected {expected_ty:?}, got {actual_ty:?} from {source}" + ))); + } + ctx.fb.def_var(dest_var, value); + Ok(()) +} + /// Lower a MIR rvalue to a Sonatina value. fn lower_rvalue<'db, C: sonatina_ir::func_cursor::FuncCursor>( ctx: &mut LowerCtx<'_, 'db, C>, @@ -134,8 +152,17 @@ fn lower_rvalue<'db, C: sonatina_ir::func_cursor::FuncCursor>( match rvalue { Rvalue::ZeroInit => { - // Create a zero constant - let zero = ctx.fb.make_imm_value(I256::zero()); + let zero_ty = if let Some(dest_local) = dest_local { + ctx.local_runtime_tys + .get(dest_local.index()) + .copied() + .ok_or_else(|| { + LowerError::Internal(format!("unknown destination local: {dest_local:?}")) + })? + } else { + Type::I256 + }; + let zero = types::zero_value(ctx.fb, zero_ty); Ok(Some(zero)) } Rvalue::Value(value_id) => { @@ -143,6 +170,16 @@ fn lower_rvalue<'db, C: sonatina_ir::func_cursor::FuncCursor>( Ok(Some(val)) } Rvalue::Call(call) => { + if let Some(checked) = call.checked_intrinsic { + if !call.effect_args.is_empty() { + return Err(LowerError::Internal(format!( + "checked intrinsic call unexpectedly has effect args: {checked:?}" + ))); + } + let result = lower_checked_intrinsic(ctx, checked, &call.args)?; + return Ok(Some(result)); + } + // Get the callee function reference let callee_name = call.resolved_name.as_ref().ok_or_else(|| { LowerError::Unsupported("call without resolved symbol name".to_string()) @@ -481,6 +518,13 @@ fn lower_rvalue<'db, C: sonatina_ir::func_cursor::FuncCursor>( } } + // Core numeric intrinsics (extern functions from `core::num`). + if call.effect_args.is_empty() + && let Some(result) = try_lower_numeric_intrinsic(ctx, callee_name, &call.args)? + { + return Ok(Some(result)); + } + let func_ref = ctx .name_map .get(callee_name) @@ -495,24 +539,24 @@ fn lower_rvalue<'db, C: sonatina_ir::func_cursor::FuncCursor>( "call", )?; - // Emit call instruction with proper return type - let call_inst = Call::new(ctx.is, *func_ref, args.into()); - let callee_returns = - ctx.returns_value_map - .get(callee_name) - .copied() - .ok_or_else(|| { - LowerError::Internal(format!( - "missing return type metadata for function: {callee_name}" - )) - })?; - if callee_returns { - let result = ctx.fb.insert_inst(call_inst, types::word_type()); - Ok(Some(result)) - } else { - // Unit-returning calls don't produce a value - ctx.fb.insert_inst_no_result(call_inst); - Ok(None) + let ret_tys = ctx + .fb + .module_builder + .ctx + .func_sig(*func_ref, |sig| sig.ret_tys().to_vec()); + match ret_tys.as_slice() { + [] => { + let call_inst = Call::new(ctx.is, *func_ref, args.into()); + ctx.fb.insert_inst_no_result(call_inst); + Ok(None) + } + [ret_ty] => { + let call_inst = Call::new(ctx.is, *func_ref, args.into()); + Ok(Some(ctx.fb.insert_inst(call_inst, *ret_ty))) + } + _ => Err(LowerError::Internal(format!( + "call to `{callee_name}` unexpectedly returned multiple values" + ))), } } Rvalue::Intrinsic { op, args } => lower_intrinsic(ctx, *op, args), @@ -563,6 +607,7 @@ fn lower_call_args<'db, C: sonatina_ir::func_cursor::FuncCursor>( context: &str, ) -> Result, LowerError> { let mut args = Vec::with_capacity(regular_args.len() + effect_args.len()); + let mut arg_tys = Vec::with_capacity(regular_args.len() + effect_args.len()); if let Some(mask) = ctx.runtime_param_masks.get(callee_name) { let all_args: Vec<_> = regular_args .iter() @@ -580,7 +625,14 @@ fn lower_call_args<'db, C: sonatina_ir::func_cursor::FuncCursor>( if !*keep { continue; } + let arg_ty = ctx + .body + .values + .get(arg.index()) + .ok_or_else(|| LowerError::Internal("unknown call argument".to_string()))? + .ty; args.push(lower_value(ctx, arg)?); + arg_tys.push(arg_ty); } } else { // Fallback for callees without a declared signature/mask (e.g. externs). @@ -595,6 +647,7 @@ fn lower_call_args<'db, C: sonatina_ir::func_cursor::FuncCursor>( continue; } args.push(lower_value(ctx, arg)?); + arg_tys.push(arg_ty); } for &effect_arg in effect_args { let arg_ty = ctx @@ -607,22 +660,31 @@ fn lower_call_args<'db, C: sonatina_ir::func_cursor::FuncCursor>( continue; } args.push(lower_value(ctx, effect_arg)?); + arg_tys.push(arg_ty); } } - let expected_argc = ctx + let expected_arg_tys = ctx .fb .module_builder .ctx - .func_sig(func_ref, |sig| sig.args().len()); + .func_sig(func_ref, |sig| sig.args().to_vec()); + let expected_argc = expected_arg_tys.len(); if args.len() > expected_argc { return Err(LowerError::Internal(format!( "{context} to `{callee_name}` has too many args (got {}, expected {expected_argc})", args.len() ))); } - while args.len() < expected_argc { - args.push(ctx.fb.make_imm_value(I256::zero())); + for ((arg, arg_ty), expected_ty) in args + .iter_mut() + .zip(arg_tys.iter().copied()) + .zip(expected_arg_tys.iter().copied()) + { + *arg = coerce_runtime_value(ctx.fb, ctx.db, *arg, arg_ty, expected_ty, ctx.is); + } + for ty in expected_arg_tys.into_iter().skip(args.len()) { + args.push(types::zero_value(ctx.fb, ty)); } Ok(args) @@ -655,16 +717,23 @@ fn lower_value_origin<'db, C: sonatina_ir::func_cursor::FuncCursor>( ) -> Result { use mir::ValueOrigin; let origin = &value_data.origin; + let result_ty = types::value_runtime_type(ctx.db, ctx.target_layout, value_data); match origin { ValueOrigin::Synthetic(syn) => match syn { SyntheticValue::Int(n) => { let i256_val = biguint_to_i256(n); - Ok(ctx.fb.make_imm_value(i256_val)) + Ok(ctx + .fb + .make_imm_value(Immediate::from_i256(i256_val, result_ty))) } SyntheticValue::Bool(b) => { - let val = if *b { I256::one() } else { I256::zero() }; - Ok(ctx.fb.make_imm_value(val)) + if result_ty == Type::I1 { + Ok(ctx.fb.make_imm_value(*b)) + } else { + let val = if *b { I256::one() } else { I256::zero() }; + Ok(ctx.fb.make_imm_value(Immediate::from_i256(val, result_ty))) + } } SyntheticValue::Bytes(bytes) => { // Convert bytes to I256 (left-padded to 32 bytes) @@ -676,24 +745,40 @@ fn lower_value_origin<'db, C: sonatina_ir::func_cursor::FuncCursor>( let var = ctx.local_vars.get(local_id).copied().ok_or_else(|| { LowerError::Internal(format!("SSA variable not found for local {local_id:?}")) })?; - Ok(ctx.fb.use_var(var)) - } - ValueOrigin::Unit => { - // Unit is represented as 0 - Ok(ctx.fb.make_imm_value(I256::zero())) + let val = ctx.fb.use_var(var); + Ok(val) } + ValueOrigin::Unit => Ok(types::zero_value(ctx.fb, result_ty)), ValueOrigin::Unary { op, inner } => { let inner_val = lower_value(ctx, *inner)?; - lower_unary_op(ctx.fb, *op, inner_val, ctx.is) + lower_unary_op(ctx.fb, ctx.db, *op, inner_val, value_data.ty, ctx.is) } ValueOrigin::Binary { op, lhs, rhs } => { let lhs_val = lower_value(ctx, *lhs)?; let rhs_val = lower_value(ctx, *rhs)?; - lower_binary_op(ctx.fb, *op, lhs_val, rhs_val, ctx.is) + let lhs_ty = ctx + .body + .values + .get(lhs.index()) + .ok_or_else(|| { + LowerError::Internal(format!("unknown MIR value id {}", lhs.index())) + })? + .ty; + lower_binary_op(ctx.fb, ctx.db, *op, lhs_val, rhs_val, lhs_ty, ctx.is) } ValueOrigin::TransparentCast { value } => { - // Transparent cast just passes through the inner value - lower_value(ctx, *value) + let inner_val = lower_value(ctx, *value)?; + let inner_ty = ctx + .body + .values + .get(value.index()) + .ok_or_else(|| { + LowerError::Internal(format!("unknown MIR value id {}", value.index())) + })? + .ty; + Ok(coerce_runtime_value( + ctx.fb, ctx.db, inner_val, inner_ty, result_ty, ctx.is, + )) } ValueOrigin::ControlFlowResult { expr } => { // ControlFlowResult values should be converted to Local values during MIR lowering. @@ -751,27 +836,32 @@ fn lower_value_origin<'db, C: sonatina_ir::func_cursor::FuncCursor>( } /// Lower a unary operation. -fn lower_unary_op( +fn lower_unary_op<'db, C: sonatina_ir::func_cursor::FuncCursor>( fb: &mut sonatina_ir::builder::FunctionBuilder, + db: &'db DriverDataBase, op: UnOp, inner: ValueId, + result_ty: hir::analysis::ty::ty_def::TyId<'db>, is: &sonatina_ir::inst::evm::inst_set::EvmInstSet, ) -> Result { + let op_ty = types::value_type(db, result_ty); + let prim = prim_for_runtime_value(db, result_ty); + let inner = prim + .map(|prim| coerce_scalar_value(fb, is, inner, op_ty, prim_is_signed(prim))) + .unwrap_or(inner); match op { UnOp::Not => { - // Logical not: normalize to i1, then keep Fe's word-level bool representation. - let is_zero = fb.insert_inst(IsZero::new(is, inner), Type::I1); - let result = fb.insert_inst(Zext::new(is, is_zero, Type::I256), Type::I256); - Ok(result) + let cond = condition_to_i1(fb, inner, is); + Ok(fb.insert_inst(IsZero::new(is, cond), Type::I1)) } UnOp::Minus => { // Arithmetic negation - let result = fb.insert_inst(Neg::new(is, inner), Type::I256); + let result = fb.insert_inst(Neg::new(is, inner), op_ty); Ok(result) } UnOp::BitNot => { // Bitwise not - let result = fb.insert_inst(Not::new(is, inner), Type::I256); + let result = fb.insert_inst(Not::new(is, inner), op_ty); Ok(result) } UnOp::Plus => { @@ -783,16 +873,18 @@ fn lower_unary_op( } /// Lower a binary operation. -fn lower_binary_op( +fn lower_binary_op<'db, C: sonatina_ir::func_cursor::FuncCursor>( fb: &mut sonatina_ir::builder::FunctionBuilder, + db: &'db DriverDataBase, op: BinOp, lhs: ValueId, rhs: ValueId, + lhs_ty: hir::analysis::ty::ty_def::TyId<'db>, is: &sonatina_ir::inst::evm::inst_set::EvmInstSet, ) -> Result { match op { - BinOp::Arith(arith_op) => lower_arith_op(fb, arith_op, lhs, rhs, is), - BinOp::Comp(comp_op) => lower_comp_op(fb, comp_op, lhs, rhs, is), + BinOp::Arith(arith_op) => lower_arith_op(fb, db, arith_op, lhs, rhs, lhs_ty, is), + BinOp::Comp(comp_op) => lower_comp_op(fb, db, comp_op, lhs, rhs, lhs_ty, is), BinOp::Logical(log_op) => lower_logical_op(fb, log_op, lhs, rhs, is), BinOp::Index => { // Index operations are handled via projections, not as binary ops @@ -802,26 +894,55 @@ fn lower_binary_op( } /// Lower an arithmetic binary operation. -fn lower_arith_op( +fn lower_arith_op<'db, C: sonatina_ir::func_cursor::FuncCursor>( fb: &mut sonatina_ir::builder::FunctionBuilder, + db: &'db DriverDataBase, op: ArithBinOp, lhs: ValueId, rhs: ValueId, + operand_ty: hir::analysis::ty::ty_def::TyId<'db>, is: &sonatina_ir::inst::evm::inst_set::EvmInstSet, ) -> Result { + let operand_ty = mir::repr::word_conversion_leaf_ty(db, operand_ty); + let op_ty = types::value_type(db, operand_ty); + let signed = if let TyData::TyBase(TyBase::Prim(prim)) = operand_ty.base_ty(db).data(db) { + prim_is_signed(*prim) + } else { + false + }; + let lhs = coerce_scalar_value(fb, is, lhs, op_ty, signed); + let rhs = coerce_scalar_value(fb, is, rhs, op_ty, signed); let result = match op { - ArithBinOp::Add => fb.insert_inst(Add::new(is, lhs, rhs), Type::I256), - ArithBinOp::Sub => fb.insert_inst(Sub::new(is, lhs, rhs), Type::I256), - ArithBinOp::Mul => fb.insert_inst(Mul::new(is, lhs, rhs), Type::I256), - ArithBinOp::Div => fb.insert_inst(EvmUdiv::new(is, lhs, rhs), Type::I256), - ArithBinOp::Rem => fb.insert_inst(EvmUmod::new(is, lhs, rhs), Type::I256), - ArithBinOp::Pow => fb.insert_inst(EvmExp::new(is, lhs, rhs), Type::I256), + ArithBinOp::Add => fb.insert_inst(Add::new(is, lhs, rhs), op_ty), + ArithBinOp::Sub => fb.insert_inst(Sub::new(is, lhs, rhs), op_ty), + ArithBinOp::Mul => fb.insert_inst(Mul::new(is, lhs, rhs), op_ty), + ArithBinOp::Div => { + if signed { + fb.insert_evm_sdivo(lhs, rhs)[0] + } else { + fb.insert_inst(EvmUdiv::new(is, lhs, rhs), op_ty) + } + } + ArithBinOp::Rem => { + if signed { + fb.insert_evm_smodo(lhs, rhs)[0] + } else { + fb.insert_inst(EvmUmod::new(is, lhs, rhs), op_ty) + } + } + ArithBinOp::Pow => fb.insert_inst(EvmExp::new(is, lhs, rhs), op_ty), // Shl/Shr take (bits, value). - ArithBinOp::LShift => fb.insert_inst(Shl::new(is, rhs, lhs), Type::I256), - ArithBinOp::RShift => fb.insert_inst(Shr::new(is, rhs, lhs), Type::I256), - ArithBinOp::BitOr => fb.insert_inst(Or::new(is, lhs, rhs), Type::I256), - ArithBinOp::BitXor => fb.insert_inst(Xor::new(is, lhs, rhs), Type::I256), - ArithBinOp::BitAnd => fb.insert_inst(And::new(is, lhs, rhs), Type::I256), + ArithBinOp::LShift => fb.insert_inst(Shl::new(is, rhs, lhs), op_ty), + ArithBinOp::RShift => { + if signed { + fb.insert_inst(Sar::new(is, rhs, lhs), op_ty) + } else { + fb.insert_inst(Shr::new(is, rhs, lhs), op_ty) + } + } + ArithBinOp::BitOr => fb.insert_inst(Or::new(is, lhs, rhs), op_ty), + ArithBinOp::BitXor => fb.insert_inst(Xor::new(is, lhs, rhs), op_ty), + ArithBinOp::BitAnd => fb.insert_inst(And::new(is, lhs, rhs), op_ty), ArithBinOp::Range => { // Range is handled at HIR level, shouldn't reach MIR binary ops return Err(LowerError::Unsupported("range operator".to_string())); @@ -831,43 +952,62 @@ fn lower_arith_op( } /// Lower a comparison binary operation. -fn lower_comp_op( +fn lower_comp_op<'db, C: sonatina_ir::func_cursor::FuncCursor>( fb: &mut sonatina_ir::builder::FunctionBuilder, + db: &'db DriverDataBase, op: CompBinOp, lhs: ValueId, rhs: ValueId, + operand_ty: hir::analysis::ty::ty_def::TyId<'db>, is: &sonatina_ir::inst::evm::inst_set::EvmInstSet, ) -> Result { + let operand_ty = mir::repr::word_conversion_leaf_ty(db, operand_ty); + let signed = if let TyData::TyBase(TyBase::Prim(prim)) = operand_ty.base_ty(db).data(db) { + prim_is_signed(*prim) + } else { + false + }; + let op_ty = types::value_type(db, operand_ty); + let lhs = coerce_scalar_value(fb, is, lhs, op_ty, signed); + let rhs = coerce_scalar_value(fb, is, rhs, op_ty, signed); let result = match op { - CompBinOp::Eq => { - let eq = fb.insert_inst(Eq::new(is, lhs, rhs), Type::I1); - fb.insert_inst(Zext::new(is, eq, Type::I256), Type::I256) - } + CompBinOp::Eq => fb.insert_inst(Eq::new(is, lhs, rhs), Type::I1), CompBinOp::NotEq => { // neq = iszero(eq(lhs, rhs)) let eq_result = fb.insert_inst(Eq::new(is, lhs, rhs), Type::I1); - let neq_i1 = fb.insert_inst(IsZero::new(is, eq_result), Type::I1); - fb.insert_inst(Zext::new(is, neq_i1, Type::I256), Type::I256) + fb.insert_inst(IsZero::new(is, eq_result), Type::I1) } CompBinOp::Lt => { - let lt = fb.insert_inst(Lt::new(is, lhs, rhs), Type::I1); - fb.insert_inst(Zext::new(is, lt, Type::I256), Type::I256) + if signed { + fb.insert_inst(Slt::new(is, lhs, rhs), Type::I1) + } else { + fb.insert_inst(Lt::new(is, lhs, rhs), Type::I1) + } } CompBinOp::LtEq => { // lhs <= rhs <==> !(lhs > rhs) - let gt_result = fb.insert_inst(Gt::new(is, lhs, rhs), Type::I1); - let lte_i1 = fb.insert_inst(IsZero::new(is, gt_result), Type::I1); - fb.insert_inst(Zext::new(is, lte_i1, Type::I256), Type::I256) + let gt_result = if signed { + fb.insert_inst(Slt::new(is, rhs, lhs), Type::I1) + } else { + fb.insert_inst(Gt::new(is, lhs, rhs), Type::I1) + }; + fb.insert_inst(IsZero::new(is, gt_result), Type::I1) } CompBinOp::Gt => { - let gt = fb.insert_inst(Gt::new(is, lhs, rhs), Type::I1); - fb.insert_inst(Zext::new(is, gt, Type::I256), Type::I256) + if signed { + fb.insert_inst(Slt::new(is, rhs, lhs), Type::I1) + } else { + fb.insert_inst(Gt::new(is, lhs, rhs), Type::I1) + } } CompBinOp::GtEq => { // lhs >= rhs <==> !(lhs < rhs) - let lt_result = fb.insert_inst(Lt::new(is, lhs, rhs), Type::I1); - let gte_i1 = fb.insert_inst(IsZero::new(is, lt_result), Type::I1); - fb.insert_inst(Zext::new(is, gte_i1, Type::I256), Type::I256) + let lt_result = if signed { + fb.insert_inst(Slt::new(is, lhs, rhs), Type::I1) + } else { + fb.insert_inst(Lt::new(is, lhs, rhs), Type::I1) + }; + fb.insert_inst(IsZero::new(is, lt_result), Type::I1) } }; Ok(result) @@ -881,10 +1021,9 @@ fn lower_logical_op( rhs: ValueId, is: &sonatina_ir::inst::evm::inst_set::EvmInstSet, ) -> Result { - // Logical ops work on booleans (I1), but we use I256 for EVM let result = match op { - LogicalBinOp::And => fb.insert_inst(And::new(is, lhs, rhs), Type::I256), - LogicalBinOp::Or => fb.insert_inst(Or::new(is, lhs, rhs), Type::I256), + LogicalBinOp::And => fb.insert_inst(And::new(is, lhs, rhs), Type::I1), + LogicalBinOp::Or => fb.insert_inst(Or::new(is, lhs, rhs), Type::I1), }; Ok(result) } @@ -1146,24 +1285,7 @@ fn bytes_to_i256(bytes: &[u8]) -> I256 { /// Returns the Sonatina Type for a Fe primitive type, or None if not a sub-word type. fn prim_to_sonatina_type(prim: PrimTy) -> Option { - match prim { - PrimTy::Bool => Some(Type::I1), - PrimTy::U8 | PrimTy::I8 => Some(Type::I8), - PrimTy::U16 | PrimTy::I16 => Some(Type::I16), - PrimTy::U32 | PrimTy::I32 => Some(Type::I32), - PrimTy::U64 | PrimTy::I64 => Some(Type::I64), - PrimTy::U128 | PrimTy::I128 => Some(Type::I128), - // Full-width types don't need conversion - PrimTy::U256 - | PrimTy::I256 - | PrimTy::Usize - | PrimTy::Isize - | PrimTy::View - | PrimTy::BorrowMut - | PrimTy::BorrowRef => None, - // Non-scalar types - PrimTy::String | PrimTy::Array | PrimTy::Tuple(_) | PrimTy::Ptr => None, - } + types::prim_scalar_type(prim).filter(|ty| *ty != Type::I256) } /// Returns true if the primitive type is signed. @@ -1180,12 +1302,118 @@ fn prim_is_signed(prim: PrimTy) -> bool { ) } +fn int_type_bits(ty: Type) -> Option { + match ty { + Type::I1 => Some(1), + Type::I8 => Some(8), + Type::I16 => Some(16), + Type::I32 => Some(32), + Type::I64 => Some(64), + Type::I128 => Some(128), + Type::I256 => Some(256), + _ => None, + } +} + +fn cast_int_value( + fb: &mut sonatina_ir::builder::FunctionBuilder, + is: &sonatina_ir::inst::evm::inst_set::EvmInstSet, + value: ValueId, + target_ty: Type, + signed: bool, +) -> ValueId { + let current_ty = fb.type_of(value); + if current_ty == target_ty { + return value; + } + + let Some(current_bits) = int_type_bits(current_ty) else { + return value; + }; + let Some(target_bits) = int_type_bits(target_ty) else { + return value; + }; + + if current_bits > target_bits { + fb.insert_inst(Trunc::new(is, value, target_ty), target_ty) + } else if current_bits < target_bits { + if signed && current_ty != Type::I1 { + fb.insert_inst(Sext::new(is, value, target_ty), target_ty) + } else { + fb.insert_inst(Zext::new(is, value, target_ty), target_ty) + } + } else { + value + } +} + +fn prim_for_runtime_value<'db>( + db: &'db DriverDataBase, + ty: hir::analysis::ty::ty_def::TyId<'db>, +) -> Option { + let ty = match ty.as_capability(db) { + Some((CapabilityKind::View, inner)) => inner, + _ => ty, + }; + let ty = mir::repr::word_conversion_leaf_ty(db, ty); + let TyData::TyBase(TyBase::Prim(prim)) = ty.base_ty(db).data(db) else { + return None; + }; + Some(*prim) +} + +fn coerce_scalar_value( + fb: &mut sonatina_ir::builder::FunctionBuilder, + is: &sonatina_ir::inst::evm::inst_set::EvmInstSet, + value: ValueId, + target_ty: Type, + signed: bool, +) -> ValueId { + if target_ty == Type::I1 { + condition_to_i1(fb, value, is) + } else { + cast_int_value(fb, is, value, target_ty, signed) + } +} + +fn coerce_runtime_value<'db, C: sonatina_ir::func_cursor::FuncCursor>( + fb: &mut sonatina_ir::builder::FunctionBuilder, + db: &'db DriverDataBase, + value: ValueId, + value_ty: hir::analysis::ty::ty_def::TyId<'db>, + target_ty: Type, + is: &sonatina_ir::inst::evm::inst_set::EvmInstSet, +) -> ValueId { + let current_ty = fb.type_of(value); + if current_ty == target_ty { + return value; + } + if target_ty == Type::Unit { + return types::zero_value(fb, Type::Unit); + } + if current_ty == Type::Unit { + return types::zero_value(fb, target_ty); + } + + match prim_for_runtime_value(db, value_ty) { + Some(PrimTy::Bool) => coerce_scalar_value(fb, is, value, target_ty, false), + Some(prim) => coerce_scalar_value(fb, is, value, target_ty, prim_is_signed(prim)), + None => cast_int_value(fb, is, value, target_ty, false), + } +} + +fn make_int_immediate( + fb: &mut sonatina_ir::builder::FunctionBuilder, + value: I256, + ty: Type, +) -> ValueId { + fb.make_imm_value(Immediate::from_i256(value, ty)) +} + /// Applies `from_word` conversion after loading a value. /// -/// This mirrors the stdlib `WordRepr::from_word` semantics: -/// - bool: convert to 0 or 1 -/// - unsigned sub-word: mask to appropriate width -/// - signed sub-word: mask then sign-extend +/// This mirrors the stdlib `WordRepr::from_word` semantics, but returns the +/// loaded value at its natural Sonatina type. fn apply_from_word<'db, C: sonatina_ir::func_cursor::FuncCursor>( fb: &mut sonatina_ir::builder::FunctionBuilder, db: &'db DriverDataBase, @@ -1198,33 +1426,10 @@ fn apply_from_word<'db, C: sonatina_ir::func_cursor::FuncCursor>( if let TyData::TyBase(TyBase::Prim(prim)) = base_ty.data(db) { match prim { - PrimTy::Bool => { - // bool: value != 0 → 0 or 1 - let zero = fb.make_imm_value(I256::zero()); - let cmp = Ne::new(is, raw_value, zero); - let bool_val = fb.insert_inst(cmp, Type::I1); - // Extend back to I256 - let ext = Zext::new(is, bool_val, Type::I256); - fb.insert_inst(ext, Type::I256) - } - _ => { - if let Some(small_ty) = prim_to_sonatina_type(*prim) { - // Truncate to small type then extend back - let trunc = Trunc::new(is, raw_value, small_ty); - let truncated = fb.insert_inst(trunc, small_ty); - - if prim_is_signed(*prim) { - let ext = Sext::new(is, truncated, Type::I256); - fb.insert_inst(ext, Type::I256) - } else { - let ext = Zext::new(is, truncated, Type::I256); - fb.insert_inst(ext, Type::I256) - } - } else { - // Full-width type, no conversion needed - raw_value - } - } + PrimTy::Bool => condition_to_i1(fb, raw_value, is), + _ => prim_to_sonatina_type(*prim) + .map(|small_ty| cast_int_value(fb, is, raw_value, small_ty, prim_is_signed(*prim))) + .unwrap_or(raw_value), } } else { // Non-primitive type, no conversion @@ -1234,10 +1439,8 @@ fn apply_from_word<'db, C: sonatina_ir::func_cursor::FuncCursor>( /// Applies `to_word` conversion before storing a value. /// -/// This mirrors the stdlib `WordRepr::to_word` semantics: -/// - bool: convert to 0 or 1 -/// - unsigned sub-word: mask to appropriate width -/// - signed: no conversion needed (already sign-extended) +/// This mirrors the stdlib `WordRepr::to_word` semantics, converting a natural-width +/// Sonatina integer back into an EVM word. fn apply_to_word<'db, C: sonatina_ir::func_cursor::FuncCursor>( fb: &mut sonatina_ir::builder::FunctionBuilder, db: &'db DriverDataBase, @@ -1251,26 +1454,19 @@ fn apply_to_word<'db, C: sonatina_ir::func_cursor::FuncCursor>( if let TyData::TyBase(TyBase::Prim(prim)) = base_ty.data(db) { match prim { PrimTy::Bool => { - // bool: value != 0 → 0 or 1 - let zero = fb.make_imm_value(I256::zero()); - let cmp = Ne::new(is, value, zero); - let bool_val = fb.insert_inst(cmp, Type::I1); - let ext = Zext::new(is, bool_val, Type::I256); - fb.insert_inst(ext, Type::I256) + let bool_val = condition_to_i1(fb, value, is); + fb.insert_inst(Zext::new(is, bool_val, Type::I256), Type::I256) } - PrimTy::U8 | PrimTy::U16 | PrimTy::U32 | PrimTy::U64 | PrimTy::U128 => { - // Unsigned: truncate then zero-extend to mask high bits - if let Some(small_ty) = prim_to_sonatina_type(*prim) { - let trunc = Trunc::new(is, value, small_ty); - let truncated = fb.insert_inst(trunc, small_ty); - let ext = Zext::new(is, truncated, Type::I256); - fb.insert_inst(ext, Type::I256) - } else { - value - } - } - // Signed types and full-width types don't need conversion - _ => value, + _ => prim_to_sonatina_type(*prim) + .map(|small_ty| { + let cast = cast_int_value(fb, is, value, small_ty, prim_is_signed(*prim)); + if prim_is_signed(*prim) { + fb.insert_inst(Sext::new(is, cast, Type::I256), Type::I256) + } else { + fb.insert_inst(Zext::new(is, cast, Type::I256), Type::I256) + } + }) + .unwrap_or(value), } } else { // Non-primitive type, no conversion @@ -1319,26 +1515,6 @@ fn fe_ty_to_sonatina_inner<'db, C: sonatina_ir::func_cursor::FuncCursor>( let base_ty = ty.base_ty(db); match base_ty.data(db) { TyData::TyBase(TyBase::Prim(prim)) => match prim { - // Scalars: all map to I256 on EVM - PrimTy::Bool - | PrimTy::U8 - | PrimTy::I8 - | PrimTy::U16 - | PrimTy::I16 - | PrimTy::U32 - | PrimTy::I32 - | PrimTy::U64 - | PrimTy::I64 - | PrimTy::U128 - | PrimTy::I128 - | PrimTy::U256 - | PrimTy::I256 - | PrimTy::Usize - | PrimTy::Isize - | PrimTy::Ptr - | PrimTy::View - | PrimTy::BorrowMut - | PrimTy::BorrowRef => Some(Type::I256), PrimTy::String => None, PrimTy::Tuple(_) => { let field_tys = ty.field_types(db); @@ -1367,6 +1543,7 @@ fn fe_ty_to_sonatina_inner<'db, C: sonatina_ir::func_cursor::FuncCursor>( fe_ty_to_sonatina(fb, db, target_layout, elem_ty, cache, name_counter)?; Some(fb.declare_array_type(sonatina_elem, len)) } + _ => Some(types::value_type(db, ty)), }, TyData::TyBase(TyBase::Adt(adt_def)) => { match adt_def.adt_ref(db) { @@ -1774,12 +1951,33 @@ pub(super) fn lower_terminator<'db, C: sonatina_ir::func_cursor::FuncCursor>( } else { // Non-entry function: emit internal Return for function call semantics. let ret_sonatina = if let Some(v) = ret_val { - Some(lower_value(ctx, *v)?) + let value = lower_value(ctx, *v)?; + let value_ty = ctx + .body + .values + .get(v.index()) + .ok_or_else(|| LowerError::Internal("unknown return value".to_string()))? + .ty; + let ret_ty = ctx.ret_ty.ok_or_else(|| { + LowerError::Internal( + "function returns a value but LowerCtx.ret_ty is missing".to_string(), + ) + })?; + Some(coerce_runtime_value( + ctx.fb, + ctx.db, + value, + value_ty, + types::value_type(ctx.db, ret_ty), + ctx.is, + )) } else { None }; - ctx.fb - .insert_inst_no_result(Return::new(ctx.is, ret_sonatina)); + let ret_args = ret_sonatina + .map(|value| smallvec1::smallvec![value].into()) + .unwrap_or_default(); + ctx.fb.insert_inst_no_result(Return::new(ctx.is, ret_args)); } } Terminator::Goto { target, .. } => { @@ -1816,11 +2014,14 @@ pub(super) fn lower_terminator<'db, C: sonatina_ir::func_cursor::FuncCursor>( return Ok(()); } + let discr_ty = ctx.fb.type_of(discr_val); let mut cases = Vec::with_capacity(targets.len()); for target in targets { - let value = ctx - .fb - .make_imm_value(biguint_to_i256(&target.value.as_biguint())); + let value = make_int_immediate( + ctx.fb, + biguint_to_i256(&target.value.as_biguint()), + discr_ty, + ); let dest = ctx.block_map[&target.block]; cases.push((value, dest)); } @@ -1864,9 +2065,22 @@ pub(super) fn lower_terminator<'db, C: sonatina_ir::func_cursor::FuncCursor>( } } - let func_ref = ctx.name_map.get(callee_name).ok_or_else(|| { - LowerError::Internal(format!("unknown function: {callee_name}")) - })?; + if let Some(builtin) = call.builtin_terminator { + match builtin { + BuiltinTerminatorKind::Abort => { + let zero = ctx.fb.make_imm_value(I256::zero()); + ctx.fb + .insert_inst_no_result(EvmRevert::new(ctx.is, zero, zero)); + return Ok(()); + } + } + } + + let Some(func_ref) = ctx.name_map.get(callee_name) else { + return Err(LowerError::Internal(format!( + "missing sonatina callee for terminating call: {callee_name}" + ))); + }; let args = lower_call_args( ctx, @@ -2210,10 +2424,11 @@ fn condition_to_i1( cond: ValueId, is: &sonatina_ir::inst::evm::inst_set::EvmInstSet, ) -> ValueId { - if fb.type_of(cond) == Type::I1 { + let cond_ty = fb.type_of(cond); + if cond_ty == Type::I1 { cond } else { - let zero = fb.make_imm_value(I256::zero()); + let zero = types::zero_value(fb, cond_ty); fb.insert_inst(Ne::new(is, cond, zero), Type::I1) } } @@ -2341,3 +2556,448 @@ fn bitcast_ptr<'db, C: sonatina_ir::func_cursor::FuncCursor>( ctx.fb .insert_inst(Bitcast::new(ctx.is, ptr, ptr_ty), ptr_ty) } + +fn ensure_overflow_revert_block<'db, C: sonatina_ir::func_cursor::FuncCursor>( + ctx: &mut LowerCtx<'_, 'db, C>, +) -> Result { + if let Some(block) = *ctx.overflow_revert_block { + return Ok(block); + } + + let origin_block = ctx + .fb + .current_block() + .ok_or_else(|| LowerError::Internal("missing current block".to_string()))?; + let revert_block = ctx.fb.append_block(); + ctx.fb.switch_to_block(revert_block); + let zero = ctx.fb.make_imm_value(I256::zero()); + ctx.fb + .insert_inst_no_result(EvmRevert::new(ctx.is, zero, zero)); + ctx.fb.switch_to_block(origin_block); + *ctx.overflow_revert_block = Some(revert_block); + Ok(revert_block) +} + +/// Emit a conditional branch to the shared overflow revert block if `overflow_flag` (I1) is true. +fn emit_overflow_revert<'db, C: sonatina_ir::func_cursor::FuncCursor>( + ctx: &mut LowerCtx<'_, 'db, C>, + overflow_flag: ValueId, +) -> Result<(), LowerError> { + let revert_block = ensure_overflow_revert_block(ctx)?; + let continue_block = ctx.fb.append_block(); + ctx.fb + .insert_inst_no_result(Br::new(ctx.is, overflow_flag, revert_block, continue_block)); + ctx.fb.switch_to_block(continue_block); + Ok(()) +} + +fn checked_intrinsic_prim<'db>( + db: &'db DriverDataBase, + ty: hir::analysis::ty::ty_def::TyId<'db>, +) -> Result { + let base_ty = ty.base_ty(db); + let TyData::TyBase(TyBase::Prim(prim)) = base_ty.data(db) else { + return Err(LowerError::Internal(format!( + "checked intrinsic type must be a primitive integer, got `{}`", + ty.pretty_print(db) + ))); + }; + if !prim.is_integral() { + return Err(LowerError::Internal(format!( + "checked intrinsic type must be integral, got `{}`", + ty.pretty_print(db) + ))); + } + Ok(*prim) +} + +fn checked_intrinsic_value_type(prim: PrimTy) -> Result { + types::prim_scalar_type(prim).ok_or_else(|| { + LowerError::Internal(format!( + "checked intrinsic type must be integral, got `{prim:?}`" + )) + }) +} + +fn lower_checked_operand( + fb: &mut sonatina_ir::builder::FunctionBuilder, + is: &sonatina_ir::inst::evm::inst_set::EvmInstSet, + value: ValueId, + op_ty: Type, + signed: bool, +) -> ValueId { + cast_int_value(fb, is, value, op_ty, signed) +} + +fn lower_checked_intrinsic<'db, C: sonatina_ir::func_cursor::FuncCursor>( + ctx: &mut LowerCtx<'_, 'db, C>, + checked: CheckedIntrinsic<'db>, + args: &[mir::ir::ValueId], +) -> Result { + let prim = checked_intrinsic_prim(ctx.db, checked.ty)?; + let op_ty = checked_intrinsic_value_type(prim)?; + let signed = prim_is_signed(prim); + + match checked.op { + CheckedArithmeticOp::Add => { + let [a, b] = args else { + return Err(LowerError::Internal(format!( + "checked add expects 2 arguments, got {}", + args.len() + ))); + }; + let lhs_word = lower_value(ctx, *a)?; + let rhs_word = lower_value(ctx, *b)?; + let lhs = lower_checked_operand(ctx.fb, ctx.is, lhs_word, op_ty, signed); + let rhs = lower_checked_operand(ctx.fb, ctx.is, rhs_word, op_ty, signed); + let [raw, overflow] = if signed { + ctx.fb.insert_saddo(lhs, rhs) + } else { + ctx.fb.insert_uaddo(lhs, rhs) + }; + emit_overflow_revert(ctx, overflow)?; + Ok(raw) + } + CheckedArithmeticOp::Sub => { + let [a, b] = args else { + return Err(LowerError::Internal(format!( + "checked sub expects 2 arguments, got {}", + args.len() + ))); + }; + let lhs_word = lower_value(ctx, *a)?; + let rhs_word = lower_value(ctx, *b)?; + let lhs = lower_checked_operand(ctx.fb, ctx.is, lhs_word, op_ty, signed); + let rhs = lower_checked_operand(ctx.fb, ctx.is, rhs_word, op_ty, signed); + let [raw, overflow] = if signed { + ctx.fb.insert_ssubo(lhs, rhs) + } else { + ctx.fb.insert_usubo(lhs, rhs) + }; + emit_overflow_revert(ctx, overflow)?; + Ok(raw) + } + CheckedArithmeticOp::Mul => { + let [a, b] = args else { + return Err(LowerError::Internal(format!( + "checked mul expects 2 arguments, got {}", + args.len() + ))); + }; + let lhs_word = lower_value(ctx, *a)?; + let rhs_word = lower_value(ctx, *b)?; + let lhs = lower_checked_operand(ctx.fb, ctx.is, lhs_word, op_ty, signed); + let rhs = lower_checked_operand(ctx.fb, ctx.is, rhs_word, op_ty, signed); + let [raw, overflow] = if signed { + ctx.fb.insert_smulo(lhs, rhs) + } else { + ctx.fb.insert_umulo(lhs, rhs) + }; + emit_overflow_revert(ctx, overflow)?; + Ok(raw) + } + CheckedArithmeticOp::Div => { + let [a, b] = args else { + return Err(LowerError::Internal(format!( + "checked div expects 2 arguments, got {}", + args.len() + ))); + }; + let lhs_word = lower_value(ctx, *a)?; + let rhs_word = lower_value(ctx, *b)?; + let lhs = lower_checked_operand(ctx.fb, ctx.is, lhs_word, op_ty, signed); + let rhs = lower_checked_operand(ctx.fb, ctx.is, rhs_word, op_ty, signed); + let [raw, overflow] = if signed { + ctx.fb.insert_evm_sdivo(lhs, rhs) + } else { + ctx.fb.insert_evm_udivo(lhs, rhs) + }; + emit_overflow_revert(ctx, overflow)?; + Ok(raw) + } + CheckedArithmeticOp::Rem => { + let [a, b] = args else { + return Err(LowerError::Internal(format!( + "checked rem expects 2 arguments, got {}", + args.len() + ))); + }; + let lhs_word = lower_value(ctx, *a)?; + let rhs_word = lower_value(ctx, *b)?; + let lhs = lower_checked_operand(ctx.fb, ctx.is, lhs_word, op_ty, signed); + let rhs = lower_checked_operand(ctx.fb, ctx.is, rhs_word, op_ty, signed); + let [raw, overflow] = if signed { + ctx.fb.insert_evm_smodo(lhs, rhs) + } else { + ctx.fb.insert_evm_umodo(lhs, rhs) + }; + emit_overflow_revert(ctx, overflow)?; + Ok(raw) + } + CheckedArithmeticOp::Neg => { + let [arg] = args else { + return Err(LowerError::Internal(format!( + "checked neg expects 1 argument, got {}", + args.len() + ))); + }; + if !signed { + return Err(LowerError::Internal(format!( + "checked neg is not defined for unsigned type `{}`", + checked.ty.pretty_print(ctx.db) + ))); + } + let val_word = lower_value(ctx, *arg)?; + let val = lower_checked_operand(ctx.fb, ctx.is, val_word, op_ty, true); + let [raw, overflow] = ctx.fb.insert_snego(val); + emit_overflow_revert(ctx, overflow)?; + Ok(raw) + } + } +} + +/// Maps a raw core intrinsic suffix to the primitive type it operates on. +const INTRINSIC_SUFFIX_TYPES: &[(&str, PrimTy)] = &[ + ("_u8", PrimTy::U8), + ("_u16", PrimTy::U16), + ("_u32", PrimTy::U32), + ("_u64", PrimTy::U64), + ("_u128", PrimTy::U128), + ("_u256", PrimTy::U256), + ("_usize", PrimTy::Usize), + ("_i8", PrimTy::I8), + ("_i16", PrimTy::I16), + ("_i32", PrimTy::I32), + ("_i64", PrimTy::I64), + ("_i128", PrimTy::I128), + ("_i256", PrimTy::I256), + ("_isize", PrimTy::Isize), + ("_bool", PrimTy::Bool), +]; + +fn intrinsic_name_parts(callee_name: &str) -> Option<(&str, PrimTy)> { + INTRINSIC_SUFFIX_TYPES.iter().find_map(|(suffix, prim)| { + callee_name + .strip_suffix(suffix) + .and_then(|prefix| prefix.strip_prefix("__")) + .map(|op| (op, *prim)) + }) +} + +fn intrinsic_value_type(prim: PrimTy) -> Type { + types::prim_scalar_type(prim).unwrap_or(Type::I256) +} + +fn lower_intrinsic_operand( + fb: &mut sonatina_ir::builder::FunctionBuilder, + is: &sonatina_ir::inst::evm::inst_set::EvmInstSet, + value: ValueId, + prim: PrimTy, + op_ty: Type, +) -> ValueId { + if prim == PrimTy::Bool { + condition_to_i1(fb, value, is) + } else { + cast_int_value(fb, is, value, op_ty, prim_is_signed(prim)) + } +} + +/// Try to lower a `___` core numeric intrinsic to native Sonatina +/// instructions. Returns `Ok(Some(value))` if the intrinsic was handled, +/// `Ok(None)` if the callee name is not a recognized intrinsic. +fn try_lower_numeric_intrinsic( + ctx: &mut LowerCtx<'_, '_, C>, + callee_name: &str, + args: &[mir::ir::ValueId], +) -> Result, LowerError> { + if !callee_name.starts_with("__") { + return Ok(None); + } + + // Strip the type suffix to get the operation name. + let Some((op, prim)) = intrinsic_name_parts(callee_name) else { + return Ok(None); + }; + let op_ty = intrinsic_value_type(prim); + let signed = prim_is_signed(prim); + + if op.starts_with("checked_") { + return Err(LowerError::Internal(format!( + "checked arithmetic intrinsic `{callee_name}` must be lowered via typed checked metadata" + ))); + } + + match op { + // Emit Sonatina ops at the intrinsic's actual width and let the EVM + // legalizer normalize masks/sign extension for sub-word integers. + "lt" | "gt" | "eq" | "ne" | "le" | "ge" => { + let (lhs_word, rhs_word) = lower_binary_args(ctx, callee_name, args)?; + let lhs = lower_intrinsic_operand(ctx.fb, ctx.is, lhs_word, prim, op_ty); + let rhs = lower_intrinsic_operand(ctx.fb, ctx.is, rhs_word, prim, op_ty); + let cmp = match op { + "lt" => { + if signed { + ctx.fb.insert_inst(Slt::new(ctx.is, lhs, rhs), Type::I1) + } else { + ctx.fb.insert_inst(Lt::new(ctx.is, lhs, rhs), Type::I1) + } + } + "gt" => { + if signed { + ctx.fb.insert_inst(Slt::new(ctx.is, rhs, lhs), Type::I1) + } else { + ctx.fb.insert_inst(Gt::new(ctx.is, lhs, rhs), Type::I1) + } + } + "eq" => ctx.fb.insert_inst(Eq::new(ctx.is, lhs, rhs), Type::I1), + "ne" => { + let eq = ctx.fb.insert_inst(Eq::new(ctx.is, lhs, rhs), Type::I1); + ctx.fb.insert_inst(IsZero::new(ctx.is, eq), Type::I1) + } + "le" => { + let gt = if signed { + ctx.fb.insert_inst(Slt::new(ctx.is, rhs, lhs), Type::I1) + } else { + ctx.fb.insert_inst(Gt::new(ctx.is, lhs, rhs), Type::I1) + }; + ctx.fb.insert_inst(IsZero::new(ctx.is, gt), Type::I1) + } + "ge" => { + let lt = if signed { + ctx.fb.insert_inst(Slt::new(ctx.is, lhs, rhs), Type::I1) + } else { + ctx.fb.insert_inst(Lt::new(ctx.is, lhs, rhs), Type::I1) + }; + ctx.fb.insert_inst(IsZero::new(ctx.is, lt), Type::I1) + } + _ => unreachable!(), + }; + Ok(Some(cmp)) + } + + "add" | "sub" | "mul" | "pow" | "shl" => { + let (lhs_word, rhs_word) = lower_binary_args(ctx, callee_name, args)?; + let lhs = lower_intrinsic_operand(ctx.fb, ctx.is, lhs_word, prim, op_ty); + let rhs = lower_intrinsic_operand(ctx.fb, ctx.is, rhs_word, prim, op_ty); + let raw = match op { + "add" => ctx.fb.insert_inst(Add::new(ctx.is, lhs, rhs), op_ty), + "sub" => ctx.fb.insert_inst(Sub::new(ctx.is, lhs, rhs), op_ty), + "mul" => ctx.fb.insert_inst(Mul::new(ctx.is, lhs, rhs), op_ty), + "pow" => ctx.fb.insert_inst(EvmExp::new(ctx.is, lhs, rhs), op_ty), + "shl" => ctx.fb.insert_inst(Shl::new(ctx.is, rhs, lhs), op_ty), + _ => unreachable!(), + }; + Ok(Some(raw)) + } + "div" => { + let (lhs_word, rhs_word) = lower_binary_args(ctx, callee_name, args)?; + let lhs = lower_intrinsic_operand(ctx.fb, ctx.is, lhs_word, prim, op_ty); + let rhs = lower_intrinsic_operand(ctx.fb, ctx.is, rhs_word, prim, op_ty); + let [raw, _overflow] = if signed { + ctx.fb.insert_evm_sdivo(lhs, rhs) + } else { + ctx.fb.insert_evm_udivo(lhs, rhs) + }; + Ok(Some(raw)) + } + "rem" => { + let (lhs_word, rhs_word) = lower_binary_args(ctx, callee_name, args)?; + let lhs = lower_intrinsic_operand(ctx.fb, ctx.is, lhs_word, prim, op_ty); + let rhs = lower_intrinsic_operand(ctx.fb, ctx.is, rhs_word, prim, op_ty); + let [raw, _overflow] = if signed { + ctx.fb.insert_evm_smodo(lhs, rhs) + } else { + ctx.fb.insert_evm_umodo(lhs, rhs) + }; + Ok(Some(raw)) + } + "shr" => { + let (lhs_word, rhs_word) = lower_binary_args(ctx, callee_name, args)?; + let lhs = lower_intrinsic_operand(ctx.fb, ctx.is, lhs_word, prim, op_ty); + let rhs = lower_intrinsic_operand(ctx.fb, ctx.is, rhs_word, prim, op_ty); + let raw = if signed { + ctx.fb.insert_inst(Sar::new(ctx.is, rhs, lhs), op_ty) + } else { + ctx.fb.insert_inst(Shr::new(ctx.is, rhs, lhs), op_ty) + }; + Ok(Some(raw)) + } + + "bitand" => { + let (lhs_word, rhs_word) = lower_binary_args(ctx, callee_name, args)?; + let lhs = lower_intrinsic_operand(ctx.fb, ctx.is, lhs_word, prim, op_ty); + let rhs = lower_intrinsic_operand(ctx.fb, ctx.is, rhs_word, prim, op_ty); + let raw = ctx.fb.insert_inst(And::new(ctx.is, lhs, rhs), op_ty); + Ok(Some(raw)) + } + "bitor" => { + let (lhs_word, rhs_word) = lower_binary_args(ctx, callee_name, args)?; + let lhs = lower_intrinsic_operand(ctx.fb, ctx.is, lhs_word, prim, op_ty); + let rhs = lower_intrinsic_operand(ctx.fb, ctx.is, rhs_word, prim, op_ty); + let raw = ctx.fb.insert_inst(Or::new(ctx.is, lhs, rhs), op_ty); + Ok(Some(raw)) + } + "bitxor" => { + let (lhs_word, rhs_word) = lower_binary_args(ctx, callee_name, args)?; + let lhs = lower_intrinsic_operand(ctx.fb, ctx.is, lhs_word, prim, op_ty); + let rhs = lower_intrinsic_operand(ctx.fb, ctx.is, rhs_word, prim, op_ty); + let raw = ctx.fb.insert_inst(Xor::new(ctx.is, lhs, rhs), op_ty); + Ok(Some(raw)) + } + + "bitnot" => { + let val_word = lower_unary_arg(ctx, callee_name, args)?; + let val = lower_intrinsic_operand(ctx.fb, ctx.is, val_word, prim, op_ty); + let raw = ctx.fb.insert_inst(Not::new(ctx.is, val), op_ty); + Ok(Some(raw)) + } + "not" => { + if prim != PrimTy::Bool { + return Err(LowerError::Internal(format!( + "logical not intrinsic must be bool-typed, got `{callee_name}`" + ))); + } + let val_word = lower_unary_arg(ctx, callee_name, args)?; + let val = lower_intrinsic_operand(ctx.fb, ctx.is, val_word, prim, op_ty); + let is_zero = ctx.fb.insert_inst(IsZero::new(ctx.is, val), Type::I1); + Ok(Some(is_zero)) + } + "neg" => { + let val_word = lower_unary_arg(ctx, callee_name, args)?; + let val = lower_intrinsic_operand(ctx.fb, ctx.is, val_word, prim, op_ty); + let raw = ctx.fb.insert_inst(Neg::new(ctx.is, val), op_ty); + Ok(Some(raw)) + } + + // Not a recognized intrinsic operation. + _ => Ok(None), + } +} + +fn lower_binary_args( + ctx: &mut LowerCtx<'_, '_, C>, + callee_name: &str, + args: &[mir::ir::ValueId], +) -> Result<(ValueId, ValueId), LowerError> { + let [a, b] = args else { + return Err(LowerError::Internal(format!( + "{callee_name} requires 2 arguments" + ))); + }; + let lhs = lower_value(ctx, *a)?; + let rhs = lower_value(ctx, *b)?; + Ok((lhs, rhs)) +} + +fn lower_unary_arg( + ctx: &mut LowerCtx<'_, '_, C>, + callee_name: &str, + args: &[mir::ir::ValueId], +) -> Result { + let [a] = args else { + return Err(LowerError::Internal(format!( + "{callee_name} requires 1 argument" + ))); + }; + lower_value(ctx, *a) +} diff --git a/crates/codegen/src/sonatina/mod.rs b/crates/codegen/src/sonatina/mod.rs index 91e1ac3064..7578dcdd1f 100644 --- a/crates/codegen/src/sonatina/mod.rs +++ b/crates/codegen/src/sonatina/mod.rs @@ -14,7 +14,7 @@ use hir::hir_def::TopLevelMod; use mir::{MirModule, layout, layout::TargetDataLayout, lower_ingot, lower_module}; use rustc_hash::{FxHashMap, FxHashSet}; use sonatina_ir::{ - BlockId, GlobalVariableRef, I256, Module, Signature, Type, ValueId, + BlockId, GlobalVariableRef, Module, Signature, Type, ValueId, builder::{ModuleBuilder, Variable}, func_cursor::InstInserter, inst::{control_flow::Call, evm::EvmStop}, @@ -415,8 +415,6 @@ struct ModuleLowerer<'db, 'a> { func_map: FxHashMap, /// Maps function symbol names to Sonatina function references. name_map: FxHashMap, - /// Maps function symbol names to whether they return a value. - returns_value_map: FxHashMap, /// Maps function symbol names to a parameter mask indicating which MIR arguments are /// runtime-visible (not erased) and therefore must be passed on the EVM stack. /// @@ -460,7 +458,6 @@ impl<'db, 'a> ModuleLowerer<'db, 'a> { contract_selection, func_map: FxHashMap::default(), name_map: FxHashMap::default(), - returns_value_map: FxHashMap::default(), runtime_param_masks: FxHashMap::default(), entry_func_idxs: FxHashSet::default(), gep_type_cache: FxHashMap::default(), @@ -509,8 +506,6 @@ impl<'db, 'a> ModuleLowerer<'db, 'a> { self.func_map.insert(idx, func_ref); self.name_map.insert(name.clone(), func_ref); - self.returns_value_map - .insert(name.clone(), func.returns_value); self.runtime_param_masks.insert(name.clone(), mask); } Ok(()) @@ -527,6 +522,15 @@ impl<'db, 'a> ModuleLowerer<'db, 'a> { // Keep lowered functions private so Sonatina DFE can eliminate dead functions. // Reachability roots are selected via object section entries, not linkage visibility. let linkage = sonatina_ir::Linkage::Private; + let declared_param_runtime_ty = |local_id: mir::LocalId| -> Result { + let local_ty = func + .body + .locals + .get(local_id.index()) + .ok_or_else(|| LowerError::Internal(format!("unknown param local: {local_id:?}")))? + .ty; + Ok(types::runtime_type(self.db, &self.target_layout, local_ty)) + }; // Contract init/runtime entrypoints are executed directly by the EVM with an empty stack. // Even though MIR models them as taking effect args (e.g. `StorPtr`), we cannot @@ -550,53 +554,36 @@ impl<'db, 'a> ModuleLowerer<'db, 'a> { // Keep it empty; callers should never pass arguments to EVM entrypoints. } else { for local_id in func.body.param_locals.iter().copied() { - let local_ty = func - .body - .locals - .get(local_id.index()) - .ok_or_else(|| { - LowerError::Internal(format!("unknown param local: {local_id:?}")) - })? - .ty; - mask.push(!is_erased_runtime_ty( - self.db, - &self.target_layout, - local_ty, - )); + mask.push(declared_param_runtime_ty(local_id)? != Type::Unit); } for local_id in func.body.effect_param_locals.iter().copied() { - let local_ty = func - .body - .locals - .get(local_id.index()) - .ok_or_else(|| { - LowerError::Internal(format!("unknown effect param local: {local_id:?}")) - })? - .ty; - mask.push(!is_erased_runtime_ty( - self.db, - &self.target_layout, - local_ty, - )); + mask.push(declared_param_runtime_ty(local_id)? != Type::Unit); } } - // Convert parameter types - all EVM parameters are 256-bit words. + // Convert parameter types to their runtime Sonatina types. let mut params = Vec::new(); - for keep in &mask { - if *keep { - params.push(types::word_type()); + for (local_id, keep) in func + .body + .param_locals + .iter() + .chain(func.body.effect_param_locals.iter()) + .copied() + .zip(mask.iter().copied()) + { + if keep { + params.push(declared_param_runtime_ty(local_id)?); } } - // Convert return type - use Unit if function doesn't return a value - let ret_ty = if func.returns_value { - types::word_type() // TODO: proper return type lowering + // Convert return type - use Unit if function doesn't return a value. + let ret_tys = if func.returns_value { + vec![types::value_type(self.db, func.ret_ty)] } else { - types::unit_type() + Vec::new() }; - Ok((Signature::new(name, linkage, ¶ms, ret_ty), mask)) + Ok((Signature::new(name, linkage, ¶ms, &ret_tys), mask)) } /// Lower all function bodies. @@ -749,7 +736,7 @@ impl<'db, 'a> ModuleLowerer<'db, 'a> { // No contract annotations: fall back to compiling a single "main" entry. This is used by // snapshot tests for simple files and debugging. - let Some((entry_idx, entry_mir_func)) = self + let Some((entry_idx, _entry_mir_func)) = self .mir .functions .iter() @@ -761,7 +748,7 @@ impl<'db, 'a> ModuleLowerer<'db, 'a> { }; let entry_ref = self.func_map[&entry_idx]; - let wrapper_ref = self.create_entry_wrapper(entry_ref, entry_mir_func)?; + let wrapper_ref = self.create_entry_wrapper(entry_ref)?; let mut directives = vec![Directive::Entry(wrapper_ref)]; for &gv in &self.data_globals { directives.push(Directive::Data(gv)); @@ -1026,11 +1013,7 @@ impl<'db, 'a> ModuleLowerer<'db, 'a> { /// The wrapper calls the actual entry function and then halts with `evm_stop`. /// This is needed because the entry function uses internal `Return` which requires /// a return address on the stack (pushed by `Call`). - fn create_entry_wrapper( - &mut self, - entry_ref: FuncRef, - entry_mir_func: &mir::MirFunction<'db>, - ) -> Result { + fn create_entry_wrapper(&mut self, entry_ref: FuncRef) -> Result { const WRAPPER_NAME: &str = "__fe_sonatina_entry"; if self.name_map.contains_key(WRAPPER_NAME) { return Err(LowerError::Internal(format!( @@ -1038,12 +1021,7 @@ impl<'db, 'a> ModuleLowerer<'db, 'a> { ))); } - let sig = Signature::new( - WRAPPER_NAME, - sonatina_ir::Linkage::Private, - &[], - types::unit_type(), - ); + let sig = Signature::new(WRAPPER_NAME, sonatina_ir::Linkage::Private, &[], &[]); let func_ref = self.builder.declare_function(sig).map_err(|e| { LowerError::Internal(format!( "failed to declare entry wrapper `{WRAPPER_NAME}`: {e}" @@ -1058,32 +1036,16 @@ impl<'db, 'a> ModuleLowerer<'db, 'a> { // Pass zero for all arguments (regular + effect params). Test entry functions // generally don't use effect params meaningfully. - let argc = entry_mir_func - .body - .param_locals - .iter() - .chain(entry_mir_func.body.effect_param_locals.iter()) - .copied() - .filter(|local_id| { - let local_ty = entry_mir_func - .body - .locals - .get(local_id.index()) - .map(|l| l.ty); - let Some(local_ty) = local_ty else { - return true; - }; - !is_erased_runtime_ty(self.db, &self.target_layout, local_ty) - }) - .count(); - let mut args = Vec::with_capacity(argc); - for _ in 0..argc { - args.push(fb.make_imm_value(I256::zero())); + let (arg_tys, ret_ty) = fb.module_builder.ctx.func_sig(entry_ref, |sig| { + (sig.args().to_vec(), sig.ret_tys().first().copied()) + }); + let mut args = Vec::with_capacity(arg_tys.len()); + for ty in arg_tys { + args.push(types::zero_value(&mut fb, ty)); } - let call_inst = Call::new(is, entry_ref, args.into()); - if entry_mir_func.returns_value { - let _ = fb.insert_inst(call_inst, types::word_type()); + if let Some(ret_ty) = ret_ty { + let _ = fb.insert_inst(call_inst, ret_ty); } else { fb.insert_inst_no_result(call_inst); } @@ -1109,6 +1071,27 @@ impl<'db, 'a> ModuleLowerer<'db, 'a> { let mut fb = self.builder.func_builder::(func_ref); let is = self.isa.inst_set(); + let param_locals: FxHashSet<_> = func + .body + .param_locals + .iter() + .chain(func.body.effect_param_locals.iter()) + .copied() + .collect(); + let local_runtime_tys: Vec<_> = func + .body + .locals + .iter() + .enumerate() + .map(|(idx, local)| { + let local_id = mir::LocalId(idx as u32); + if param_locals.contains(&local_id) { + types::runtime_type(self.db, &self.target_layout, local.ty) + } else { + types::local_runtime_type(self.db, &self.target_layout, &func.body, local_id) + } + }) + .collect(); // Maps MIR block IDs to Sonatina block IDs let mut block_map: FxHashMap = FxHashMap::default(); @@ -1117,7 +1100,8 @@ impl<'db, 'a> ModuleLowerer<'db, 'a> { let mut local_vars: FxHashMap = FxHashMap::default(); for (idx, _local) in func.body.locals.iter().enumerate() { let local_id = mir::LocalId(idx as u32); - let var = fb.declare_var(types::word_type()); + let var_ty = local_runtime_tys[idx]; + let var = fb.declare_var(var_ty); local_vars.insert(local_id, var); } @@ -1154,14 +1138,13 @@ impl<'db, 'a> ModuleLowerer<'db, 'a> { "missing SSA variable for param local {local_id:?}" )) })?; - let zero = fb.make_imm_value(I256::zero()); + let zero = types::zero_value(&mut fb, local_runtime_tys[local_id.index()]); fb.def_var(var, zero); } } else { // Non-entry functions: map actual arguments to param locals. let args = fb.args().to_vec(); let mut arg_iter = args.into_iter(); - let zero = fb.make_imm_value(I256::zero()); for local_id in all_param_locals { let var = local_vars.get(&local_id).copied().ok_or_else(|| { LowerError::Internal(format!( @@ -1169,35 +1152,39 @@ impl<'db, 'a> ModuleLowerer<'db, 'a> { )) })?; - let local_ty = func - .body - .locals - .get(local_id.index()) - .ok_or_else(|| { - LowerError::Internal(format!("unknown param local: {local_id:?}")) - })? - .ty; - if is_erased_runtime_ty(self.db, &self.target_layout, local_ty) { + let local_runtime_ty = local_runtime_tys[local_id.index()]; + if local_runtime_ty == Type::Unit { + let zero = types::zero_value(&mut fb, Type::Unit); fb.def_var(var, zero); continue; } - let arg_val = arg_iter.next().unwrap_or(zero); + let arg_val = arg_iter + .next() + .unwrap_or_else(|| types::zero_value(&mut fb, local_runtime_ty)); + if fb.type_of(arg_val) != local_runtime_ty { + return Err(LowerError::Internal(format!( + "parameter type mismatch for {local_id:?}: expected {local_runtime_ty:?}, got {:?}", + fb.type_of(arg_val) + ))); + } fb.def_var(var, arg_val); } } { let mut const_data_globals = FxHashMap::default(); + let mut overflow_revert_block = None; let ptr_escape_summary = self.ptr_escape_summaries.get(&func.symbol_name); let mut ctx = LowerCtx { fb: &mut fb, db: self.db, target_layout: &self.target_layout, body: &func.body, + ret_ty: func.returns_value.then_some(func.ret_ty), + local_runtime_tys: &local_runtime_tys, local_vars: &local_vars, name_map: &self.name_map, - returns_value_map: &self.returns_value_map, runtime_param_masks: &self.runtime_param_masks, block_map: &block_map, is, @@ -1207,6 +1194,7 @@ impl<'db, 'a> ModuleLowerer<'db, 'a> { data_globals: &mut self.data_globals, data_global_counter: &mut self.data_global_counter, const_data_globals: &mut const_data_globals, + overflow_revert_block: &mut overflow_revert_block, ptr_escape_summary, }; @@ -1242,9 +1230,10 @@ pub(super) struct LowerCtx<'a, 'db, C: sonatina_ir::func_cursor::FuncCursor> { pub(super) db: &'db DriverDataBase, pub(super) target_layout: &'a TargetDataLayout, pub(super) body: &'a mir::MirBody<'db>, + pub(super) ret_ty: Option>, + pub(super) local_runtime_tys: &'a [Type], pub(super) local_vars: &'a FxHashMap, pub(super) name_map: &'a FxHashMap, - pub(super) returns_value_map: &'a FxHashMap, pub(super) runtime_param_masks: &'a FxHashMap>, pub(super) block_map: &'a FxHashMap, pub(super) is: &'a sonatina_ir::inst::evm::inst_set::EvmInstSet, @@ -1259,6 +1248,8 @@ pub(super) struct LowerCtx<'a, 'db, C: sonatina_ir::func_cursor::FuncCursor> { pub(super) data_global_counter: &'a mut usize, /// Per-function dedupe for constant aggregate payloads. pub(super) const_data_globals: &'a mut FxHashMap, GlobalVariableRef>, + /// Lazily-created shared overflow trap block for checked arithmetic in this function. + pub(super) overflow_revert_block: &'a mut Option, /// Escape summary for the current function. pub(super) ptr_escape_summary: Option<&'a mir::analysis::escape::MirPtrEscapeSummary>, } diff --git a/crates/codegen/src/sonatina/tests.rs b/crates/codegen/src/sonatina/tests.rs index c4c3f11136..953defa6dc 100644 --- a/crates/codegen/src/sonatina/tests.rs +++ b/crates/codegen/src/sonatina/tests.rs @@ -16,7 +16,7 @@ use sonatina_codegen::{ stackalloc::StackifyBuilder, }; use sonatina_ir::{ - I256, Module, Signature, Type, + Module, Signature, builder::ModuleBuilder, cfg::ControlFlowGraph, func_cursor::InstInserter, @@ -77,6 +77,7 @@ pub fn emit_test_module_sonatina( ) -> Result { let ingot = top_mod.ingot(db); let mir_module = lower_ingot(db, ingot)?; + let tests = collect_tests(db, &mir_module.functions); if tests.is_empty() { @@ -269,22 +270,6 @@ fn build_funcs_by_symbol<'a>( .collect() } -fn runtime_argc(db: &DriverDataBase, func: &MirFunction<'_>) -> usize { - func.body - .param_locals - .iter() - .chain(func.body.effect_param_locals.iter()) - .copied() - .filter(|local_id| { - let local_ty = func.body.locals.get(local_id.index()).map(|l| l.ty); - let Some(local_ty) = local_ty else { - return true; - }; - layout::ty_size_bytes_in(db, &layout::EVM_LAYOUT, local_ty).is_none_or(|s| s != 0) - }) - .count() -} - fn collect_code_region_roots(functions: &[MirFunction<'_>]) -> Vec { let mut roots = FxHashSet::default(); for func in functions { @@ -491,7 +476,7 @@ fn create_code_regions_object( let mut sections = Vec::with_capacity(code_region_roots.len()); for root in code_region_roots { - let Some(&root_func) = funcs_by_symbol.get(root.as_str()) else { + let Some(_) = funcs_by_symbol.get(root.as_str()) else { return Err(LowerError::Internal(format!( "missing MIR function for code region root `{root}`" ))); @@ -502,13 +487,7 @@ fn create_code_regions_object( .ok_or_else(|| LowerError::Internal(format!("unknown function: {root}")))?; let wrapper_name = format!("__fe_sonatina_code_region_entry_{}", sanitize_symbol(root)); - let argc = runtime_argc(lowerer.db, root_func); - let wrapper_ref = lowerer.create_call_and_stop_wrapper( - &wrapper_name, - root_ref, - argc, - root_func.returns_value, - )?; + let wrapper_ref = lowerer.create_call_and_stop_wrapper(&wrapper_name, root_ref)?; let section_name = code_region_sections .get(root) @@ -554,7 +533,7 @@ fn create_test_object( test: &TestInfo, code_region_sections: &FxHashMap, ) -> Result { - let Some(&test_func) = funcs_by_symbol.get(test.symbol_name.as_str()) else { + let Some(_) = funcs_by_symbol.get(test.symbol_name.as_str()) else { return Err(LowerError::Internal(format!( "missing MIR function for test `{}`", test.symbol_name @@ -567,13 +546,7 @@ fn create_test_object( .ok_or_else(|| LowerError::Internal(format!("unknown function: {}", test.symbol_name)))?; let wrapper_name = format!("__fe_sonatina_test_entry_{}", test.object_name); - let argc = runtime_argc(lowerer.db, test_func); - let wrapper_ref = lowerer.create_call_and_stop_wrapper( - &wrapper_name, - test_ref, - argc, - test_func.returns_value, - )?; + let wrapper_ref = lowerer.create_call_and_stop_wrapper(&wrapper_name, test_ref)?; let reachable = reachable_functions(call_graph, &test.symbol_name); let deps = collect_code_region_deps(&reachable, funcs_by_symbol); @@ -636,7 +609,7 @@ impl<'db, 'a> ModuleLowerer<'db, 'a> { continue; } mask.push(true); - params.push(super::types::word_type()); + params.push(super::types::value_type(self.db, local_ty)); } for local_id in func.body.effect_param_locals.iter().copied() { let local_ty = func @@ -654,24 +627,22 @@ impl<'db, 'a> ModuleLowerer<'db, 'a> { continue; } mask.push(true); - params.push(super::types::word_type()); + params.push(super::types::value_type(self.db, local_ty)); } - let ret_ty = if func.returns_value { - super::types::word_type() + let ret_tys = if func.returns_value { + vec![super::types::value_type(self.db, func.ret_ty)] } else { - super::types::unit_type() + Vec::new() }; - let sig = Signature::new(name, linkage, ¶ms, ret_ty); + let sig = Signature::new(name, linkage, ¶ms, &ret_tys); let func_ref = self.builder.declare_function(sig).map_err(|e| { LowerError::Internal(format!("failed to declare function {name}: {e}")) })?; self.func_map.insert(idx, func_ref); self.name_map.insert(name.clone(), func_ref); - self.returns_value_map - .insert(name.clone(), func.returns_value); self.runtime_param_masks.insert(name.clone(), mask); } Ok(()) @@ -681,8 +652,6 @@ impl<'db, 'a> ModuleLowerer<'db, 'a> { &mut self, wrapper_name: &str, callee_ref: sonatina_ir::module::FuncRef, - callee_argc: usize, - callee_returns_value: bool, ) -> Result { if self.name_map.contains_key(wrapper_name) { return Err(LowerError::Internal(format!( @@ -690,12 +659,7 @@ impl<'db, 'a> ModuleLowerer<'db, 'a> { ))); } - let sig = Signature::new( - wrapper_name, - sonatina_ir::Linkage::Public, - &[], - super::types::unit_type(), - ); + let sig = Signature::new(wrapper_name, sonatina_ir::Linkage::Public, &[], &[]); let func_ref = self.builder.declare_function(sig).map_err(|e| { LowerError::Internal(format!("failed to declare wrapper `{wrapper_name}`: {e}")) })?; @@ -706,14 +670,17 @@ impl<'db, 'a> ModuleLowerer<'db, 'a> { let entry_block = fb.append_block(); fb.switch_to_block(entry_block); - let mut args = Vec::with_capacity(callee_argc); - for _ in 0..callee_argc { - args.push(fb.make_imm_value(I256::zero())); + let (arg_tys, ret_ty) = fb.module_builder.ctx.func_sig(callee_ref, |sig| { + (sig.args().to_vec(), sig.ret_tys().first().copied()) + }); + let mut args = Vec::with_capacity(arg_tys.len()); + for ty in arg_tys { + args.push(super::types::zero_value(&mut fb, ty)); } let call_inst = Call::new(is, callee_ref, args.into()); - if callee_returns_value { - let _ = fb.insert_inst(call_inst, Type::I256); + if let Some(ret_ty) = ret_ty { + let _ = fb.insert_inst(call_inst, ret_ty); } else { fb.insert_inst_no_result(call_inst); } diff --git a/crates/codegen/src/sonatina/types.rs b/crates/codegen/src/sonatina/types.rs index f3cd820c0a..902b0f4e55 100644 --- a/crates/codegen/src/sonatina/types.rs +++ b/crates/codegen/src/sonatina/types.rs @@ -1,13 +1,127 @@ //! Type mapping from Fe MIR to Sonatina IR types. -use sonatina_ir::Type; +use driver::DriverDataBase; +use hir::analysis::ty::ty_def::{CapabilityKind, PrimTy, TyBase, TyData, TyId}; +use mir::{ + LocalId, MirBody, MirInst, Rvalue, ValueData, ValueOrigin, layout::TargetDataLayout, repr, +}; +use sonatina_ir::{Immediate, Type, ValueId, builder::FunctionBuilder, func_cursor::FuncCursor}; + +use super::is_erased_runtime_ty; + +/// Returns the Sonatina scalar type for a Fe primitive, when one exists. +pub fn prim_scalar_type(prim: PrimTy) -> Option { + match prim { + PrimTy::Bool => Some(Type::I1), + PrimTy::U8 | PrimTy::I8 => Some(Type::I8), + PrimTy::U16 | PrimTy::I16 => Some(Type::I16), + PrimTy::U32 | PrimTy::I32 => Some(Type::I32), + PrimTy::U64 | PrimTy::I64 => Some(Type::I64), + PrimTy::U128 | PrimTy::I128 => Some(Type::I128), + PrimTy::U256 | PrimTy::I256 | PrimTy::Usize | PrimTy::Isize => Some(Type::I256), + PrimTy::String + | PrimTy::Array + | PrimTy::Tuple(_) + | PrimTy::Ptr + | PrimTy::View + | PrimTy::BorrowMut + | PrimTy::BorrowRef => None, + } +} + +/// Returns the Sonatina runtime value type for a Fe scalar-or-pointer runtime value. +pub fn value_type(db: &DriverDataBase, ty: TyId<'_>) -> Type { + let ty = match ty.as_capability(db) { + Some((CapabilityKind::View, inner)) => inner, + _ => ty, + }; + let leaf_ty = repr::word_conversion_leaf_ty(db, ty); + if let TyData::TyBase(TyBase::Prim(prim)) = leaf_ty.base_ty(db).data(db) + && let Some(ty) = prim_scalar_type(*prim) + { + return ty; + } -/// Returns the Sonatina type for an EVM word (256 bits). -pub fn word_type() -> Type { Type::I256 } -/// Returns the unit type (for functions returning nothing). -pub fn unit_type() -> Type { - Type::Unit +/// Returns the Sonatina runtime type for a Fe value, including erased types. +pub fn runtime_type(db: &DriverDataBase, target_layout: &TargetDataLayout, ty: TyId<'_>) -> Type { + if is_erased_runtime_ty(db, target_layout, ty) { + Type::Unit + } else { + value_type(db, ty) + } +} + +fn repr_runtime_type( + db: &DriverDataBase, + target_layout: &TargetDataLayout, + ty: TyId<'_>, + repr_has_address_space: bool, +) -> Type { + if repr_has_address_space { + Type::I256 + } else { + runtime_type(db, target_layout, ty) + } +} + +fn local_has_pointer_repr(body: &MirBody<'_>, local_id: LocalId) -> bool { + body.values.iter().any(|value| { + matches!(value.origin, ValueOrigin::Local(local) if local == local_id) + && value.repr.address_space().is_some() + }) || body + .blocks + .iter() + .flat_map(|block| block.insts.iter()) + .any(|inst| { + matches!( + inst, + MirInst::Assign { + dest: Some(dest_local), + rvalue: Rvalue::Alloc { .. }, + .. + } if *dest_local == local_id + ) + }) +} + +/// Returns the Sonatina runtime type for a MIR local after repr lowering. +pub fn local_runtime_type( + db: &DriverDataBase, + target_layout: &TargetDataLayout, + body: &MirBody<'_>, + local_id: LocalId, +) -> Type { + let local = &body.locals[local_id.index()]; + repr_runtime_type( + db, + target_layout, + local.ty, + local_has_pointer_repr(body, local_id), + ) +} + +/// Returns the Sonatina runtime type for a MIR value after repr lowering. +pub fn value_runtime_type( + db: &DriverDataBase, + target_layout: &TargetDataLayout, + value: &ValueData<'_>, +) -> Type { + repr_runtime_type( + db, + target_layout, + value.ty, + value.repr.address_space().is_some(), + ) +} + +/// Creates a zero/undef value of the given Sonatina type. +pub fn zero_value(fb: &mut FunctionBuilder, ty: Type) -> ValueId { + if ty == Type::Unit { + fb.make_undef_value(Type::Unit) + } else { + fb.make_imm_value(Immediate::zero(ty)) + } } diff --git a/crates/codegen/src/yul/emitter/control_flow.rs b/crates/codegen/src/yul/emitter/control_flow.rs index 769cb36537..a1a3e2758d 100644 --- a/crates/codegen/src/yul/emitter/control_flow.rs +++ b/crates/codegen/src/yul/emitter/control_flow.rs @@ -2,7 +2,7 @@ use mir::{ BasicBlockId, LoopInfo, Terminator, ValueId, - ir::{IntrinsicValue, SwitchTarget, SwitchValue}, + ir::{BuiltinTerminatorKind, IntrinsicValue, SwitchTarget, SwitchValue}, }; use rustc_hash::{FxHashMap, FxHashSet}; @@ -127,6 +127,14 @@ impl<'db> FunctionEmitter<'db> { } Terminator::TerminatingCall { call, .. } => match call { mir::TerminatingCall::Call(call) => { + if let Some(builtin) = call.builtin_terminator { + match builtin { + BuiltinTerminatorKind::Abort => { + ctx.docs.push(YulDoc::line("revert(0, 0)")); + return Ok(()); + } + } + } let call_expr = self.lower_call_value(call, ctx.state)?; ctx.docs.push(YulDoc::line(call_expr)); Ok(()) diff --git a/crates/codegen/src/yul/emitter/expr.rs b/crates/codegen/src/yul/emitter/expr.rs index 53dea86d52..65aa89f809 100644 --- a/crates/codegen/src/yul/emitter/expr.rs +++ b/crates/codegen/src/yul/emitter/expr.rs @@ -14,6 +14,7 @@ use mir::{ ir::{FieldPtrOrigin, MirFunctionOrigin, Place, SyntheticValue}, layout, }; +use num_bigint::BigUint; use crate::yul::state::BlockState; @@ -24,6 +25,331 @@ use super::{ }; impl<'db> FunctionEmitter<'db> { + /// Attempts to lower a call to a core numeric intrinsic directly to inline Yul. + /// + /// This is an optimization that avoids generating separate Yul functions for + /// primitive arithmetic intrinsics like `__add_u8`, `__sub_i32`, `__mul_u256`, etc. + /// Instead, it recognizes the naming pattern `___` and emits the + /// corresponding Yul opcode inline with appropriate bit masking. + /// + /// For types smaller than 256 bits, proper masking is applied: + /// - **Unsigned types**: Results are masked with `and(result, mask)` to truncate + /// overflow bits (e.g., `u8` uses mask `0xff`). + /// - **Signed types**: Results use `signextend(byte, and(value, mask))` to + /// correctly propagate the sign bit. + /// - **256-bit types** (`u256`, `i256`): No masking needed. + /// + /// # Parameters + /// - `call`: The call origin containing the target function and arguments. + /// - `state`: Current block state for lowering argument values. + /// + /// # Returns + /// - `Ok(Some(yul))`: The intrinsic was recognized and lowered to inline Yul. + /// - `Ok(None)`: The call is not a recognized core numeric intrinsic; the caller + /// should fall back to normal function call emission. + /// - `Err(...)`: An error occurred during lowering. + fn try_lower_core_numeric_intrinsic_call( + &self, + call: &CallOrigin<'_>, + state: &BlockState, + ) -> Result, YulError> { + let Some(target) = call.hir_target.as_ref() else { + return Ok(None); + }; + let CallableDef::Func(func) = target.callable_def else { + return Ok(None); + }; + if func.body(self.db).is_some() { + return Ok(None); + } + + match target.callable_def.ingot(self.db).kind(self.db) { + IngotKind::Core | IngotKind::Std => {} + _ => return Ok(None), + } + + let Some(name) = target.callable_def.name(self.db) else { + return Ok(None); + }; + let name = name.data(self.db).as_str(); + if name == "__bitcast" || !name.starts_with("__") { + return Ok(None); + } + + let Some((op, suffix)) = name[2..].rsplit_once('_') else { + return Ok(None); + }; + + let mut lowered_args = Vec::with_capacity(call.args.len()); + for &arg in &call.args { + lowered_args.push(self.lower_value(arg, state)?); + } + if !call.effect_args.is_empty() { + return Err(YulError::Unsupported(format!( + "core numeric intrinsic `{name}` unexpectedly has effect args" + ))); + } + + #[derive(Clone, Copy, Debug)] + enum IntPrim { + Unsigned { + mask: Option<&'static str>, + }, + Signed { + mask: Option<&'static str>, + signextend_byte: Option, + }, + } + + fn int_prim_from_suffix(suffix: &str) -> Option { + Some(match suffix { + "u8" => IntPrim::Unsigned { mask: Some("0xff") }, + "u16" => IntPrim::Unsigned { + mask: Some("0xffff"), + }, + "u32" => IntPrim::Unsigned { + mask: Some("0xffffffff"), + }, + "u64" => IntPrim::Unsigned { + mask: Some("0xffffffffffffffff"), + }, + "u128" => IntPrim::Unsigned { + mask: Some("0xffffffffffffffffffffffffffffffff"), + }, + "u256" | "usize" => IntPrim::Unsigned { mask: None }, + "i8" => IntPrim::Signed { + mask: Some("0xff"), + signextend_byte: Some(0), + }, + "i16" => IntPrim::Signed { + mask: Some("0xffff"), + signextend_byte: Some(1), + }, + "i32" => IntPrim::Signed { + mask: Some("0xffffffff"), + signextend_byte: Some(3), + }, + "i64" => IntPrim::Signed { + mask: Some("0xffffffffffffffff"), + signextend_byte: Some(7), + }, + "i128" => IntPrim::Signed { + mask: Some("0xffffffffffffffffffffffffffffffff"), + signextend_byte: Some(15), + }, + "i256" | "isize" => IntPrim::Signed { + mask: None, + signextend_byte: None, + }, + _ => return None, + }) + } + + fn trunc_bits(value: &str, prim: IntPrim) -> String { + match prim { + IntPrim::Unsigned { mask: Some(mask) } + | IntPrim::Signed { + mask: Some(mask), .. + } => { + format!("and({value}, {mask})") + } + IntPrim::Unsigned { mask: None } | IntPrim::Signed { mask: None, .. } => { + value.to_string() + } + } + } + + fn canonical_unsigned(value: &str, mask: Option<&'static str>) -> String { + match mask { + Some(mask) => format!("and({value}, {mask})"), + None => value.to_string(), + } + } + + fn canonical_signed( + value: &str, + mask: Option<&'static str>, + signextend_byte: Option, + ) -> String { + match (mask, signextend_byte) { + (Some(mask), Some(byte)) => format!("signextend({byte}, and({value}, {mask}))"), + _ => value.to_string(), + } + } + + let lowered = if suffix == "bool" { + let normalize_bool = |value: &str| format!("iszero(iszero({value}))"); + + match (op, lowered_args.as_slice()) { + ("not", [arg]) => Some(format!("iszero({})", normalize_bool(arg))), + ("bitand", [lhs, rhs]) => Some(format!( + "and({}, {})", + normalize_bool(lhs), + normalize_bool(rhs) + )), + ("bitor", [lhs, rhs]) => Some(format!( + "or({}, {})", + normalize_bool(lhs), + normalize_bool(rhs) + )), + ("bitxor", [lhs, rhs]) => Some(format!( + "xor({}, {})", + normalize_bool(lhs), + normalize_bool(rhs) + )), + ("eq", [lhs, rhs]) => Some(format!( + "eq({}, {})", + normalize_bool(lhs), + normalize_bool(rhs) + )), + ("ne", [lhs, rhs]) => Some(format!( + "iszero(eq({}, {}))", + normalize_bool(lhs), + normalize_bool(rhs) + )), + _ => None, + } + } else if let Some(int_prim) = int_prim_from_suffix(suffix) { + let (mask, signextend_byte, signed) = match int_prim { + IntPrim::Unsigned { mask } => (mask, None, false), + IntPrim::Signed { + mask, + signextend_byte, + } => (mask, signextend_byte, true), + }; + + let arg_unsigned = |value: &str| canonical_unsigned(value, mask); + let arg_signed = |value: &str| canonical_signed(value, mask, signextend_byte); + let result_unsigned = |value: String| canonical_unsigned(&value, mask); + let result_signed = |value: String| canonical_signed(&value, mask, signextend_byte); + + match (op, lowered_args.as_slice()) { + ("add", [lhs, rhs]) => Some(if signed { + result_signed(format!("add({}, {})", arg_signed(lhs), arg_signed(rhs))) + } else { + result_unsigned(format!("add({}, {})", arg_unsigned(lhs), arg_unsigned(rhs))) + }), + ("sub", [lhs, rhs]) => Some(if signed { + result_signed(format!("sub({}, {})", arg_signed(lhs), arg_signed(rhs))) + } else { + result_unsigned(format!("sub({}, {})", arg_unsigned(lhs), arg_unsigned(rhs))) + }), + ("mul", [lhs, rhs]) => Some(if signed { + result_signed(format!("mul({}, {})", arg_signed(lhs), arg_signed(rhs))) + } else { + result_unsigned(format!("mul({}, {})", arg_unsigned(lhs), arg_unsigned(rhs))) + }), + ("div", [lhs, rhs]) => Some(if signed { + result_signed(format!("sdiv({}, {})", arg_signed(lhs), arg_signed(rhs))) + } else { + result_unsigned(format!("div({}, {})", arg_unsigned(lhs), arg_unsigned(rhs))) + }), + ("rem", [lhs, rhs]) => Some(if signed { + result_signed(format!("smod({}, {})", arg_signed(lhs), arg_signed(rhs))) + } else { + result_unsigned(format!("mod({}, {})", arg_unsigned(lhs), arg_unsigned(rhs))) + }), + ("pow", [lhs, rhs]) => { + let base_bits = trunc_bits(lhs, int_prim); + let exp_bits = trunc_bits(rhs, int_prim); + Some(if signed { + result_signed(format!("exp({base_bits}, {exp_bits})")) + } else { + result_unsigned(format!("exp({base_bits}, {exp_bits})")) + }) + } + ("shl", [lhs, rhs]) => { + let value_bits = trunc_bits(lhs, int_prim); + let shift_bits = trunc_bits(rhs, int_prim); + Some(if signed { + result_signed(format!("shl({shift_bits}, {value_bits})")) + } else { + result_unsigned(format!("shl({shift_bits}, {value_bits})")) + }) + } + ("shr", [lhs, rhs]) => { + let shift_bits = trunc_bits(rhs, int_prim); + Some(if signed { + result_signed(format!("sar({shift_bits}, {})", arg_signed(lhs))) + } else { + result_unsigned(format!("shr({shift_bits}, {})", arg_unsigned(lhs))) + }) + } + ("bitand", [lhs, rhs]) => { + let lhs_bits = trunc_bits(lhs, int_prim); + let rhs_bits = trunc_bits(rhs, int_prim); + Some(if signed { + result_signed(format!("and({lhs_bits}, {rhs_bits})")) + } else { + result_unsigned(format!("and({lhs_bits}, {rhs_bits})")) + }) + } + ("bitor", [lhs, rhs]) => { + let lhs_bits = trunc_bits(lhs, int_prim); + let rhs_bits = trunc_bits(rhs, int_prim); + Some(if signed { + result_signed(format!("or({lhs_bits}, {rhs_bits})")) + } else { + result_unsigned(format!("or({lhs_bits}, {rhs_bits})")) + }) + } + ("bitxor", [lhs, rhs]) => { + let lhs_bits = trunc_bits(lhs, int_prim); + let rhs_bits = trunc_bits(rhs, int_prim); + Some(if signed { + result_signed(format!("xor({lhs_bits}, {rhs_bits})")) + } else { + result_unsigned(format!("xor({lhs_bits}, {rhs_bits})")) + }) + } + ("bitnot", [arg]) => { + let arg_bits = trunc_bits(arg, int_prim); + Some(if signed { + result_signed(format!("not({arg_bits})")) + } else { + result_unsigned(format!("not({arg_bits})")) + }) + } + ("neg", [arg]) => Some(result_signed(format!("sub(0, {})", arg_signed(arg)))), + ("eq", [lhs, rhs]) => { + let lhs_bits = trunc_bits(lhs, int_prim); + let rhs_bits = trunc_bits(rhs, int_prim); + Some(format!("eq({lhs_bits}, {rhs_bits})")) + } + ("ne", [lhs, rhs]) => { + let lhs_bits = trunc_bits(lhs, int_prim); + let rhs_bits = trunc_bits(rhs, int_prim); + Some(format!("iszero(eq({lhs_bits}, {rhs_bits}))")) + } + ("lt", [lhs, rhs]) => Some(if signed { + format!("slt({}, {})", arg_signed(lhs), arg_signed(rhs)) + } else { + format!("lt({}, {})", arg_unsigned(lhs), arg_unsigned(rhs)) + }), + ("le", [lhs, rhs]) => Some(if signed { + format!("iszero(sgt({}, {}))", arg_signed(lhs), arg_signed(rhs)) + } else { + format!("iszero(gt({}, {}))", arg_unsigned(lhs), arg_unsigned(rhs)) + }), + ("gt", [lhs, rhs]) => Some(if signed { + format!("sgt({}, {})", arg_signed(lhs), arg_signed(rhs)) + } else { + format!("gt({}, {})", arg_unsigned(lhs), arg_unsigned(rhs)) + }), + ("ge", [lhs, rhs]) => Some(if signed { + format!("iszero(slt({}, {}))", arg_signed(lhs), arg_signed(rhs)) + } else { + format!("iszero(lt({}, {}))", arg_unsigned(lhs), arg_unsigned(rhs)) + }), + _ => None, + } + } else { + None + }; + + Ok(lowered) + } + fn format_hir_expr_context(&self, expr: hir::hir_def::ExprId) -> String { let Some(body) = (match self.mir_func.origin { MirFunctionOrigin::Hir(func) => func.body(self.db), @@ -210,7 +536,7 @@ impl<'db> FunctionEmitter<'db> { ); Ok("0".into()) } - ValueOrigin::Synthetic(synth) => self.lower_synthetic_value(synth), + ValueOrigin::Synthetic(synth) => self.lower_synthetic_value(synth, value.ty), ValueOrigin::FieldPtr(field_ptr) => self.lower_field_ptr(field_ptr, state), ValueOrigin::PlaceRef(place) => { if value.repr.address_space().is_none() @@ -267,6 +593,10 @@ impl<'db> FunctionEmitter<'db> { )); } + if let Some(intrinsic) = self.try_lower_core_numeric_intrinsic_call(call, state)? { + return Ok(intrinsic); + } + let is_evm_op = match call.hir_target.as_ref() { Some(target) => { matches!( @@ -317,9 +647,43 @@ impl<'db> FunctionEmitter<'db> { /// * `value` - Synthetic value emitted during MIR construction. /// /// Returns the literal Yul expression for the synthetic value. - fn lower_synthetic_value(&self, value: &SyntheticValue) -> Result { + fn lower_synthetic_value( + &self, + value: &SyntheticValue, + ty: TyId<'db>, + ) -> Result { match value { - SyntheticValue::Int(int) => Ok(int.to_string()), + SyntheticValue::Int(int) => { + let ty = ty + .as_capability(self.db) + .map(|(_, inner)| inner) + .unwrap_or(ty); + let TyData::TyBase(TyBase::Prim(prim)) = ty.base_ty(self.db).data(self.db) else { + return Ok(int.to_string()); + }; + let maybe_signed_subword = match prim { + PrimTy::I8 => Some((BigUint::from(0xffu16), BigUint::from(0x80u16), 0u8)), + PrimTy::I16 => Some((BigUint::from(0xffffu32), BigUint::from(0x8000u32), 1)), + PrimTy::I32 => Some(( + BigUint::from(0xffff_ffffu64), + BigUint::from(0x8000_0000u64), + 3, + )), + PrimTy::I64 => Some((BigUint::from(u64::MAX), BigUint::from(1u128 << 63), 7)), + PrimTy::I128 => { + Some((BigUint::from(u128::MAX), BigUint::from(1u128 << 127), 15)) + } + _ => None, + }; + if let Some((mask, sign_bit, byte)) = maybe_signed_subword { + let masked = int & mask; + if (&masked & sign_bit) != BigUint::from(0u8) { + return Ok(format!("signextend({byte}, {})", masked)); + } + return Ok(masked.to_string()); + } + Ok(int.to_string()) + } SyntheticValue::Bool(flag) => Ok(if *flag { "1" } else { "0" }.into()), SyntheticValue::Bytes(bytes) => Ok(format!("0x{}", hex::encode(bytes))), } diff --git a/crates/codegen/src/yul/emitter/module.rs b/crates/codegen/src/yul/emitter/module.rs index a4cb6fe38c..803dd86ae1 100644 --- a/crates/codegen/src/yul/emitter/module.rs +++ b/crates/codegen/src/yul/emitter/module.rs @@ -1,10 +1,14 @@ //! Module-level Yul emission helpers (functions + code regions). -use common::ingot::Ingot; +use common::{ + InputDb, + ingot::{Ingot, IngotKind}, +}; use driver::DriverDataBase; use hir::HirDb; use hir::analysis::HirAnalysisDb; -use hir::hir_def::{ItemKind, TopLevelMod}; +use hir::analysis::ty::ty_def::{PrimTy, TyBase, TyData}; +use hir::hir_def::{HirIngot, ItemKind, TopLevelMod}; use mir::analysis::{ CallGraph, ContractRegion, ContractRegionKind, build_call_graph, build_contract_graph, reachable_functions, @@ -84,7 +88,8 @@ pub fn emit_module_yul_with_layout( top_mod: TopLevelMod<'_>, layout: TargetDataLayout, ) -> Result { - let module = lower_module(db, top_mod).map_err(EmitModuleError::MirLower)?; + let mut module = lower_module(db, top_mod).map_err(EmitModuleError::MirLower)?; + link_yul_checked_arithmetic_helpers(db, &mut module)?; emit_lowered_module_yul_with_layout(db, &module, layout) } @@ -98,7 +103,8 @@ pub fn emit_ingot_yul_with_layout( ingot: Ingot<'_>, layout: TargetDataLayout, ) -> Result { - let module = lower_ingot(db, ingot).map_err(EmitModuleError::MirLower)?; + let mut module = lower_ingot(db, ingot).map_err(EmitModuleError::MirLower)?; + link_yul_checked_arithmetic_helpers(db, &mut module)?; emit_lowered_module_yul_with_layout(db, &module, layout) } @@ -302,7 +308,8 @@ pub fn emit_test_module_yul_with_layout( layout: TargetDataLayout, ) -> Result { let ingot = top_mod.ingot(db); - let module = lower_ingot(db, ingot).map_err(EmitModuleError::MirLower)?; + let mut module = lower_ingot(db, ingot).map_err(EmitModuleError::MirLower)?; + link_yul_checked_arithmetic_helpers(db, &mut module)?; let contract_graph = build_contract_graph(&module.functions); @@ -490,6 +497,169 @@ fn sanitize_symbol(component: &str) -> String { .collect() } +fn link_yul_checked_arithmetic_helpers<'db>( + db: &'db DriverDataBase, + module: &mut mir::MirModule<'db>, +) -> Result<(), EmitModuleError> { + fn checked_intrinsic_ty_suffix<'db>( + db: &'db DriverDataBase, + ty: hir::analysis::ty::ty_def::TyId<'db>, + ) -> Result<&'static str, EmitModuleError> { + let base_ty = ty.base_ty(db); + let TyData::TyBase(TyBase::Prim(prim)) = base_ty.data(db) else { + return Err(EmitModuleError::Yul(YulError::Unsupported(format!( + "checked arithmetic helper type must be primitive integral, got `{}`", + ty.pretty_print(db) + )))); + }; + match prim { + PrimTy::U8 => Ok("u8"), + PrimTy::U16 => Ok("u16"), + PrimTy::U32 => Ok("u32"), + PrimTy::U64 => Ok("u64"), + PrimTy::U128 => Ok("u128"), + PrimTy::U256 => Ok("u256"), + PrimTy::Usize => Ok("usize"), + PrimTy::I8 => Ok("i8"), + PrimTy::I16 => Ok("i16"), + PrimTy::I32 => Ok("i32"), + PrimTy::I64 => Ok("i64"), + PrimTy::I128 => Ok("i128"), + PrimTy::I256 => Ok("i256"), + PrimTy::Isize => Ok("isize"), + _ => Err(EmitModuleError::Yul(YulError::Unsupported(format!( + "checked arithmetic helper type must be integral, got `{}`", + ty.pretty_print(db) + )))), + } + } + + fn helper_symbol_from_checked_intrinsic<'db>( + db: &'db DriverDataBase, + intrinsic: mir::ir::CheckedIntrinsic<'db>, + ) -> Result { + let suffix = checked_intrinsic_ty_suffix(db, intrinsic.ty)?; + Ok(format!( + "{}_{}", + intrinsic.op.helper_symbol_prefix(), + suffix + )) + } + + fn rewrite_checked_calls<'db>( + db: &'db DriverDataBase, + module: &mut mir::MirModule<'db>, + ) -> Result, EmitModuleError> { + let mut required_helpers = FxHashSet::default(); + for func in &mut module.functions { + for block in &mut func.body.blocks { + for inst in &mut block.insts { + if let MirInst::Assign { + rvalue: Rvalue::Call(call), + .. + } = inst + && let Some(intrinsic) = call.checked_intrinsic + { + let helper = helper_symbol_from_checked_intrinsic(db, intrinsic)?; + required_helpers.insert(helper.clone()); + call.resolved_name = Some(helper); + } + } + + if let mir::Terminator::TerminatingCall { + call: mir::TerminatingCall::Call(call), + .. + } = &mut block.terminator + && let Some(intrinsic) = call.checked_intrinsic + { + let helper = helper_symbol_from_checked_intrinsic(db, intrinsic)?; + required_helpers.insert(helper.clone()); + call.resolved_name = Some(helper); + } + } + } + Ok(required_helpers) + } + + let required_helpers = rewrite_checked_calls(db, module)?; + if required_helpers.is_empty() { + return Ok(()); + } + + let current_ingot = module.top_mod.ingot(db); + let core_ingot = if current_ingot.kind(db) == IngotKind::Core { + current_ingot + } else { + current_ingot + .resolved_external_ingots(db) + .iter() + .find_map(|(name, ingot)| { + if name.data(db) == "core" { + Some(*ingot) + } else { + None + } + }) + .ok_or_else(|| { + EmitModuleError::Yul(YulError::Unsupported( + "failed to resolve `core` ingot while linking checked arithmetic helpers" + .into(), + )) + })? + }; + + let num_yul_url = core_ingot.base(db).join("src/num_yul.fe").map_err(|_| { + EmitModuleError::Yul(YulError::Unsupported( + "failed to locate `core::num_yul` source while linking checked arithmetic helpers" + .into(), + )) + })?; + let num_yul_file = db.workspace().get(db, &num_yul_url).ok_or_else(|| { + EmitModuleError::Yul(YulError::Unsupported( + "missing `core::num_yul` source while linking checked arithmetic helpers".into(), + )) + })?; + let num_yul_top_mod = db.top_mod(num_yul_file); + + let mut num_yul_module = + lower_module(db, num_yul_top_mod).map_err(EmitModuleError::MirLower)?; + rewrite_checked_calls(db, &mut num_yul_module)?; + let num_yul_call_graph = build_call_graph(&num_yul_module.functions); + + let mut required_symbols = FxHashSet::default(); + for helper in &required_helpers { + required_symbols.extend(reachable_functions(&num_yul_call_graph, helper)); + } + + let mut by_symbol: FxHashMap<_, _> = num_yul_module + .functions + .into_iter() + .map(|func| (func.symbol_name.clone(), func)) + .collect(); + + let mut known = FxHashSet::default(); + for func in &module.functions { + known.insert(func.symbol_name.clone()); + } + + let mut symbols: Vec<_> = required_symbols.into_iter().collect(); + symbols.sort(); + for symbol in symbols { + if known.contains(&symbol) { + continue; + } + let Some(func) = by_symbol.remove(&symbol) else { + return Err(EmitModuleError::Yul(YulError::Unsupported(format!( + "missing required checked arithmetic helper function `{symbol}`" + )))); + }; + known.insert(symbol); + module.functions.push(func); + } + + Ok(()) +} + struct FunctionDocInfo { docs: Vec, /// Data regions collected during emission for Yul data sections. diff --git a/crates/codegen/tests/fixtures/arg_bindings.snap b/crates/codegen/tests/fixtures/arg_bindings.snap index 40aa2f548a..8329353275 100644 --- a/crates/codegen/tests/fixtures/arg_bindings.snap +++ b/crates/codegen/tests/fixtures/arg_bindings.snap @@ -1,11 +1,42 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 42 expression: output input_file: tests/fixtures/arg_bindings.fe --- function $arg_bindings($x, $y) -> ret { - let v0 := add($x, $y) + let v0 := $checked_add_u64($x, $y) + let v1 := v0 + ret := v1 + leave +} +function $checked_add_u64($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) + ret := v0 + leave +} +function $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) -> ret { + let v0 := $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := and(add(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) ret := v0 leave } diff --git a/crates/codegen/tests/fixtures/aug_assign.snap b/crates/codegen/tests/fixtures/aug_assign.snap index 36a3d8559a..a892fb49a6 100644 --- a/crates/codegen/tests/fixtures/aug_assign.snap +++ b/crates/codegen/tests/fixtures/aug_assign.snap @@ -1,13 +1,103 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 42 expression: output input_file: tests/fixtures/aug_assign.fe --- function $aug_assign($x, $y) -> ret { let v0 := $x - v0 := add(v0, $y) - v0 := mul(v0, 2) - ret := div(v0, 2) + let v1 := $checked_add_u64(v0, $y) + v0 := v1 + let v2 := $checked_mul_u64(v0, 2) + v0 := v2 + let v3 := $checked_div_u64(v0, 2) + ret := v3 + leave +} +function $checked_add_u64($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) + ret := v0 + leave +} +function $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) -> ret { + let v0 := $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $checked_div_u64($a, $b) -> ret { + $ensure_nonzero_divisor__u64__aee7f05a097ffa16($b) + let v0 := and(div(and($a, 0xffffffffffffffff), and($b, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 + leave +} +function $checked_mul_u64($a, $b) -> ret { + let v0 := $checked_mul_unsigned_impl__u64__aee7f05a097ffa16($a, $b) + ret := v0 + leave +} +function $checked_mul_unsigned_impl__u64__aee7f05a097ffa16($a, $b) -> ret { + let v0 := $u64_haee7f05a097ffa16_wrappingmul_h64e6b83610cda761_wrapping_mul($a, $b) + let v1 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(v1, 0) + let v3 := v2 + if v3 { + let v4 := $checked_div_u64(v0, $a) + let v5 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word(v4) + let v6 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($b) + let v7 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(v5, v6) + let v8 := v7 + if v8 { + revert(0, 0) + } + ret := v0 + leave + } + if iszero(v3) { + ret := v0 + leave + } +} +function $ensure_nonzero_divisor__u64__aee7f05a097ffa16($b) { + let v0 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0, 0) + let v2 := v1 + if v2 { + revert(0, 0) + } + leave +} +function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_eq_he50383edd273619f_ne($self, $other) -> ret { + let v0 := iszero(eq($self, $other)) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := and(add(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_wrappingmul_h64e6b83610cda761_wrapping_mul($self, $other) -> ret { + let v0 := and(mul(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 leave } diff --git a/crates/codegen/tests/fixtures/aug_assign_bit_ops.snap b/crates/codegen/tests/fixtures/aug_assign_bit_ops.snap index 5cd03efd9d..0469ae5b8c 100644 --- a/crates/codegen/tests/fixtures/aug_assign_bit_ops.snap +++ b/crates/codegen/tests/fixtures/aug_assign_bit_ops.snap @@ -1,12 +1,19 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 42 expression: output input_file: tests/fixtures/aug_assign_bit_ops.fe --- function $aug_assign_bit_ops($x, $y) -> ret { let v0 := $x - v0 := exp(v0, $y) + let v1 := mload(0x40) + if iszero(v1) { + v1 := 0x80 + } + mstore(0x40, add(v1, 32)) + mstore(v1, v0) + $u256_h3271ca15373d4483_powassign_h1c527c5fd2f9bd8a_pow_assign(v1, $y) + let v2 := mload(v1) + v0 := v2 v0 := shl(3, v0) v0 := shr(1, v0) v0 := and(v0, 255) @@ -15,3 +22,169 @@ function $aug_assign_bit_ops($x, $y) -> ret { ret := v0 leave } +function $u256_h3271ca15373d4483_powassign_h1c527c5fd2f9bd8a_pow_assign($self, $other) { + let v0 := mload($self) + let v1 := $u256_h3271ca15373d4483_pow_haae116e5e5042c2c_pow(v0, $other) + mstore($self, v1) + leave +} +function $u256_h3271ca15373d4483_pow_haae116e5e5042c2c_pow($self, $other) -> ret { + let v0 := $pow_checked__u256__3271ca15373d4483($self, $other) + ret := v0 + leave +} +function $pow_checked__u256__3271ca15373d4483($base, $exp) -> ret { + let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word($exp) + let v1 := and(v0, 115792089237316195423570985008687907853269984665640564039457584007913129639935) + let v2 := 0 + if v2 { + let v3 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(and(v1, 0), 0) + let v4 := v3 + if v4 { + revert(0, 0) + } + let v5 := 1 + let v6 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word($base) + let v7 := v1 + for { } 1 { } { + let v8 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v7, 0) + if iszero(v8) { + break + } + let v9 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(and(v7, 1), 0) + let v10 := v9 + if v10 { + let v11 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v5) + let v12 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v6) + let v13 := $u256_h3271ca15373d4483_mul_h290dcc921ed80777_mul(v11, v12) + let v14 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v13) + v5 := v14 + } + v7 := shr(1, v7) + let v15 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v7, 0) + let v16 := v15 + if v16 { + let v17 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v6) + let v18 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v6) + let v19 := $u256_h3271ca15373d4483_mul_h290dcc921ed80777_mul(v17, v18) + let v20 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v19) + v6 := v20 + } + if iszero(v16) { + } + } + let v21 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v5) + ret := v21 + leave + } + if iszero(v2) { + let v22 := 1 + let v23 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word($base) + let v24 := v1 + for { } 1 { } { + let v25 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v24, 0) + if iszero(v25) { + break + } + let v26 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(and(v24, 1), 0) + let v27 := v26 + if v27 { + let v28 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v22) + let v29 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v23) + let v30 := $u256_h3271ca15373d4483_mul_h290dcc921ed80777_mul(v28, v29) + let v31 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v30) + v22 := v31 + } + v24 := shr(1, v24) + let v32 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v24, 0) + let v33 := v32 + if v33 { + let v34 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v23) + let v35 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v23) + let v36 := $u256_h3271ca15373d4483_mul_h290dcc921ed80777_mul(v34, v35) + let v37 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v36) + v23 := v37 + } + if iszero(v33) { + } + } + let v38 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v22) + ret := v38 + leave + } +} +function $u256_h3271ca15373d4483_eq_he50383edd273619f_ne($self, $other) -> ret { + let v0 := iszero(eq($self, $other)) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word($word) -> ret { + ret := $word + leave +} +function $u256_h3271ca15373d4483_mul_h290dcc921ed80777_mul($self, $other) -> ret { + let v0 := $checked_mul_u256($self, $other) + ret := v0 + leave +} +function $checked_div_u256($a, $b) -> ret { + $ensure_nonzero_divisor__u256__3271ca15373d4483($b) + let v0 := div($a, $b) + ret := v0 + leave +} +function $checked_mul_u256($a, $b) -> ret { + let v0 := $checked_mul_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave +} +function $checked_mul_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingmul_h64e6b83610cda761_wrapping_mul($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(v1, 0) + let v3 := v2 + if v3 { + let v4 := $checked_div_u256(v0, $a) + let v5 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v4) + let v6 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v7 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(v5, v6) + let v8 := v7 + if v8 { + revert(0, 0) + } + ret := v0 + leave + } + if iszero(v3) { + ret := v0 + leave + } +} +function $ensure_nonzero_divisor__u256__3271ca15373d4483($b) { + let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0, 0) + let v2 := v1 + if v2 { + revert(0, 0) + } + leave +} +function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u256_h3271ca15373d4483_wrappingmul_h64e6b83610cda761_wrapping_mul($self, $other) -> ret { + let v0 := mul($self, $other) + ret := v0 + leave +} diff --git a/crates/codegen/tests/fixtures/bit_ops.snap b/crates/codegen/tests/fixtures/bit_ops.snap index 1b6d6b83be..7c95937b1f 100644 --- a/crates/codegen/tests/fixtures/bit_ops.snap +++ b/crates/codegen/tests/fixtures/bit_ops.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 42 expression: output input_file: tests/fixtures/bit_ops.fe --- @@ -24,6 +23,167 @@ function $bit_ops($x, $y) -> ret { leave } function $pow_op($x, $y) -> ret { - ret := exp($x, $y) + let v0 := $u256_h3271ca15373d4483_pow_haae116e5e5042c2c_pow($x, $y) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_pow_haae116e5e5042c2c_pow($self, $other) -> ret { + let v0 := $pow_checked__u256__3271ca15373d4483($self, $other) + ret := v0 + leave +} +function $pow_checked__u256__3271ca15373d4483($base, $exp) -> ret { + let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word($exp) + let v1 := and(v0, 115792089237316195423570985008687907853269984665640564039457584007913129639935) + let v2 := 0 + if v2 { + let v3 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(and(v1, 0), 0) + let v4 := v3 + if v4 { + revert(0, 0) + } + let v5 := 1 + let v6 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word($base) + let v7 := v1 + for { } 1 { } { + let v8 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v7, 0) + if iszero(v8) { + break + } + let v9 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(and(v7, 1), 0) + let v10 := v9 + if v10 { + let v11 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v5) + let v12 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v6) + let v13 := $u256_h3271ca15373d4483_mul_h290dcc921ed80777_mul(v11, v12) + let v14 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v13) + v5 := v14 + } + v7 := shr(1, v7) + let v15 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v7, 0) + let v16 := v15 + if v16 { + let v17 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v6) + let v18 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v6) + let v19 := $u256_h3271ca15373d4483_mul_h290dcc921ed80777_mul(v17, v18) + let v20 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v19) + v6 := v20 + } + if iszero(v16) { + } + } + let v21 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v5) + ret := v21 + leave + } + if iszero(v2) { + let v22 := 1 + let v23 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word($base) + let v24 := v1 + for { } 1 { } { + let v25 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v24, 0) + if iszero(v25) { + break + } + let v26 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(and(v24, 1), 0) + let v27 := v26 + if v27 { + let v28 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v22) + let v29 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v23) + let v30 := $u256_h3271ca15373d4483_mul_h290dcc921ed80777_mul(v28, v29) + let v31 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v30) + v22 := v31 + } + v24 := shr(1, v24) + let v32 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v24, 0) + let v33 := v32 + if v33 { + let v34 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v23) + let v35 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v23) + let v36 := $u256_h3271ca15373d4483_mul_h290dcc921ed80777_mul(v34, v35) + let v37 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v36) + v23 := v37 + } + if iszero(v33) { + } + } + let v38 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v22) + ret := v38 + leave + } +} +function $u256_h3271ca15373d4483_eq_he50383edd273619f_ne($self, $other) -> ret { + let v0 := iszero(eq($self, $other)) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word($word) -> ret { + ret := $word + leave +} +function $u256_h3271ca15373d4483_mul_h290dcc921ed80777_mul($self, $other) -> ret { + let v0 := $checked_mul_u256($self, $other) + ret := v0 + leave +} +function $checked_div_u256($a, $b) -> ret { + $ensure_nonzero_divisor__u256__3271ca15373d4483($b) + let v0 := div($a, $b) + ret := v0 + leave +} +function $checked_mul_u256($a, $b) -> ret { + let v0 := $checked_mul_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave +} +function $checked_mul_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingmul_h64e6b83610cda761_wrapping_mul($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(v1, 0) + let v3 := v2 + if v3 { + let v4 := $checked_div_u256(v0, $a) + let v5 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v4) + let v6 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v7 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(v5, v6) + let v8 := v7 + if v8 { + revert(0, 0) + } + ret := v0 + leave + } + if iszero(v3) { + ret := v0 + leave + } +} +function $ensure_nonzero_divisor__u256__3271ca15373d4483($b) { + let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0, 0) + let v2 := v1 + if v2 { + revert(0, 0) + } + leave +} +function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u256_h3271ca15373d4483_wrappingmul_h64e6b83610cda761_wrapping_mul($self, $other) -> ret { + let v0 := mul($self, $other) + ret := v0 leave } diff --git a/crates/codegen/tests/fixtures/block_expr.snap b/crates/codegen/tests/fixtures/block_expr.snap index 83d8bc0cea..3a8128d3f4 100644 --- a/crates/codegen/tests/fixtures/block_expr.snap +++ b/crates/codegen/tests/fixtures/block_expr.snap @@ -4,6 +4,38 @@ expression: output input_file: tests/fixtures/block_expr.fe --- function $block_expr() -> ret { - ret := add(1, 2) + let v0 := $checked_add_u64(1, 2) + ret := v0 + leave +} +function $checked_add_u64($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) + ret := v0 + leave +} +function $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) -> ret { + let v0 := $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := and(add(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 leave } diff --git a/crates/codegen/tests/fixtures/borrow_storage_field_handle.snap b/crates/codegen/tests/fixtures/borrow_storage_field_handle.snap index 860cb21617..5b28a506b5 100644 --- a/crates/codegen/tests/fixtures/borrow_storage_field_handle.snap +++ b/crates/codegen/tests/fixtures/borrow_storage_field_handle.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 33 expression: output input_file: tests/fixtures/borrow_storage_field_handle.fe --- @@ -8,8 +7,40 @@ function $borrow_storage_field_handle__StorPtr_CoinStore___ba1c0d0726e89ba2($sto let v0 := $store let v1 := v0 let v2 := sload(v1) - sstore(v1, add(v2, 1)) - let v3 := sload($store) - ret := v3 + let v3 := $checked_add_u256(v2, 1) + sstore(v1, v3) + let v4 := sload($store) + ret := v4 + leave +} +function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave +} +function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 leave } diff --git a/crates/codegen/tests/fixtures/by_ref_trait_provider_storage_bug.snap b/crates/codegen/tests/fixtures/by_ref_trait_provider_storage_bug.snap index b37ac280d5..781e5820c2 100644 --- a/crates/codegen/tests/fixtures/by_ref_trait_provider_storage_bug.snap +++ b/crates/codegen/tests/fixtures/by_ref_trait_provider_storage_bug.snap @@ -129,15 +129,50 @@ object "ByRefTraitProviderStorageBug" { } function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len($self) -> ret { let v0 := calldatasize() - ret := sub(v0, $self) + let v1 := $checked_sub_u256(v0, $self) + ret := v1 leave } function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := add($self, $byte_offset) + let v0 := $checked_add_u256($self, $byte_offset) let v1 := calldataload(v0) ret := v1 leave } + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } + function $checked_sub_u256($a, $b) -> ret { + let v0 := $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0, v1) + let v3 := v2 + if v3 { + revert(0, 0) + } + let v4 := $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + ret := v4 + leave + } function $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self, $pos) -> ret { let v0 := mload($self) let v1 := mload(0x40) @@ -182,7 +217,8 @@ object "ByRefTraitProviderStorageBug" { function $pair_h956dff41e88ee341_ctx_h4952b3c1f066f039_sum_stor_arg0_root_stor($self) -> ret { let v0 := sload($self) let v1 := sload(add($self, 1)) - ret := add(v0, v1) + let v2 := $checked_add_u256(v0, v1) + ret := v2 leave } function $return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f($self, $value) { @@ -204,13 +240,14 @@ object "ByRefTraitProviderStorageBug" { function $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := lt(v1, 4) - if v2 { + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, 4) + let v3 := v2 + if v3 { $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) } - let v3 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) - let v4 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v3) - ret := v4 + let v4 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) + let v5 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v4) + ret := v5 leave } function $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35($self) -> ret { @@ -252,37 +289,41 @@ object "ByRefTraitProviderStorageBug" { function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish($self) -> ret { let v0 := mload($self) let v1 := mload(add($self, 64)) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 + let v2 := $checked_sub_u256(v1, v0) + let v3 := mload(0x40) + if iszero(v3) { + v3 := 0x80 } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), sub(v1, v0)) - ret := v2 + mstore(0x40, add(v3, 64)) + mstore(v3, v0) + mstore(add(v3, 32), v2) + ret := v3 leave } function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head($self, $bytes) -> ret { let v0 := mload($self) - let v1 := eq(v0, 0) - if v1 { - let v2 := mload(64) - if iszero(v2) { - v2 := 0x80 + let v1 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0, 0) + let v2 := v1 + if v2 { + let v3 := mload(64) + if iszero(v3) { + v3 := 0x80 } - mstore(64, add(v2, $bytes)) - mstore($self, v2) - mstore(add($self, 32), v2) - mstore(add($self, 64), add(v2, $bytes)) + mstore(64, add(v3, $bytes)) + mstore($self, v3) + mstore(add($self, 32), v3) + let v4 := $checked_add_u256(v3, $bytes) + mstore(add($self, 64), v4) } - let v3 := mload($self) - ret := v3 + let v5 := mload($self) + ret := v5 leave } function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($self, $v) { let v0 := mload(add($self, 32)) mstore(v0, $v) - mstore(add($self, 32), add(v0, 32)) + let v1 := $checked_add_u256(v0, 32) + mstore(add($self, 32), v1) leave } function $solencoder_h1b9228b90dad6928_new() -> ret { @@ -310,10 +351,35 @@ object "ByRefTraitProviderStorageBug" { $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, $self) leave } + function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave + } function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { ret := $self leave } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := sub($self, $other) + ret := v0 + leave + } function $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word($word) -> ret { ret := $word leave diff --git a/crates/codegen/tests/fixtures/cast_u8_usize_cmp.snap b/crates/codegen/tests/fixtures/cast_u8_usize_cmp.snap index 1c5f8ea88e..db7923d766 100644 --- a/crates/codegen/tests/fixtures/cast_u8_usize_cmp.snap +++ b/crates/codegen/tests/fixtures/cast_u8_usize_cmp.snap @@ -1,31 +1,50 @@ --- source: crates/codegen/tests/yul.rs +assertion_line: 33 expression: output input_file: tests/fixtures/cast_u8_usize_cmp.fe --- function $cast_u8_usize_cmp($indices, $i, $j) -> ret { let v0 := and(mload(add($indices, mul($i, 32))), 0xff) - let v1 := lt($j, v0) - if v1 { + let v1 := $usize_ha12462c6d36e68b0_ord_h264f6d6d75097a_lt($j, v0) + let v2 := v1 + if v2 { ret := 1 leave } - if iszero(v1) { - let v2 := eq($j, v0) - if v2 { + if iszero(v2) { + let v3 := $usize_ha12462c6d36e68b0_eq_he50383edd273619f_eq($j, v0) + let v4 := v3 + if v4 { ret := 2 leave } - if iszero(v2) { - let v3 := gt($j, v0) - if v3 { + if iszero(v4) { + let v5 := $usize_ha12462c6d36e68b0_ord_h264f6d6d75097a_gt($j, v0) + let v6 := v5 + if v6 { ret := 3 leave } - if iszero(v3) { + if iszero(v6) { ret := 0 leave } } } } +function $usize_ha12462c6d36e68b0_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $usize_ha12462c6d36e68b0_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave +} +function $usize_ha12462c6d36e68b0_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave +} diff --git a/crates/codegen/tests/fixtures/code_region.snap b/crates/codegen/tests/fixtures/code_region.snap index 32ac758ca9..467d2f2947 100644 --- a/crates/codegen/tests/fixtures/code_region.snap +++ b/crates/codegen/tests/fixtures/code_region.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 33 expression: output input_file: tests/fixtures/code_region.fe --- @@ -8,11 +7,30 @@ object "Foo" { code { function $allocate__Evm_hef0af3106e109414__3af54274b2985741($bytes, $mem) -> ret { let v0 := mload(64) - let v1 := eq(v0, 0) - if v1 { + let v1 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0, 0) + let v2 := v1 + if v2 { v0 := 96 } - mstore(64, add(v0, $bytes)) + let v3 := $checked_add_u256(v0, $bytes) + mstore(64, v3) + ret := v0 + leave + } + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } ret := v0 leave } @@ -36,6 +54,25 @@ object "Foo" { codecopy(v8, v6, v5) return(v8, v5) } + function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave + } $init__StorPtr_Evm___207f35a85ac4062e() } diff --git a/crates/codegen/tests/fixtures/comparison_ops.snap b/crates/codegen/tests/fixtures/comparison_ops.snap index fb270d32d1..b495425abc 100644 --- a/crates/codegen/tests/fixtures/comparison_ops.snap +++ b/crates/codegen/tests/fixtures/comparison_ops.snap @@ -8,17 +8,53 @@ function $comparison_ops() -> ret { let v0 := 1 let v1 := 2 let v2 := 3 - let v3 := mload(0x40) - if iszero(v3) { - v3 := 0x80 + let v3 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0, v0) + let v4 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(v0, v1) + let v5 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v0, v1) + let v6 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_le(v1, v1) + let v7 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v2, v1) + let v8 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_ge(v2, v2) + let v9 := mload(0x40) + if iszero(v9) { + v9 := 0x80 } - mstore(0x40, add(v3, 192)) - mstore(v3, iszero(iszero(eq(v0, v0)))) - mstore(add(v3, 32), iszero(iszero(iszero(eq(v0, v1))))) - mstore(add(v3, 64), iszero(iszero(lt(v0, v1)))) - mstore(add(v3, 96), iszero(iszero(iszero(gt(v1, v1))))) - mstore(add(v3, 128), iszero(iszero(gt(v2, v1)))) - mstore(add(v3, 160), iszero(iszero(iszero(lt(v2, v2))))) - ret := v3 + mstore(0x40, add(v9, 192)) + mstore(v9, iszero(iszero(v3))) + mstore(add(v9, 32), iszero(iszero(v4))) + mstore(add(v9, 64), iszero(iszero(v5))) + mstore(add(v9, 96), iszero(iszero(v6))) + mstore(add(v9, 128), iszero(iszero(v7))) + mstore(add(v9, 160), iszero(iszero(v8))) + ret := v9 + leave +} +function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_eq_he50383edd273619f_ne($self, $other) -> ret { + let v0 := iszero(eq($self, $other)) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_le($self, $other) -> ret { + let v0 := iszero(gt($self, $other)) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_ge($self, $other) -> ret { + let v0 := iszero(lt($self, $other)) + ret := v0 leave } diff --git a/crates/codegen/tests/fixtures/const_array.snap b/crates/codegen/tests/fixtures/const_array.snap index be2aafbf1c..bb99197daa 100644 --- a/crates/codegen/tests/fixtures/const_array.snap +++ b/crates/codegen/tests/fixtures/const_array.snap @@ -20,19 +20,51 @@ object "main" { mstore(0x40, add(v2, 96)) datacopy(v2, dataoffset("data_sum_two_0"), datasize("data_sum_two_0")) let v3 := mload(add(v2, mul($j, 32))) - let v4 := mload(0x40) - if iszero(v4) { - v4 := 0x80 - } - mstore(0x40, add(v4, 96)) - datacopy(v4, dataoffset("data_sum_two_0"), datasize("data_sum_two_0")) + let v4 := $checked_add_u256(v1, v3) let v5 := mload(0x40) if iszero(v5) { v5 := 0x80 } mstore(0x40, add(v5, 96)) datacopy(v5, dataoffset("data_sum_two_0"), datasize("data_sum_two_0")) - ret := add(v1, v3) + let v6 := mload(0x40) + if iszero(v6) { + v6 := 0x80 + } + mstore(0x40, add(v6, 96)) + datacopy(v6, dataoffset("data_sum_two_0"), datasize("data_sum_two_0")) + ret := v4 + leave + } + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } + function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 leave } } diff --git a/crates/codegen/tests/fixtures/const_array_add.snap b/crates/codegen/tests/fixtures/const_array_add.snap index c540495ff6..3ad84b26d6 100644 --- a/crates/codegen/tests/fixtures/const_array_add.snap +++ b/crates/codegen/tests/fixtures/const_array_add.snap @@ -13,7 +13,39 @@ object "main" { mstore(0x40, add(v0, 96)) datacopy(v0, dataoffset("data_get_sum_0"), datasize("data_get_sum_0")) let v1 := mload(v0) - ret := add(1, v1) + let v2 := $checked_add_u256(1, v1) + ret := v2 + leave + } + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } + function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 leave } } diff --git a/crates/codegen/tests/fixtures/create_contract.snap b/crates/codegen/tests/fixtures/create_contract.snap index 386600841f..4659bb8664 100644 --- a/crates/codegen/tests/fixtures/create_contract.snap +++ b/crates/codegen/tests/fixtures/create_contract.snap @@ -91,87 +91,130 @@ object "Factory" { } function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len($self) -> ret { let v0 := calldatasize() - ret := sub(v0, $self) + let v1 := $checked_sub_u256(v0, $self) + ret := v1 leave } function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := add($self, $byte_offset) + let v0 := $checked_add_u256($self, $byte_offset) let v1 := calldataload(v0) ret := v1 leave } + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } + function $checked_sub_u256($a, $b) -> ret { + let v0 := $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0, v1) + let v3 := v2 + if v3 { + revert(0, 0) + } + let v4 := $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + ret := v4 + leave + } function $create2_stor_arg0_root_stor__Evm_hef0af3106e109414_Child_hdfa2e9d62e9c9ad3__8303e18f50f8d8ed($self, $value, $args, $salt) -> ret { let v0 := $__Child_init_code_len() let v1 := $__Child_init_code_offset() let v2 := 64 - let v3 := add(v0, v2) - let v4 := mload(64) - if iszero(v4) { - v4 := 0x80 - } - mstore(64, add(v4, v3)) - codecopy(v4, v1, v0) - let v5 := add(v4, v0) - let v6 := mload(0x40) - if iszero(v6) { - v6 := 0x80 - } - mstore(0x40, add(v6, 96)) - mstore(v6, v5) - mstore(add(v6, 32), v5) - mstore(add(v6, 64), add(v5, v2)) + let v3 := $checked_add_u256(v0, v2) + let v4 := v3 + let v5 := mload(64) + if iszero(v5) { + v5 := 0x80 + } + mstore(64, add(v5, v4)) + codecopy(v5, v1, v0) + let v6 := $checked_add_u256(v5, v0) let v7 := v6 - $_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64($args, v7) - let v8 := $evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create2_raw_stor_arg0_root_stor($self, $value, v4, v3, $salt) - let v9 := eq(v8, 0) - if v9 { - let v10 := returndatasize() - let v11 := mload(64) - if iszero(v11) { - v11 := 0x80 + let v8 := $checked_add_u256(v7, v2) + let v9 := mload(0x40) + if iszero(v9) { + v9 := 0x80 + } + mstore(0x40, add(v9, 96)) + mstore(v9, v7) + mstore(add(v9, 32), v7) + mstore(add(v9, 64), v8) + let v10 := v9 + $_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64($args, v10) + let v11 := $evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create2_raw_stor_arg0_root_stor($self, $value, v5, v4, $salt) + let v12 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v11, 0) + let v13 := v12 + if v13 { + let v14 := returndatasize() + let v15 := mload(64) + if iszero(v15) { + v15 := 0x80 } - mstore(64, add(v11, v10)) - returndatacopy(v11, 0, v10) - revert(v11, v10) + mstore(64, add(v15, v14)) + returndatacopy(v15, 0, v14) + revert(v15, v14) } - ret := v8 + ret := v11 leave } function $create_stor_arg0_root_stor__Evm_hef0af3106e109414_Child_hdfa2e9d62e9c9ad3__8303e18f50f8d8ed($self, $value, $args) -> ret { let v0 := $__Child_init_code_len() let v1 := $__Child_init_code_offset() let v2 := 64 - let v3 := add(v0, v2) - let v4 := mload(64) - if iszero(v4) { - v4 := 0x80 - } - mstore(64, add(v4, v3)) - codecopy(v4, v1, v0) - let v5 := add(v4, v0) - let v6 := mload(0x40) - if iszero(v6) { - v6 := 0x80 - } - mstore(0x40, add(v6, 96)) - mstore(v6, v5) - mstore(add(v6, 32), v5) - mstore(add(v6, 64), add(v5, v2)) + let v3 := $checked_add_u256(v0, v2) + let v4 := v3 + let v5 := mload(64) + if iszero(v5) { + v5 := 0x80 + } + mstore(64, add(v5, v4)) + codecopy(v5, v1, v0) + let v6 := $checked_add_u256(v5, v0) let v7 := v6 - $_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64($args, v7) - let v8 := $evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create_raw_stor_arg0_root_stor($self, $value, v4, v3) - let v9 := eq(v8, 0) - if v9 { - let v10 := returndatasize() - let v11 := mload(64) - if iszero(v11) { - v11 := 0x80 + let v8 := $checked_add_u256(v7, v2) + let v9 := mload(0x40) + if iszero(v9) { + v9 := 0x80 + } + mstore(0x40, add(v9, 96)) + mstore(v9, v7) + mstore(add(v9, 32), v7) + mstore(add(v9, 64), v8) + let v10 := v9 + $_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64($args, v10) + let v11 := $evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create_raw_stor_arg0_root_stor($self, $value, v5, v4) + let v12 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v11, 0) + let v13 := v12 + if v13 { + let v14 := returndatasize() + let v15 := mload(64) + if iszero(v15) { + v15 := 0x80 } - mstore(64, add(v11, v10)) - returndatacopy(v11, 0, v10) - revert(v11, v10) + mstore(64, add(v15, v14)) + returndatacopy(v15, 0, v14) + revert(v15, v14) } - ret := v8 + ret := v11 leave } function $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self, $pos) -> ret { @@ -264,13 +307,14 @@ object "Factory" { function $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := lt(v1, 4) - if v2 { + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, 4) + let v3 := v2 + if v3 { $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) } - let v3 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) - let v4 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v3) - ret := v4 + let v4 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) + let v5 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v4) + ret := v5 leave } function $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35($self) -> ret { @@ -298,21 +342,24 @@ object "Factory" { let v0 := mload($self) let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) let v2 := mload(add($self, 32)) - let v3 := add(v2, 32) - let v4 := mload(add($self, 32)) - let v5 := lt(v3, v4) - if v5 { + let v3 := $checked_add_u256(v2, 32) + let v4 := v3 + let v5 := mload(add($self, 32)) + let v6 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v4, v5) + let v7 := v6 + if v7 { revert(0, 0) } - let v6 := gt(v3, v1) - if v6 { + let v8 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v4, v1) + let v9 := v8 + if v9 { revert(0, 0) } - let v7 := mload($self) - let v8 := mload(add($self, 32)) - let v9 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v7, v8) - mstore(add($self, 32), v3) - ret := v9 + let v10 := mload($self) + let v11 := mload(add($self, 32)) + let v12 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v10, v11) + mstore(add($self, 32), v4) + ret := v12 leave } function $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { @@ -333,37 +380,41 @@ object "Factory" { function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish($self) -> ret { let v0 := mload($self) let v1 := mload(add($self, 64)) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 + let v2 := $checked_sub_u256(v1, v0) + let v3 := mload(0x40) + if iszero(v3) { + v3 := 0x80 } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), sub(v1, v0)) - ret := v2 + mstore(0x40, add(v3, 64)) + mstore(v3, v0) + mstore(add(v3, 32), v2) + ret := v3 leave } function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head($self, $bytes) -> ret { let v0 := mload($self) - let v1 := eq(v0, 0) - if v1 { - let v2 := mload(64) - if iszero(v2) { - v2 := 0x80 - } - mstore(64, add(v2, $bytes)) - mstore($self, v2) - mstore(add($self, 32), v2) - mstore(add($self, 64), add(v2, $bytes)) - } - let v3 := mload($self) - ret := v3 + let v1 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0, 0) + let v2 := v1 + if v2 { + let v3 := mload(64) + if iszero(v3) { + v3 := 0x80 + } + mstore(64, add(v3, $bytes)) + mstore($self, v3) + mstore(add($self, 32), v3) + let v4 := $checked_add_u256(v3, $bytes) + mstore(add($self, 64), v4) + } + let v5 := mload($self) + ret := v5 leave } function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($self, $v) { let v0 := mload(add($self, 32)) mstore(v0, $v) - mstore(add($self, 32), add(v0, 32)) + let v1 := $checked_add_u256(v0, 32) + mstore(add($self, 32), v1) leave } function $solencoder_h1b9228b90dad6928_new() -> ret { @@ -387,10 +438,35 @@ object "Factory" { $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, $self) leave } + function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave + } function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { ret := $self leave } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := sub($self, $other) + ret := v0 + leave + } function $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word($word) -> ret { ret := $word leave @@ -436,6 +512,23 @@ object "Factory" { sstore(add($state, 1), $y) leave } + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } function $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { let v0 := mload(0x40) if iszero(v0) { @@ -469,7 +562,7 @@ object "Factory" { } function $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { let v0 := mload($self) - let v1 := add(v0, $byte_offset) + let v1 := $checked_add_u256(v0, $byte_offset) let v2 := mload(v1) ret := v2 leave @@ -482,20 +575,23 @@ object "Factory" { function $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($self) -> ret { let v0 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len($self) let v1 := mload(add($self, 64)) - let v2 := add(v1, 32) - let v3 := mload(add($self, 64)) - let v4 := lt(v2, v3) - if v4 { + let v2 := $checked_add_u256(v1, 32) + let v3 := v2 + let v4 := mload(add($self, 64)) + let v5 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v3, v4) + let v6 := v5 + if v6 { revert(0, 0) } - let v5 := gt(v2, v0) - if v5 { + let v7 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v3, v0) + let v8 := v7 + if v8 { revert(0, 0) } - let v6 := mload(add($self, 64)) - let v7 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, v6) - mstore(add($self, 64), v2) - ret := v7 + let v9 := mload(add($self, 64)) + let v10 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, v9) + mstore(add($self, 64), v3) + ret := v10 leave } function $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { @@ -527,6 +623,25 @@ object "Factory" { ret := v0 leave } + function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave + } $__Child_init() } @@ -543,15 +658,50 @@ object "Factory" { } function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len($self) -> ret { let v0 := calldatasize() - ret := sub(v0, $self) + let v1 := $checked_sub_u256(v0, $self) + ret := v1 leave } function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := add($self, $byte_offset) + let v0 := $checked_add_u256($self, $byte_offset) let v1 := calldataload(v0) ret := v1 leave } + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } + function $checked_sub_u256($a, $b) -> ret { + let v0 := $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0, v1) + let v3 := v2 + if v3 { + revert(0, 0) + } + let v4 := $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + ret := v4 + leave + } function $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self, $pos) -> ret { let v0 := mload($self) let v1 := mload(0x40) @@ -596,13 +746,14 @@ object "Factory" { function $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := lt(v1, 4) - if v2 { + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, 4) + let v3 := v2 + if v3 { $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) } - let v3 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) - let v4 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v3) - ret := v4 + let v4 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) + let v5 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v4) + ret := v5 leave } function $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35($self) -> ret { @@ -649,6 +800,26 @@ object "Factory" { ret := $self leave } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := sub($self, $other) + ret := v0 + leave + } function $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word($word) -> ret { ret := $word leave diff --git a/crates/codegen/tests/fixtures/effect_ptr_domains.snap b/crates/codegen/tests/fixtures/effect_ptr_domains.snap index 14cbba7ee0..5fdad086a3 100644 --- a/crates/codegen/tests/fixtures/effect_ptr_domains.snap +++ b/crates/codegen/tests/fixtures/effect_ptr_domains.snap @@ -1,14 +1,15 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 33 expression: output input_file: tests/fixtures/effect_ptr_domains.fe --- function $bump__StorPtr_Foo___3698cc3c4b2626e3($foo) { let v0 := sload($foo) - sstore($foo, add(v0, 1)) - let v1 := sload(add($foo, 1)) - sstore(add($foo, 1), add(v1, 2)) + let v1 := $checked_add_u256(v0, 1) + sstore($foo, v1) + let v2 := sload(add($foo, 1)) + let v3 := $checked_add_u256(v2, 2) + sstore(add($foo, 1), v3) leave } function $test_effect_ptr_domains__Evm_hef0af3106e109414_Evm_hef0af3106e109414__7ab75559784fbc59($st, $mem) { @@ -37,9 +38,11 @@ function $mem_ptr_stor_arg0_root_stor__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992 } function $bump__MemPtr_Foo___cdd30998d577b6ea($foo) { let v0 := mload($foo) - mstore($foo, add(v0, 1)) - let v1 := mload(add($foo, 32)) - mstore(add($foo, 32), add(v1, 2)) + let v1 := $checked_add_u256(v0, 1) + mstore($foo, v1) + let v2 := mload(add($foo, 32)) + let v3 := $checked_add_u256(v2, 2) + mstore(add($foo, 32), v3) leave } function $stor_ptr_stor_arg0_root_stor__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d($self, $slot) -> ret { @@ -55,3 +58,34 @@ function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__ ret := $raw leave } +function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave +} +function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave +} diff --git a/crates/codegen/tests/fixtures/enum_variant_contract.snap b/crates/codegen/tests/fixtures/enum_variant_contract.snap index edad8d817d..4ff26b3655 100644 --- a/crates/codegen/tests/fixtures/enum_variant_contract.snap +++ b/crates/codegen/tests/fixtures/enum_variant_contract.snap @@ -25,88 +25,96 @@ object "EnumContract" { function $runtime__StorPtr_Evm___207f35a85ac4062e() { let v0 := calldataload(0) let v1 := shr(224, v0) - let v2 := eq(v1, 1817627404) - if v2 { - let v3 := calldataload(4) - let v4 := mload(0x40) - if iszero(v4) { - v4 := 0x80 + let v2 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v1, 1817627404) + let v3 := v2 + if v3 { + let v4 := calldataload(4) + let v5 := mload(0x40) + if iszero(v5) { + v5 := 0x80 } - mstore(0x40, add(v4, 64)) - mstore(v4, 1) - mstore(add(v4, 32), v3) - let v5 := 0 - let v6 := mload(v4) - switch v6 + mstore(0x40, add(v5, 64)) + mstore(v5, 1) + mstore(add(v5, 32), v4) + let v6 := 0 + let v7 := mload(v5) + switch v7 case 1 { - let v7 := mload(add(v4, 32)) - let v8 := v7 - v5 := v8 + let v8 := mload(add(v5, 32)) + let v9 := v8 + v6 := v9 } case 0 { - v5 := 0 + v6 := 0 } default { } - let v9 := v4 let v10 := v5 - $abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v10, 0) + let v11 := v6 + $abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v11, 0) } - if iszero(v2) { - let v11 := eq(v1, 1163776883) - if v11 { - let v12 := mload(0x40) - if iszero(v12) { - v12 := 0x80 + if iszero(v3) { + let v12 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v1, 1163776883) + let v13 := v12 + if v13 { + let v14 := mload(0x40) + if iszero(v14) { + v14 := 0x80 } - mstore(0x40, add(v12, 64)) - mstore(v12, 0) - let v13 := 0 - let v14 := mload(v12) - switch v14 + mstore(0x40, add(v14, 64)) + mstore(v14, 0) + let v15 := 0 + let v16 := mload(v14) + switch v16 case 1 { - let v15 := mload(add(v12, 32)) - let v16 := v15 - v13 := v16 + let v17 := mload(add(v14, 32)) + let v18 := v17 + v15 := v18 } case 0 { - v13 := 0 + v15 := 0 } default { } - let v17 := v12 - let v18 := v13 - $abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v18, 0) + let v19 := v14 + let v20 := v15 + $abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v20, 0) } - if iszero(v11) { - let v19 := eq(v1, 3572425762) - if iszero(v19) { + if iszero(v13) { + let v21 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v1, 3572425762) + let v22 := v21 + if iszero(v22) { return(0, 0) } - let v20 := calldataload(4) - let v21 := mload(0x40) - if iszero(v21) { - v21 := 0x80 + let v23 := calldataload(4) + let v24 := mload(0x40) + if iszero(v24) { + v24 := 0x80 } - mstore(0x40, add(v21, 64)) - mstore(v21, 1) - mstore(add(v21, 32), v20) - let v22 := 0 - let v23 := mload(v21) - switch v23 + mstore(0x40, add(v24, 64)) + mstore(v24, 1) + mstore(add(v24, 32), v23) + let v25 := 0 + let v26 := mload(v24) + switch v26 case 1 { - v22 := 1 + v25 := 1 } case 0 { - v22 := 0 + v25 := 0 } default { } - let v24 := v22 - $abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v24, 0) + let v27 := v25 + $abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741(v27, 0) } } } + function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave + } $runtime__StorPtr_Evm___207f35a85ac4062e() return(0, 0) } diff --git a/crates/codegen/tests/fixtures/erc20.snap b/crates/codegen/tests/fixtures/erc20.snap index 6d12b14cdc..61ef1291d6 100644 --- a/crates/codegen/tests/fixtures/erc20.snap +++ b/crates/codegen/tests/fixtures/erc20.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 33 expression: output input_file: tests/fixtures/erc20.fe --- @@ -41,8 +40,9 @@ object "CoolCoin" { function $__CoolCoin_init_contract($initial_supply, $owner, $store, $auth, $ctx, $log) { $accesscontrol____h4c85da5bbb505ade_grant_stor_arg0_root_stor__3__577ab43c73dd3cef($auth, 1, $owner) $accesscontrol____h4c85da5bbb505ade_grant_stor_arg0_root_stor__3__577ab43c73dd3cef($auth, 2, $owner) - let v0 := gt($initial_supply, 0) - if v0 { + let v0 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($initial_supply, 0) + let v1 := v0 + if v1 { $mint__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb($owner, $initial_supply, $store, $log) } leave @@ -50,9 +50,11 @@ object "CoolCoin" { function $_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__u256_Address_h257056268eac7027__802280feae02d9df($ptr, $self) -> ret { let v0 := mload($self) let v1 := $u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key($ptr, v0) - let v2 := mload(add($self, 32)) - let v3 := $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key(add($ptr, v1), v2) - ret := add(v1, v3) + let v2 := $checked_add_u256($ptr, v1) + let v3 := mload(add($self, 32)) + let v4 := $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key(v2, v3) + let v5 := $checked_add_u256(v1, v4) + ret := v5 leave } function $accesscontrol____h4c85da5bbb505ade_grant_stor_arg0_root_stor__3__577ab43c73dd3cef($self, $role, $to) { @@ -72,7 +74,8 @@ object "CoolCoin" { leave } function $address_h257056268eac7027_eq_h14b330e44530c410_eq($self, $other) -> ret { - ret := eq($self, $other) + let v0 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) + ret := v0 leave } function $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key($ptr, $self) -> ret { @@ -107,6 +110,40 @@ object "CoolCoin" { ret := v0 leave } + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } + function $checked_sub_u256($a, $b) -> ret { + let v0 := $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0, v1) + let v3 := v2 + if v3 { + revert(0, 0) + } + let v4 := $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + ret := v4 + leave + } function $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { let v0 := mload(0x40) if iszero(v0) { @@ -158,7 +195,7 @@ object "CoolCoin" { } function $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { let v0 := mload($self) - let v1 := add(v0, $byte_offset) + let v1 := $checked_add_u256(v0, $byte_offset) let v2 := mload(v1) ret := v2 leave @@ -168,21 +205,23 @@ object "CoolCoin" { let v1 := $ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2($to, v0) $assert(v1) let v2 := sload($store) - sstore($store, add(v2, $amount)) + let v3 := $checked_add_u256(v2, $amount) + sstore($store, v3) pop($store) pop($store) - let v3 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to, add(v3, $amount)) - let v4 := $address_h257056268eac7027_zero() - let v5 := mload(0x40) - if iszero(v5) { - v5 := 0x80 - } - mstore(0x40, add(v5, 96)) - mstore(v5, v4) - mstore(add(v5, 32), $to) - mstore(add(v5, 64), $amount) - $emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63($log, v5) + let v4 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to) + let v5 := $checked_add_u256(v4, $amount) + $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to, v5) + let v6 := $address_h257056268eac7027_zero() + let v7 := mload(0x40) + if iszero(v7) { + v7 := 0x80 + } + mstore(0x40, add(v7, 96)) + mstore(v7, v6) + mstore(add(v7, 32), $to) + mstore(add(v7, 64), $amount) + $emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63($log, v7) leave } function $ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2($self, $other) -> ret { @@ -198,20 +237,23 @@ object "CoolCoin" { function $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($self) -> ret { let v0 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len($self) let v1 := mload(add($self, 64)) - let v2 := add(v1, 32) - let v3 := mload(add($self, 64)) - let v4 := lt(v2, v3) - if v4 { + let v2 := $checked_add_u256(v1, 32) + let v3 := v2 + let v4 := mload(add($self, 64)) + let v5 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v3, v4) + let v6 := v5 + if v6 { revert(0, 0) } - let v5 := gt(v2, v0) - if v5 { + let v7 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v3, v0) + let v8 := v7 + if v8 { revert(0, 0) } - let v6 := mload(add($self, 64)) - let v7 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, v6) - mstore(add($self, 64), v2) - ret := v7 + let v9 := mload(add($self, 64)) + let v10 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, v9) + mstore(add($self, 64), v3) + ret := v10 leave } function $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { @@ -232,37 +274,41 @@ object "CoolCoin" { function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish($self) -> ret { let v0 := mload($self) let v1 := mload(add($self, 64)) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 - } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), sub(v1, v0)) - ret := v2 + let v2 := $checked_sub_u256(v1, v0) + let v3 := mload(0x40) + if iszero(v3) { + v3 := 0x80 + } + mstore(0x40, add(v3, 64)) + mstore(v3, v0) + mstore(add(v3, 32), v2) + ret := v3 leave } function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head($self, $bytes) -> ret { let v0 := mload($self) - let v1 := eq(v0, 0) - if v1 { - let v2 := mload(64) - if iszero(v2) { - v2 := 0x80 + let v1 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0, 0) + let v2 := v1 + if v2 { + let v3 := mload(64) + if iszero(v3) { + v3 := 0x80 } - mstore(64, add(v2, $bytes)) - mstore($self, v2) - mstore(add($self, 32), v2) - mstore(add($self, 64), add(v2, $bytes)) + mstore(64, add(v3, $bytes)) + mstore($self, v3) + mstore(add($self, 32), v3) + let v4 := $checked_add_u256(v3, $bytes) + mstore(add($self, 64), v4) } - let v3 := mload($self) - ret := v3 + let v5 := mload($self) + ret := v5 leave } function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($self, $v) { let v0 := mload(add($self, 32)) mstore(v0, $v) - mstore(add($self, 32), add(v0, 32)) + let v1 := $checked_add_u256(v0, 32) + mstore(add($self, 32), v1) leave } function $solencoder_h1b9228b90dad6928_new() -> ret { @@ -278,7 +324,7 @@ object "CoolCoin" { leave } function $stor_ptr__Evm_hef0af3106e109414_AccessControl_3___1911f7c438797961($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__TokenStore_0__1___175215aa56127bde($slot) + let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__AccessControl_3___3633e113b859df5f($slot) ret := v0 leave } @@ -326,10 +372,11 @@ object "CoolCoin" { } mstore(64, add(v0, 0)) let v1 := $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key(v0, $key) - mstore(add(v0, v1), $salt) - let v2 := add(v1, 32) - let v3 := keccak256(v0, v2) - ret := v3 + let v2 := $checked_add_u256(v0, v1) + mstore(v2, $salt) + let v3 := $checked_add_u256(v1, 32) + let v4 := keccak256(v0, v3) + ret := v4 leave } function $storagemap_storage_slot_with_salt___u256__Address___c7c570db20cdd393($key, $salt) -> ret { @@ -339,10 +386,15 @@ object "CoolCoin" { } mstore(64, add(v0, 0)) let v1 := $_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__u256_Address_h257056268eac7027__802280feae02d9df(v0, $key) - mstore(add(v0, v1), $salt) - let v2 := add(v1, 32) - let v3 := keccak256(v0, v2) - ret := v3 + let v2 := $checked_add_u256(v0, v1) + mstore(v2, $salt) + let v3 := $checked_add_u256(v1, 32) + let v4 := keccak256(v0, v3) + ret := v4 + leave + } + function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__AccessControl_3___3633e113b859df5f($raw) -> ret { + ret := $raw leave } function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__TokenStore_0__1___175215aa56127bde($raw) -> ret { @@ -377,6 +429,25 @@ object "CoolCoin" { $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, $self) leave } + function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } function $u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key($ptr, $self) -> ret { mstore($ptr, $self) ret := 32 @@ -390,6 +461,16 @@ object "CoolCoin" { ret := $self leave } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := sub($self, $other) + ret := v0 + leave + } $__CoolCoin_init() } @@ -512,7 +593,8 @@ object "CoolCoin" { mstore(v5, v4) mstore(add(v5, 32), v1) let v6 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(0, v5) - $approve__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb(v4, v1, add(v6, v3), $store, $log) + let v7 := $checked_add_u256(v6, v3) + $approve__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb(v4, v1, v7, $store, $log) ret := 1 leave } @@ -531,8 +613,10 @@ object "CoolCoin" { mstore(v5, v4) mstore(add(v5, 32), v1) let v6 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(0, v5) - $assert(iszero(lt(v6, v3))) - $approve__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb(v4, v1, sub(v6, v3), $store, $log) + let v7 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_ge(v6, v3) + $assert(v7) + let v8 := $checked_sub_u256(v6, v3) + $approve__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb(v4, v1, v8, $store, $log) ret := 1 leave } @@ -619,17 +703,21 @@ object "CoolCoin" { function $_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2($ptr, $self) -> ret { let v0 := mload($self) let v1 := $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key($ptr, v0) - let v2 := mload(add($self, 32)) - let v3 := $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key(add($ptr, v1), v2) - ret := add(v1, v3) + let v2 := $checked_add_u256($ptr, v1) + let v3 := mload(add($self, 32)) + let v4 := $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key(v2, v3) + let v5 := $checked_add_u256(v1, v4) + ret := v5 leave } function $_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__u256_Address_h257056268eac7027__802280feae02d9df($ptr, $self) -> ret { let v0 := mload($self) let v1 := $u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key($ptr, v0) - let v2 := mload(add($self, 32)) - let v3 := $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key(add($ptr, v1), v2) - ret := add(v1, v3) + let v2 := $checked_add_u256($ptr, v1) + let v3 := mload(add($self, 32)) + let v4 := $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key(v2, v3) + let v5 := $checked_add_u256(v1, v4) + ret := v5 leave } function $accesscontrol____h4c85da5bbb505ade_require_stor_arg0_root_stor__3_Evm_hef0af3106e109414__5baaa260f0d18873($self, $role, $ctx) { @@ -642,7 +730,8 @@ object "CoolCoin" { mstore(v1, $role) mstore(add(v1, 32), v0) let v2 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___u256__Address__bool_3__5e1c6d4e3f4fb7e8(0, v1) - $assert(eq(v2, 1)) + let v3 := $bool_h947c0c03c59c6f07_eq_he50383edd273619f_eq(v2, 1) + $assert(v3) leave } function $address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98($d) -> ret { @@ -651,7 +740,8 @@ object "CoolCoin" { leave } function $address_h257056268eac7027_eq_h14b330e44530c410_eq($self, $other) -> ret { - ret := eq($self, $other) + let v0 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) + ret := v0 leave } function $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key($ptr, $self) -> ret { @@ -761,8 +851,14 @@ object "CoolCoin" { } leave } + function $bool_h947c0c03c59c6f07_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq(iszero(iszero($self)), iszero(iszero($other))) + ret := v0 + leave + } function $bool_h947c0c03c59c6f07_wordrepr_h7483d41ac8178d88_from_word($word) -> ret { - ret := iszero(eq($word, 0)) + let v0 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne($word, 0) + ret := v0 leave } function $burn__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb($from, $amount, $store, $log) { @@ -771,21 +867,24 @@ object "CoolCoin" { $assert(v1) pop($store) let v2 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $from) - $assert(iszero(lt(v2, $amount))) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_ge(v2, $amount) + $assert(v3) pop($store) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $from, sub(v2, $amount)) - let v3 := sload($store) - sstore($store, sub(v3, $amount)) - let v4 := $address_h257056268eac7027_zero() - let v5 := mload(0x40) - if iszero(v5) { - v5 := 0x80 + let v4 := $checked_sub_u256(v2, $amount) + $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $from, v4) + let v5 := sload($store) + let v6 := $checked_sub_u256(v5, $amount) + sstore($store, v6) + let v7 := $address_h257056268eac7027_zero() + let v8 := mload(0x40) + if iszero(v8) { + v8 := 0x80 } - mstore(0x40, add(v5, 96)) - mstore(v5, $from) - mstore(add(v5, 32), v4) - mstore(add(v5, 64), $amount) - $emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63($log, v5) + mstore(0x40, add(v8, 96)) + mstore(v8, $from) + mstore(add(v8, 32), v7) + mstore(add(v8, 64), $amount) + $emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63($log, v8) leave } function $burn_h25a61f4466d20eed_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) -> ret { @@ -808,15 +907,50 @@ object "CoolCoin" { } function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len($self) -> ret { let v0 := calldatasize() - ret := sub(v0, $self) + let v1 := $checked_sub_u256(v0, $self) + ret := v1 leave } function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := add($self, $byte_offset) + let v0 := $checked_add_u256($self, $byte_offset) let v1 := calldataload(v0) ret := v1 leave } + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } + function $checked_sub_u256($a, $b) -> ret { + let v0 := $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0, v1) + let v3 := v2 + if v3 { + revert(0, 0) + } + let v4 := $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + ret := v4 + leave + } function $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self, $pos) -> ret { let v0 := mload($self) let v1 := mload(0x40) @@ -906,21 +1040,23 @@ object "CoolCoin" { let v1 := $ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2($to, v0) $assert(v1) let v2 := sload($store) - sstore($store, add(v2, $amount)) + let v3 := $checked_add_u256(v2, $amount) + sstore($store, v3) pop($store) pop($store) - let v3 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to, add(v3, $amount)) - let v4 := $address_h257056268eac7027_zero() - let v5 := mload(0x40) - if iszero(v5) { - v5 := 0x80 + let v4 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to) + let v5 := $checked_add_u256(v4, $amount) + $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to, v5) + let v6 := $address_h257056268eac7027_zero() + let v7 := mload(0x40) + if iszero(v7) { + v7 := 0x80 } - mstore(0x40, add(v5, 96)) - mstore(v5, v4) - mstore(add(v5, 32), $to) - mstore(add(v5, 64), $amount) - $emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63($log, v5) + mstore(0x40, add(v7, 96)) + mstore(v7, v6) + mstore(add(v7, 32), $to) + mstore(add(v7, 64), $amount) + $emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63($log, v7) leave } function $mint_ha2f94817be433a2e_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) -> ret { @@ -958,7 +1094,7 @@ object "CoolCoin" { let v0 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() let v1 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0, 32) pop(v1) - $string_const_n__usize__h78b9b185054e88a2_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_32_SolEncoder_h1b9228b90dad6928__562228df2278c1ed($value, v0) + $string_const_n__usize__h78b9b185054e88a2_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_8_SolEncoder_h1b9228b90dad6928__1811d65564ab2650($value, v0) let v2 := $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0) let v3 := mload(v2) let v4 := mload(add(v2, 32)) @@ -1003,13 +1139,14 @@ object "CoolCoin" { function $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := lt(v1, 4) - if v2 { + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, 4) + let v3 := v2 + if v3 { $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) } - let v3 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) - let v4 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v3) - ret := v4 + let v4 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) + let v5 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v4) + ret := v5 leave } function $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35($self) -> ret { @@ -1037,21 +1174,24 @@ object "CoolCoin" { let v0 := mload($self) let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) let v2 := mload(add($self, 32)) - let v3 := add(v2, 32) - let v4 := mload(add($self, 32)) - let v5 := lt(v3, v4) - if v5 { + let v3 := $checked_add_u256(v2, 32) + let v4 := v3 + let v5 := mload(add($self, 32)) + let v6 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v4, v5) + let v7 := v6 + if v7 { revert(0, 0) } - let v6 := gt(v3, v1) - if v6 { + let v8 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v4, v1) + let v9 := v8 + if v9 { revert(0, 0) } - let v7 := mload($self) - let v8 := mload(add($self, 32)) - let v9 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v7, v8) - mstore(add($self, 32), v3) - ret := v9 + let v10 := mload($self) + let v11 := mload(add($self, 32)) + let v12 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v10, v11) + mstore(add($self, 32), v4) + ret := v12 leave } function $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { @@ -1072,37 +1212,41 @@ object "CoolCoin" { function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish($self) -> ret { let v0 := mload($self) let v1 := mload(add($self, 64)) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 + let v2 := $checked_sub_u256(v1, v0) + let v3 := mload(0x40) + if iszero(v3) { + v3 := 0x80 } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), sub(v1, v0)) - ret := v2 + mstore(0x40, add(v3, 64)) + mstore(v3, v0) + mstore(add(v3, 32), v2) + ret := v3 leave } function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head($self, $bytes) -> ret { let v0 := mload($self) - let v1 := eq(v0, 0) - if v1 { - let v2 := mload(64) - if iszero(v2) { - v2 := 0x80 + let v1 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0, 0) + let v2 := v1 + if v2 { + let v3 := mload(64) + if iszero(v3) { + v3 := 0x80 } - mstore(64, add(v2, $bytes)) - mstore($self, v2) - mstore(add($self, 32), v2) - mstore(add($self, 64), add(v2, $bytes)) + mstore(64, add(v3, $bytes)) + mstore($self, v3) + mstore(add($self, 32), v3) + let v4 := $checked_add_u256(v3, $bytes) + mstore(add($self, 64), v4) } - let v3 := mload($self) - ret := v3 + let v5 := mload($self) + ret := v5 leave } function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($self, $v) { let v0 := mload(add($self, 32)) mstore(v0, $v) - mstore(add($self, 32), add(v0, 32)) + let v1 := $checked_add_u256(v0, 32) + mstore(add($self, 32), v1) leave } function $solencoder_h1b9228b90dad6928_new() -> ret { @@ -1127,20 +1271,22 @@ object "CoolCoin" { mstore(v0, $owner) mstore(add(v0, 32), $spender) let v1 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(0, v0) - $assert(iszero(lt(v1, $amount))) + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_ge(v1, $amount) + $assert(v2) pop($store) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 + let v3 := mload(0x40) + if iszero(v3) { + v3 := 0x80 } - mstore(0x40, add(v2, 64)) - mstore(v2, $owner) - mstore(add(v2, 32), $spender) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(0, v2, sub(v1, $amount)) + mstore(0x40, add(v3, 64)) + mstore(v3, $owner) + mstore(add(v3, 32), $spender) + let v4 := $checked_sub_u256(v1, $amount) + $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(0, v3, v4) leave } function $stor_ptr__Evm_hef0af3106e109414_AccessControl_3___1911f7c438797961($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__TokenStore_0__1___175215aa56127bde($slot) + let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__AccessControl_3___3633e113b859df5f($slot) ret := v0 leave } @@ -1212,10 +1358,11 @@ object "CoolCoin" { } mstore(64, add(v0, 0)) let v1 := $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key(v0, $key) - mstore(add(v0, v1), $salt) - let v2 := add(v1, 32) - let v3 := keccak256(v0, v2) - ret := v3 + let v2 := $checked_add_u256(v0, v1) + mstore(v2, $salt) + let v3 := $checked_add_u256(v1, 32) + let v4 := keccak256(v0, v3) + ret := v4 leave } function $storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e($key, $salt) -> ret { @@ -1225,10 +1372,11 @@ object "CoolCoin" { } mstore(64, add(v0, 0)) let v1 := $_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2(v0, $key) - mstore(add(v0, v1), $salt) - let v2 := add(v1, 32) - let v3 := keccak256(v0, v2) - ret := v3 + let v2 := $checked_add_u256(v0, v1) + mstore(v2, $salt) + let v3 := $checked_add_u256(v1, 32) + let v4 := keccak256(v0, v3) + ret := v4 leave } function $storagemap_storage_slot_with_salt___u256__Address___c7c570db20cdd393($key, $salt) -> ret { @@ -1238,10 +1386,15 @@ object "CoolCoin" { } mstore(64, add(v0, 0)) let v1 := $_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__u256_Address_h257056268eac7027__802280feae02d9df(v0, $key) - mstore(add(v0, v1), $salt) - let v2 := add(v1, 32) - let v3 := keccak256(v0, v2) - ret := v3 + let v2 := $checked_add_u256(v0, v1) + mstore(v2, $salt) + let v3 := $checked_add_u256(v1, 32) + let v4 := keccak256(v0, v3) + ret := v4 + leave + } + function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__AccessControl_3___3633e113b859df5f($raw) -> ret { + ret := $raw leave } function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__TokenStore_0__1___175215aa56127bde($raw) -> ret { @@ -1253,6 +1406,11 @@ object "CoolCoin" { $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, v0) leave } + function $string_const_n__usize__h78b9b185054e88a2_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_8_SolEncoder_h1b9228b90dad6928__1811d65564ab2650($self, $e) { + let v0 := $self + $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, v0) + leave + } function $symbol_h6dabcb627bde53b9_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) { leave } @@ -1268,22 +1426,25 @@ object "CoolCoin" { $assert(v3) pop($store) let v4 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $from) - $assert(iszero(lt(v4, $amount))) + let v5 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_ge(v4, $amount) + $assert(v5) pop($store) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $from, sub(v4, $amount)) + let v6 := $checked_sub_u256(v4, $amount) + $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $from, v6) pop($store) pop($store) - let v5 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to, add(v5, $amount)) - let v6 := mload(0x40) - if iszero(v6) { - v6 := 0x80 + let v7 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to) + let v8 := $checked_add_u256(v7, $amount) + $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to, v8) + let v9 := mload(0x40) + if iszero(v9) { + v9 := 0x80 } - mstore(0x40, add(v6, 96)) - mstore(v6, $from) - mstore(add(v6, 32), $to) - mstore(add(v6, 64), $amount) - $emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63($log, v6) + mstore(0x40, add(v9, 96)) + mstore(v9, $from) + mstore(add(v9, 32), $to) + mstore(add(v9, 64), $amount) + $emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63($log, v9) leave } function $transfer_h13f5ec5985ebba60_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) -> ret { @@ -1342,10 +1503,35 @@ object "CoolCoin" { $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, $self) leave } + function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_eq_he50383edd273619f_ne($self, $other) -> ret { + let v0 := iszero(eq($self, $other)) + ret := v0 + leave + } function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { ret := $self leave } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_ge($self, $other) -> ret { + let v0 := iszero(lt($self, $other)) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } function $u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key($ptr, $self) -> ret { mstore($ptr, $self) ret := 32 @@ -1359,6 +1545,16 @@ object "CoolCoin" { ret := $self leave } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := sub($self, $other) + ret := v0 + leave + } function $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word($word) -> ret { ret := $word leave diff --git a/crates/codegen/tests/fixtures/erc20_low_level.snap b/crates/codegen/tests/fixtures/erc20_low_level.snap index 90e9dc4fee..7f97caae6f 100644 --- a/crates/codegen/tests/fixtures/erc20_low_level.snap +++ b/crates/codegen/tests/fixtures/erc20_low_level.snap @@ -6,7 +6,8 @@ input_file: tests/fixtures/erc20_low_level.fe object "Erc20Contract" { code { function $address_h257056268eac7027_eq_h14b330e44530c410_eq_stor_arg0_root_stor($self, $other) -> ret { - ret := eq($self, $other) + let v0 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq_stor_arg0_root_stor($self, $other) + ret := v0 leave } function $address_h257056268eac7027_zero() -> ret { @@ -52,6 +53,11 @@ object "Erc20Contract" { ret := $raw leave } + function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq_stor_arg0_root_stor($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave + } $init__StorPtr_Evm___207f35a85ac4062e() } @@ -60,9 +66,11 @@ object "Erc20Contract" { function $_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2($ptr, $self) -> ret { let v0 := mload($self) let v1 := $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key($ptr, v0) - let v2 := mload(add($self, 32)) - let v3 := $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key(add($ptr, v1), v2) - ret := add(v1, v3) + let v2 := $checked_add_u256($ptr, v1) + let v3 := mload(add($self, 32)) + let v4 := $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key(v2, v3) + let v5 := $checked_add_u256(v1, v4) + ret := v5 leave } function $abi_encode_string__Evm_hef0af3106e109414__3af54274b2985741($word, $len, $ops) { @@ -76,7 +84,8 @@ object "Erc20Contract" { return(0, 32) } function $address_h257056268eac7027_eq_h14b330e44530c410_eq_arg1_root_stor($self, $other) -> ret { - ret := eq($self, $other) + let v0 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq_arg1_root_stor($self, $other) + ret := v0 leave } function $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key($ptr, $self) -> ret { @@ -109,6 +118,40 @@ object "Erc20Contract" { ret := v0 leave } + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } + function $checked_sub_u256($a, $b) -> ret { + let v0 := $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0, v1) + let v3 := v2 + if v3 { + revert(0, 0) + } + let v4 := $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + ret := v4 + leave + } function $erc20_______h94f6fe6e679122ca_allowance_stor_arg0_root_stor__0_1__e4c8be10cab939c2($self, $owner, $spender) -> ret { pop($self) let v0 := mload(0x40) @@ -150,41 +193,48 @@ object "Erc20Contract" { } let v4 := $erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2($self, $to) pop($self) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to, add(v4, $amount)) - let v5 := sload($self) - sstore($self, add(v5, $amount)) + let v5 := $checked_add_u256(v4, $amount) + $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to, v5) + let v6 := sload($self) + let v7 := $checked_add_u256(v6, $amount) + sstore($self, v7) leave } function $erc20_______h94f6fe6e679122ca_transfer_from_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414_Evm_hef0af3106e109414__ca7def21e0c734ee($self, $owner, $to, $amount, $ctx, $ops) { let v0 := caller() let v1 := $erc20_______h94f6fe6e679122ca_allowance_stor_arg0_root_stor__0_1__e4c8be10cab939c2($self, $owner, v0) - let v2 := lt(v1, $amount) - if v2 { + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, $amount) + let v3 := v2 + if v3 { revert(0, 0) } $erc20_______h94f6fe6e679122ca_transfer_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2($self, $owner, $to, $amount, $ops) pop($self) - let v3 := mload(0x40) - if iszero(v3) { - v3 := 0x80 + let v4 := mload(0x40) + if iszero(v4) { + v4 := 0x80 } - mstore(0x40, add(v3, 64)) - mstore(v3, $owner) - mstore(add(v3, 32), v0) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(0, v3, sub(v1, $amount)) + mstore(0x40, add(v4, 64)) + mstore(v4, $owner) + mstore(add(v4, 32), v0) + let v5 := $checked_sub_u256(v1, $amount) + $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(0, v4, v5) leave } function $erc20_______h94f6fe6e679122ca_transfer_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2($self, $from, $to, $amount, $ops) { let v0 := $erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2($self, $from) - let v1 := lt(v0, $amount) - if v1 { + let v1 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v0, $amount) + let v2 := v1 + if v2 { revert(0, 0) } - let v2 := $erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2($self, $to) + let v3 := $erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2($self, $to) pop($self) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $from, sub(v0, $amount)) + let v4 := $checked_sub_u256(v0, $amount) + $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $from, v4) pop($self) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to, add(v2, $amount)) + let v5 := $checked_add_u256(v3, $amount) + $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(0, $to, v5) leave } function $mint__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb($to, $amount, $erc20, $ctx, $ops) -> ret { @@ -316,10 +366,11 @@ object "Erc20Contract" { } mstore(64, add(v0, 0)) let v1 := $address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key(v0, $key) - mstore(add(v0, v1), $salt) - let v2 := add(v1, 32) - let v3 := keccak256(v0, v2) - ret := v3 + let v2 := $checked_add_u256(v0, v1) + mstore(v2, $salt) + let v3 := $checked_add_u256(v1, 32) + let v4 := keccak256(v0, v3) + ret := v4 leave } function $storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e($key, $salt) -> ret { @@ -329,10 +380,11 @@ object "Erc20Contract" { } mstore(64, add(v0, 0)) let v1 := $_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2(v0, $key) - mstore(add(v0, v1), $salt) - let v2 := add(v1, 32) - let v3 := keccak256(v0, v2) - ret := v3 + let v2 := $checked_add_u256(v0, v1) + mstore(v2, $salt) + let v3 := $checked_add_u256(v1, 32) + let v4 := keccak256(v0, v3) + ret := v4 leave } function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Erc20_0__1___b48e7ab92637d703($raw) -> ret { @@ -350,6 +402,25 @@ object "Erc20Contract" { ret := 1 leave } + function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq_arg1_root_stor($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } function $u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key($ptr, $self) -> ret { mstore($ptr, $self) ret := 32 @@ -363,6 +434,16 @@ object "Erc20Contract" { ret := $self leave } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := sub($self, $other) + ret := v0 + leave + } $runtime__StorPtr_Evm___207f35a85ac4062e() return(0, 0) } diff --git a/crates/codegen/tests/fixtures/event_logging.snap b/crates/codegen/tests/fixtures/event_logging.snap index f948a3bc62..b333a47837 100644 --- a/crates/codegen/tests/fixtures/event_logging.snap +++ b/crates/codegen/tests/fixtures/event_logging.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 33 expression: output input_file: tests/fixtures/event_logging.fe --- @@ -50,19 +49,21 @@ function $solencoder_h1b9228b90dad6928_new() -> ret { } function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head($self, $bytes) -> ret { let v0 := mload($self) - let v1 := eq(v0, 0) - if v1 { - let v2 := mload(64) - if iszero(v2) { - v2 := 0x80 + let v1 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0, 0) + let v2 := v1 + if v2 { + let v3 := mload(64) + if iszero(v3) { + v3 := 0x80 } - mstore(64, add(v2, $bytes)) - mstore($self, v2) - mstore(add($self, 32), v2) - mstore(add($self, 64), add(v2, $bytes)) + mstore(64, add(v3, $bytes)) + mstore($self, v3) + mstore(add($self, 32), v3) + let v4 := $checked_add_u256(v3, $bytes) + mstore(add($self, 64), v4) } - let v3 := mload($self) - ret := v3 + let v5 := mload($self) + ret := v5 leave } function $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($self, $e) { @@ -72,14 +73,15 @@ function $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb80 function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish($self) -> ret { let v0 := mload($self) let v1 := mload(add($self, 64)) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 + let v2 := $checked_sub_u256(v1, v0) + let v3 := mload(0x40) + if iszero(v3) { + v3 := 0x80 } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), sub(v1, v0)) - ret := v2 + mstore(0x40, add(v3, 64)) + mstore(v3, v0) + mstore(add(v3, 32), v2) + ret := v3 leave } function $address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic($self) -> ret { @@ -90,9 +92,73 @@ function $evm_hef0af3106e109414_log_h22d1a10952034bae_log3($self, $offset, $len, log3($offset, $len, $topic0, $topic1, $topic2) leave } +function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave +} function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($self, $v) { let v0 := mload(add($self, 32)) mstore(v0, $v) - mstore(add($self, 32), add(v0, 32)) + let v1 := $checked_add_u256(v0, 32) + mstore(add($self, 32), v1) + leave +} +function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave +} +function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $checked_sub_u256($a, $b) -> ret { + let v0 := $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave +} +function $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0, v1) + let v3 := v2 + if v3 { + revert(0, 0) + } + let v4 := $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + ret := v4 + leave +} +function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := sub($self, $other) + ret := v0 leave } diff --git a/crates/codegen/tests/fixtures/event_logging_via_log.snap b/crates/codegen/tests/fixtures/event_logging_via_log.snap index ad475867a7..7cff470e37 100644 --- a/crates/codegen/tests/fixtures/event_logging_via_log.snap +++ b/crates/codegen/tests/fixtures/event_logging_via_log.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 33 expression: output input_file: tests/fixtures/event_logging_via_log.fe --- @@ -53,19 +52,21 @@ function $solencoder_h1b9228b90dad6928_new() -> ret { } function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head($self, $bytes) -> ret { let v0 := mload($self) - let v1 := eq(v0, 0) - if v1 { - let v2 := mload(64) - if iszero(v2) { - v2 := 0x80 + let v1 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0, 0) + let v2 := v1 + if v2 { + let v3 := mload(64) + if iszero(v3) { + v3 := 0x80 } - mstore(64, add(v2, $bytes)) - mstore($self, v2) - mstore(add($self, 32), v2) - mstore(add($self, 64), add(v2, $bytes)) + mstore(64, add(v3, $bytes)) + mstore($self, v3) + mstore(add($self, 32), v3) + let v4 := $checked_add_u256(v3, $bytes) + mstore(add($self, 64), v4) } - let v3 := mload($self) - ret := v3 + let v5 := mload($self) + ret := v5 leave } function $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383($self, $e) { @@ -75,14 +76,15 @@ function $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb80 function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish($self) -> ret { let v0 := mload($self) let v1 := mload(add($self, 64)) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 + let v2 := $checked_sub_u256(v1, v0) + let v3 := mload(0x40) + if iszero(v3) { + v3 := 0x80 } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), sub(v1, v0)) - ret := v2 + mstore(0x40, add(v3, 64)) + mstore(v3, v0) + mstore(add(v3, 32), v2) + ret := v3 leave } function $address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic($self) -> ret { @@ -93,9 +95,73 @@ function $evm_hef0af3106e109414_log_h22d1a10952034bae_log3($self, $offset, $len, log3($offset, $len, $topic0, $topic1, $topic2) leave } +function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave +} function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($self, $v) { let v0 := mload(add($self, 32)) mstore(v0, $v) - mstore(add($self, 32), add(v0, 32)) + let v1 := $checked_add_u256(v0, 32) + mstore(add($self, 32), v1) + leave +} +function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave +} +function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $checked_sub_u256($a, $b) -> ret { + let v0 := $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave +} +function $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0, v1) + let v3 := v2 + if v3 { + revert(0, 0) + } + let v4 := $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + ret := v4 + leave +} +function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := sub($self, $other) + ret := v0 leave } diff --git a/crates/codegen/tests/fixtures/for_array.snap b/crates/codegen/tests/fixtures/for_array.snap index 214715c9b3..a6e5989aae 100644 --- a/crates/codegen/tests/fixtures/for_array.snap +++ b/crates/codegen/tests/fixtures/for_array.snap @@ -19,7 +19,8 @@ object "main" { for { } lt(v3, v4) { v3 := add(v3, 1) } { let v5 := $_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_get__u64_25__540b817a073b29f5(v1, v3) let v6 := v5 - v2 := add(v2, v6) + let v7 := $checked_add_u64(v2, v6) + v2 := v7 } ret := v2 leave @@ -33,6 +34,37 @@ object "main" { ret := v0 leave } + function $checked_add_u64($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) -> ret { + let v0 := $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } + function $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave + } + function $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := and(add(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 + leave + } } data "data_for_array_sum_0" hex"000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000b000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000f0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000013000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000150000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000019" } diff --git a/crates/codegen/tests/fixtures/for_array_large.snap b/crates/codegen/tests/fixtures/for_array_large.snap index 44f159165d..2cb3e67635 100644 --- a/crates/codegen/tests/fixtures/for_array_large.snap +++ b/crates/codegen/tests/fixtures/for_array_large.snap @@ -19,7 +19,8 @@ object "main" { for { } lt(v3, v4) { v3 := add(v3, 1) } { let v5 := $_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_get__u64_10__2b47acd750beacf4(v1, v3) let v6 := v5 - v2 := add(v2, v6) + let v7 := $checked_add_u64(v2, v6) + v2 := v7 } ret := v2 leave @@ -33,6 +34,37 @@ object "main" { ret := v0 leave } + function $checked_add_u64($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) -> ret { + let v0 := $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } + function $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave + } + function $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := and(add(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 + leave + } } data "data_for_array_large_sum_0" hex"000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000000a" } diff --git a/crates/codegen/tests/fixtures/for_range.snap b/crates/codegen/tests/fixtures/for_range.snap index 3d051357c9..701c92f63c 100644 --- a/crates/codegen/tests/fixtures/for_range.snap +++ b/crates/codegen/tests/fixtures/for_range.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 33 expression: output input_file: tests/fixtures/for_range.fe --- @@ -20,7 +19,8 @@ function $for_range_sum() -> ret { for { } lt(v4, v5) { v4 := add(v4, 1) } { let v6 := $range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_get(v3, v4) let v7 := v6 - v0 := add(v0, v7) + let v8 := $checked_add_usize(v0, v7) + v0 := v8 } ret := v0 leave @@ -29,20 +29,86 @@ function $range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_len($s let v0 := 0 let v1 := mload(add($self, 32)) let v2 := mload($self) - let v3 := lt(v1, v2) - if v3 { + let v3 := $usize_ha12462c6d36e68b0_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { v0 := 0 } - if iszero(v3) { - let v4 := mload(add($self, 32)) - let v5 := mload($self) - v0 := sub(v4, v5) + if iszero(v4) { + let v5 := mload(add($self, 32)) + let v6 := mload($self) + let v7 := $checked_sub_usize(v5, v6) + v0 := v7 } ret := v0 leave } function $range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_get($self, $i) -> ret { let v0 := mload($self) - ret := add(v0, $i) + let v1 := $checked_add_usize(v0, $i) + ret := v1 + leave +} +function $usize_ha12462c6d36e68b0_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $checked_add_unsigned_impl__usize__a12462c6d36e68b0($a, $b) -> ret { + let v0 := $usize_ha12462c6d36e68b0_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $usize_ha12462c6d36e68b0_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $usize_ha12462c6d36e68b0_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $checked_add_usize($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__usize__a12462c6d36e68b0($a, $b) + ret := v0 + leave +} +function $checked_sub_unsigned_impl__usize__a12462c6d36e68b0($a, $b) -> ret { + let v0 := $usize_ha12462c6d36e68b0_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $usize_ha12462c6d36e68b0_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0, v1) + let v3 := v2 + if v3 { + revert(0, 0) + } + let v4 := $usize_ha12462c6d36e68b0_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + ret := v4 + leave +} +function $checked_sub_usize($a, $b) -> ret { + let v0 := $checked_sub_unsigned_impl__usize__a12462c6d36e68b0($a, $b) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $usize_ha12462c6d36e68b0_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $usize_ha12462c6d36e68b0_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave +} +function $usize_ha12462c6d36e68b0_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := sub($self, $other) + ret := v0 leave } diff --git a/crates/codegen/tests/fixtures/full_contract.snap b/crates/codegen/tests/fixtures/full_contract.snap index decbda7fa7..1bafaff131 100644 --- a/crates/codegen/tests/fixtures/full_contract.snap +++ b/crates/codegen/tests/fixtures/full_contract.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 33 expression: output input_file: tests/fixtures/full_contract.fe --- @@ -22,47 +21,142 @@ object "ShapeDispatcher" { mstore(v0, $value) return(v0, 32) } + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } + function $checked_div_u256($a, $b) -> ret { + $ensure_nonzero_divisor__u256__3271ca15373d4483($b) + let v0 := div($a, $b) + ret := v0 + leave + } + function $checked_mul_u256($a, $b) -> ret { + let v0 := $checked_mul_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_mul_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingmul_h64e6b83610cda761_wrapping_mul($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(v1, 0) + let v3 := v2 + if v3 { + let v4 := $checked_div_u256(v0, $a) + let v5 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v4) + let v6 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v7 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(v5, v6) + let v8 := v7 + if v8 { + revert(0, 0) + } + ret := v0 + leave + } + if iszero(v3) { + ret := v0 + leave + } + } function $dispatch__StorPtr_Evm___207f35a85ac4062e() { let v0 := calldataload(0) let v1 := shr(224, v0) - let v2 := eq(v1, 151146943) - if v2 { - let v3 := calldataload(4) - let v4 := calldataload(36) - let v5 := mload(0x40) - if iszero(v5) { - v5 := 0x80 + let v2 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v1, 151146943) + let v3 := v2 + if v3 { + let v4 := calldataload(4) + let v5 := calldataload(36) + let v6 := mload(0x40) + if iszero(v6) { + v6 := 0x80 } - mstore(0x40, add(v5, 64)) - mstore(v5, v3) - mstore(add(v5, 32), v4) - let v6 := v5 - let v7 := mload(v6) - mstore(v6, add(v7, 1)) - let v8 := mload(add(v6, 32)) - mstore(add(v6, 32), add(v8, 2)) - let v9 := $point_hac92469562809d28_area(v6) - $abi_encode__Evm_hef0af3106e109414__3af54274b2985741(v9, 0) + mstore(0x40, add(v6, 64)) + mstore(v6, v4) + mstore(add(v6, 32), v5) + let v7 := v6 + let v8 := mload(v7) + let v9 := $checked_add_u256(v8, 1) + mstore(v7, v9) + let v10 := mload(add(v7, 32)) + let v11 := $checked_add_u256(v10, 2) + mstore(add(v7, 32), v11) + let v12 := $point_hac92469562809d28_area(v7) + $abi_encode__Evm_hef0af3106e109414__3af54274b2985741(v12, 0) } - let v10 := eq(v1, 2066295049) - if v10 { - let v11 := calldataload(4) - let v12 := v11 - v12 := add(v12, 3) - let v13 := $square_h97afaa872b6ea17e_area(v12) - $abi_encode__Evm_hef0af3106e109414__3af54274b2985741(v13, 0) + let v13 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v1, 2066295049) + let v14 := v13 + if v14 { + let v15 := calldataload(4) + let v16 := v15 + let v17 := $checked_add_u256(v16, 3) + v16 := v17 + let v18 := $square_h97afaa872b6ea17e_area(v16) + $abi_encode__Evm_hef0af3106e109414__3af54274b2985741(v18, 0) } return(0, 0) } + function $ensure_nonzero_divisor__u256__3271ca15373d4483($b) { + let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0, 0) + let v2 := v1 + if v2 { + revert(0, 0) + } + leave + } function $point_hac92469562809d28_area($self) -> ret { let v0 := mload($self) let v1 := mload(add($self, 32)) - ret := mul(v0, v1) + let v2 := $checked_mul_u256(v0, v1) + ret := v2 leave } function $square_h97afaa872b6ea17e_area($self) -> ret { let v0 := $self - ret := mul(v0, v0) + let v1 := $checked_mul_u256(v0, v0) + ret := v1 + leave + } + function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_eq_he50383edd273619f_ne($self, $other) -> ret { + let v0 := iszero(eq($self, $other)) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingmul_h64e6b83610cda761_wrapping_mul($self, $other) -> ret { + let v0 := mul($self, $other) + ret := v0 leave } $dispatch__StorPtr_Evm___207f35a85ac4062e() diff --git a/crates/codegen/tests/fixtures/function_call.snap b/crates/codegen/tests/fixtures/function_call.snap index 0ceb3f4f3d..78de10c178 100644 --- a/crates/codegen/tests/fixtures/function_call.snap +++ b/crates/codegen/tests/fixtures/function_call.snap @@ -1,11 +1,11 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 42 expression: output input_file: tests/fixtures/function_call.fe --- function $add_one($x) -> ret { - ret := add($x, 1) + let v0 := $checked_add_u64($x, 1) + ret := v0 leave } function $call_add_one() -> ret { @@ -13,3 +13,34 @@ function $call_add_one() -> ret { ret := v0 leave } +function $checked_add_u64($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) + ret := v0 + leave +} +function $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) -> ret { + let v0 := $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := and(add(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 + leave +} diff --git a/crates/codegen/tests/fixtures/high_level_contract.snap b/crates/codegen/tests/fixtures/high_level_contract.snap index 0a14758bcd..c43baa265b 100644 --- a/crates/codegen/tests/fixtures/high_level_contract.snap +++ b/crates/codegen/tests/fixtures/high_level_contract.snap @@ -41,6 +41,23 @@ object "EchoContract" { sstore(add($state, 1), $y) leave } + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } function $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { let v0 := mload(0x40) if iszero(v0) { @@ -74,7 +91,7 @@ object "EchoContract" { } function $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { let v0 := mload($self) - let v1 := add(v0, $byte_offset) + let v1 := $checked_add_u256(v0, $byte_offset) let v2 := mload(v1) ret := v2 leave @@ -87,20 +104,23 @@ object "EchoContract" { function $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($self) -> ret { let v0 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len($self) let v1 := mload(add($self, 64)) - let v2 := add(v1, 32) - let v3 := mload(add($self, 64)) - let v4 := lt(v2, v3) - if v4 { + let v2 := $checked_add_u256(v1, 32) + let v3 := v2 + let v4 := mload(add($self, 64)) + let v5 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v3, v4) + let v6 := v5 + if v6 { revert(0, 0) } - let v5 := gt(v2, v0) - if v5 { + let v7 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v3, v0) + let v8 := v7 + if v8 { revert(0, 0) } - let v6 := mload(add($self, 64)) - let v7 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, v6) - mstore(add($self, 64), v2) - ret := v7 + let v9 := mload(add($self, 64)) + let v10 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, v9) + mstore(add($self, 64), v3) + ret := v10 leave } function $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { @@ -132,6 +152,25 @@ object "EchoContract" { ret := v0 leave } + function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave + } $__EchoContract_init() } @@ -180,15 +219,50 @@ object "EchoContract" { } function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len($self) -> ret { let v0 := calldatasize() - ret := sub(v0, $self) + let v1 := $checked_sub_u256(v0, $self) + ret := v1 leave } function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := add($self, $byte_offset) + let v0 := $checked_add_u256($self, $byte_offset) let v1 := calldataload(v0) ret := v1 leave } + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } + function $checked_sub_u256($a, $b) -> ret { + let v0 := $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0, v1) + let v3 := v2 + if v3 { + revert(0, 0) + } + let v4 := $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + ret := v4 + leave + } function $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self, $pos) -> ret { let v0 := mload($self) let v1 := mload(0x40) @@ -254,13 +328,14 @@ object "EchoContract" { function $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := lt(v1, 4) - if v2 { + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, 4) + let v3 := v2 + if v3 { $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) } - let v3 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) - let v4 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v3) - ret := v4 + let v4 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) + let v5 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v4) + ret := v5 leave } function $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35($self) -> ret { @@ -288,21 +363,24 @@ object "EchoContract" { let v0 := mload($self) let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) let v2 := mload(add($self, 32)) - let v3 := add(v2, 32) - let v4 := mload(add($self, 32)) - let v5 := lt(v3, v4) - if v5 { + let v3 := $checked_add_u256(v2, 32) + let v4 := v3 + let v5 := mload(add($self, 32)) + let v6 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v4, v5) + let v7 := v6 + if v7 { revert(0, 0) } - let v6 := gt(v3, v1) - if v6 { + let v8 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v4, v1) + let v9 := v8 + if v9 { revert(0, 0) } - let v7 := mload($self) - let v8 := mload(add($self, 32)) - let v9 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v7, v8) - mstore(add($self, 32), v3) - ret := v9 + let v10 := mload($self) + let v11 := mload(add($self, 32)) + let v12 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v10, v11) + mstore(add($self, 32), v4) + ret := v12 leave } function $soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($input, $base) -> ret { @@ -323,37 +401,41 @@ object "EchoContract" { function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish($self) -> ret { let v0 := mload($self) let v1 := mload(add($self, 64)) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 + let v2 := $checked_sub_u256(v1, v0) + let v3 := mload(0x40) + if iszero(v3) { + v3 := 0x80 } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), sub(v1, v0)) - ret := v2 + mstore(0x40, add(v3, 64)) + mstore(v3, v0) + mstore(add(v3, 32), v2) + ret := v3 leave } function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head($self, $bytes) -> ret { let v0 := mload($self) - let v1 := eq(v0, 0) - if v1 { - let v2 := mload(64) - if iszero(v2) { - v2 := 0x80 + let v1 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0, 0) + let v2 := v1 + if v2 { + let v3 := mload(64) + if iszero(v3) { + v3 := 0x80 } - mstore(64, add(v2, $bytes)) - mstore($self, v2) - mstore(add($self, 32), v2) - mstore(add($self, 64), add(v2, $bytes)) + mstore(64, add(v3, $bytes)) + mstore($self, v3) + mstore(add($self, 32), v3) + let v4 := $checked_add_u256(v3, $bytes) + mstore(add($self, 64), v4) } - let v3 := mload($self) - ret := v3 + let v5 := mload($self) + ret := v5 leave } function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($self, $v) { let v0 := mload(add($self, 32)) mstore(v0, $v) - mstore(add($self, 32), add(v0, 32)) + let v1 := $checked_add_u256(v0, 32) + mstore(add($self, 32), v1) leave } function $solencoder_h1b9228b90dad6928_new() -> ret { @@ -386,10 +468,35 @@ object "EchoContract" { $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, $self) leave } + function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave + } function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { ret := $self leave } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := sub($self, $other) + ret := v0 + leave + } function $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word($word) -> ret { ret := $word leave diff --git a/crates/codegen/tests/fixtures/if_else.snap b/crates/codegen/tests/fixtures/if_else.snap index 0d5525e4cc..95419cee4b 100644 --- a/crates/codegen/tests/fixtures/if_else.snap +++ b/crates/codegen/tests/fixtures/if_else.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 33 expression: output input_file: tests/fixtures/if_else.fe --- @@ -19,6 +18,38 @@ function $if_else($cond) -> ret { leave } function $helper($x) -> ret { - ret := add($x, 1) + let v0 := $checked_add_u64($x, 1) + ret := v0 + leave +} +function $checked_add_u64($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) + ret := v0 + leave +} +function $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) -> ret { + let v0 := $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := and(add(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 leave } diff --git a/crates/codegen/tests/fixtures/init_args_with_child_dep.snap b/crates/codegen/tests/fixtures/init_args_with_child_dep.snap index 5941175cfb..5b64b83fe5 100644 --- a/crates/codegen/tests/fixtures/init_args_with_child_dep.snap +++ b/crates/codegen/tests/fixtures/init_args_with_child_dep.snap @@ -62,41 +62,62 @@ object "Parent" { $u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v1, $e) leave } + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } function $create_stor_arg0_root_stor__Evm_hef0af3106e109414_Child_hdfa2e9d62e9c9ad3__8303e18f50f8d8ed($self, $value, $args) -> ret { let v0 := $__Child_init_code_len() let v1 := $__Child_init_code_offset() let v2 := 64 - let v3 := add(v0, v2) - let v4 := mload(64) - if iszero(v4) { - v4 := 0x80 - } - mstore(64, add(v4, v3)) - codecopy(v4, v1, v0) - let v5 := add(v4, v0) - let v6 := mload(0x40) - if iszero(v6) { - v6 := 0x80 - } - mstore(0x40, add(v6, 96)) - mstore(v6, v5) - mstore(add(v6, 32), v5) - mstore(add(v6, 64), add(v5, v2)) + let v3 := $checked_add_u256(v0, v2) + let v4 := v3 + let v5 := mload(64) + if iszero(v5) { + v5 := 0x80 + } + mstore(64, add(v5, v4)) + codecopy(v5, v1, v0) + let v6 := $checked_add_u256(v5, v0) let v7 := v6 - $_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64($args, v7) - let v8 := $evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create_raw_stor_arg0_root_stor($self, $value, v4, v3) - let v9 := eq(v8, 0) - if v9 { - let v10 := returndatasize() - let v11 := mload(64) - if iszero(v11) { - v11 := 0x80 - } - mstore(64, add(v11, v10)) - returndatacopy(v11, 0, v10) - revert(v11, v10) - } - ret := v8 + let v8 := $checked_add_u256(v7, v2) + let v9 := mload(0x40) + if iszero(v9) { + v9 := 0x80 + } + mstore(0x40, add(v9, 96)) + mstore(v9, v7) + mstore(add(v9, 32), v7) + mstore(add(v9, 64), v8) + let v10 := v9 + $_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64($args, v10) + let v11 := $evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create_raw_stor_arg0_root_stor($self, $value, v5, v4) + let v12 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v11, 0) + let v13 := v12 + if v13 { + let v14 := returndatasize() + let v15 := mload(64) + if iszero(v15) { + v15 := 0x80 + } + mstore(64, add(v15, v14)) + returndatacopy(v15, 0, v14) + revert(v15, v14) + } + ret := v11 leave } function $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { @@ -127,7 +148,7 @@ object "Parent" { } function $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { let v0 := mload($self) - let v1 := add(v0, $byte_offset) + let v1 := $checked_add_u256(v0, $byte_offset) let v2 := mload(v1) ret := v2 leave @@ -140,20 +161,23 @@ object "Parent" { function $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($self) -> ret { let v0 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len($self) let v1 := mload(add($self, 64)) - let v2 := add(v1, 32) - let v3 := mload(add($self, 64)) - let v4 := lt(v2, v3) - if v4 { + let v2 := $checked_add_u256(v1, 32) + let v3 := v2 + let v4 := mload(add($self, 64)) + let v5 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v3, v4) + let v6 := v5 + if v6 { revert(0, 0) } - let v5 := gt(v2, v0) - if v5 { + let v7 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v3, v0) + let v8 := v7 + if v8 { revert(0, 0) } - let v6 := mload(add($self, 64)) - let v7 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, v6) - mstore(add($self, 64), v2) - ret := v7 + let v9 := mload(add($self, 64)) + let v10 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, v9) + mstore(add($self, 64), v3) + ret := v10 leave } function $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { @@ -174,7 +198,8 @@ object "Parent" { function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($self, $v) { let v0 := mload(add($self, 32)) mstore(v0, $v) - mstore(add($self, 32), add(v0, 32)) + let v1 := $checked_add_u256(v0, 32) + mstore(add($self, 32), v1) leave } function $u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6($d) -> ret { @@ -186,6 +211,30 @@ object "Parent" { $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, $self) leave } + function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave + } $__Parent_init() } @@ -201,15 +250,50 @@ object "Parent" { } function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len($self) -> ret { let v0 := calldatasize() - ret := sub(v0, $self) + let v1 := $checked_sub_u256(v0, $self) + ret := v1 leave } function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := add($self, $byte_offset) + let v0 := $checked_add_u256($self, $byte_offset) let v1 := calldataload(v0) ret := v1 leave } + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } + function $checked_sub_u256($a, $b) -> ret { + let v0 := $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0, v1) + let v3 := v2 + if v3 { + revert(0, 0) + } + let v4 := $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + ret := v4 + leave + } function $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self, $pos) -> ret { let v0 := mload($self) let v1 := mload(0x40) @@ -249,13 +333,14 @@ object "Parent" { function $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := lt(v1, 4) - if v2 { + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, 4) + let v3 := v2 + if v3 { $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) } - let v3 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) - let v4 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v3) - ret := v4 + let v4 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) + let v5 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v4) + ret := v5 leave } function $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35($self) -> ret { @@ -293,6 +378,26 @@ object "Parent" { ret := $self leave } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := sub($self, $other) + ret := v0 + leave + } function $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word($word) -> ret { ret := $word leave @@ -336,6 +441,23 @@ object "Parent" { function $__Child_init_contract($x, $y) { leave } + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } function $cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { let v0 := mload(0x40) if iszero(v0) { @@ -359,7 +481,7 @@ object "Parent" { } function $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { let v0 := mload($self) - let v1 := add(v0, $byte_offset) + let v1 := $checked_add_u256(v0, $byte_offset) let v2 := mload(v1) ret := v2 leave @@ -372,20 +494,23 @@ object "Parent" { function $soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($self) -> ret { let v0 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len($self) let v1 := mload(add($self, 64)) - let v2 := add(v1, 32) - let v3 := mload(add($self, 64)) - let v4 := lt(v2, v3) - if v4 { + let v2 := $checked_add_u256(v1, 32) + let v3 := v2 + let v4 := mload(add($self, 64)) + let v5 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v3, v4) + let v6 := v5 + if v6 { revert(0, 0) } - let v5 := gt(v2, v0) - if v5 { + let v7 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v3, v0) + let v8 := v7 + if v8 { revert(0, 0) } - let v6 := mload(add($self, 64)) - let v7 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, v6) - mstore(add($self, 64), v2) - ret := v7 + let v9 := mload(add($self, 64)) + let v10 := $memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at($self, v9) + mstore(add($self, 64), v3) + ret := v10 leave } function $soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b($input) -> ret { @@ -408,6 +533,25 @@ object "Parent" { ret := v0 leave } + function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave + } $__Child_init() } @@ -423,15 +567,50 @@ object "Parent" { } function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len($self) -> ret { let v0 := calldatasize() - ret := sub(v0, $self) + let v1 := $checked_sub_u256(v0, $self) + ret := v1 leave } function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := add($self, $byte_offset) + let v0 := $checked_add_u256($self, $byte_offset) let v1 := calldataload(v0) ret := v1 leave } + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } + function $checked_sub_u256($a, $b) -> ret { + let v0 := $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0, v1) + let v3 := v2 + if v3 { + revert(0, 0) + } + let v4 := $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + ret := v4 + leave + } function $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self, $pos) -> ret { let v0 := mload($self) let v1 := mload(0x40) @@ -471,13 +650,14 @@ object "Parent" { function $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := lt(v1, 4) - if v2 { + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, 4) + let v3 := v2 + if v3 { $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) } - let v3 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) - let v4 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v3) - ret := v4 + let v4 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) + let v5 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v4) + ret := v5 leave } function $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35($self) -> ret { @@ -515,6 +695,26 @@ object "Parent" { ret := $self leave } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := sub($self, $other) + ret := v0 + leave + } function $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word($word) -> ret { ret := $word leave diff --git a/crates/codegen/tests/fixtures/literal_add.snap b/crates/codegen/tests/fixtures/literal_add.snap index e749ba1abb..b3196fcb49 100644 --- a/crates/codegen/tests/fixtures/literal_add.snap +++ b/crates/codegen/tests/fixtures/literal_add.snap @@ -9,6 +9,38 @@ function $main() -> ret { leave } function $add($a, $b) -> ret { - ret := add($a, $b) + let v0 := $checked_add_u64($a, $b) + ret := v0 + leave +} +function $checked_add_u64($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) + ret := v0 + leave +} +function $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) -> ret { + let v0 := $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := and(add(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 leave } diff --git a/crates/codegen/tests/fixtures/literal_sub.snap b/crates/codegen/tests/fixtures/literal_sub.snap index 8fb0d7f1a8..9f11517a23 100644 --- a/crates/codegen/tests/fixtures/literal_sub.snap +++ b/crates/codegen/tests/fixtures/literal_sub.snap @@ -4,6 +4,38 @@ expression: output input_file: tests/fixtures/literal_sub.fe --- function $literal_sub() -> ret { - ret := sub(1, 2) + let v0 := $checked_sub_u64(1, 2) + ret := v0 + leave +} +function $checked_sub_u64($a, $b) -> ret { + let v0 := $checked_sub_unsigned_impl__u64__aee7f05a097ffa16($a, $b) + ret := v0 + leave +} +function $checked_sub_unsigned_impl__u64__aee7f05a097ffa16($a, $b) -> ret { + let v0 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0, v1) + let v3 := v2 + if v3 { + revert(0, 0) + } + let v4 := $u64_haee7f05a097ffa16_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + ret := v4 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u64_haee7f05a097ffa16_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := and(sub(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 leave } diff --git a/crates/codegen/tests/fixtures/local_bindings.snap b/crates/codegen/tests/fixtures/local_bindings.snap index 1e79743024..17f6061931 100644 --- a/crates/codegen/tests/fixtures/local_bindings.snap +++ b/crates/codegen/tests/fixtures/local_bindings.snap @@ -4,8 +4,40 @@ expression: output input_file: tests/fixtures/local_bindings.fe --- function $local_bindings() -> ret { - let v0 := add(1, 2) - let v1 := 3 - ret := v1 + let v0 := $checked_add_u64(1, 2) + let v1 := v0 + let v2 := 3 + ret := v2 + leave +} +function $checked_add_u64($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) + ret := v0 + leave +} +function $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) -> ret { + let v0 := $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := and(add(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 leave } diff --git a/crates/codegen/tests/fixtures/match_mixed_return.snap b/crates/codegen/tests/fixtures/match_mixed_return.snap index cb7949a764..972c077f9a 100644 --- a/crates/codegen/tests/fixtures/match_mixed_return.snap +++ b/crates/codegen/tests/fixtures/match_mixed_return.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 42 expression: output input_file: tests/fixtures/match_mixed_return.fe --- @@ -18,6 +17,38 @@ function $f($e) -> ret { default { } let v2 := v0 - ret := add(v2, 1) + let v3 := $checked_add_u256(v2, 1) + ret := v3 + leave +} +function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave +} +function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 leave } diff --git a/crates/codegen/tests/fixtures/match_struct.snap b/crates/codegen/tests/fixtures/match_struct.snap index 90d119ad21..9d9bd6957c 100644 --- a/crates/codegen/tests/fixtures/match_struct.snap +++ b/crates/codegen/tests/fixtures/match_struct.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 33 expression: output input_file: tests/fixtures/match_struct.fe --- @@ -30,7 +29,8 @@ function $match_struct_fields($p) -> ret { default { let v7 := and(mload(add(v1, 32)), 0xff) let v8 := and(mload(v1), 0xff) - v0 := add(v8, v7) + let v9 := $checked_add_u8(v8, v7) + v0 := v9 } } ret := v0 @@ -57,3 +57,34 @@ function $match_struct_wildcard($p) -> ret { ret := v0 leave } +function $checked_add_u8($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u8__bc9d6eeaea22ffb5($a, $b) + ret := v0 + leave +} +function $checked_add_unsigned_impl__u8__bc9d6eeaea22ffb5($a, $b) -> ret { + let v0 := $u8_hbc9d6eeaea22ffb5_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u8_hbc9d6eeaea22ffb5_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u8_hbc9d6eeaea22ffb5_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u8_hbc9d6eeaea22ffb5_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u8_hbc9d6eeaea22ffb5_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := and(add(and($self, 0xff), and($other, 0xff)), 0xff) + ret := v0 + leave +} diff --git a/crates/codegen/tests/fixtures/match_tuple_binding.snap b/crates/codegen/tests/fixtures/match_tuple_binding.snap index b3cafac12d..a723cd6f04 100644 --- a/crates/codegen/tests/fixtures/match_tuple_binding.snap +++ b/crates/codegen/tests/fixtures/match_tuple_binding.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 33 expression: output input_file: tests/fixtures/match_tuple_binding.fe --- @@ -26,10 +25,11 @@ function $match_tuple_extract($t) -> ret { let v8 := v7 let v9 := and(mload(add($t, 32)), 0xff) let v10 := v9 - v0 := add(v8, v10) + let v11 := $checked_add_u8(v8, v10) + v0 := v11 } } - let v11 := $t + let v12 := $t ret := v0 leave } @@ -53,36 +53,71 @@ function $match_nested_extract($t) -> ret { let v7 := v6 let v8 := and(mload($t), 0xff) let v9 := v8 - v0 := add(v9, v7) + let v10 := $checked_add_u8(v9, v7) + v0 := v10 } default { - let v10 := and(mload($t), 0xff) - let v11 := v10 - let v12 := and(mload(add($t, 64)), 0xff) - let v13 := v12 - v0 := add(v11, v13) + let v11 := and(mload($t), 0xff) + let v12 := v11 + let v13 := and(mload(add($t, 64)), 0xff) + let v14 := v13 + let v15 := $checked_add_u8(v12, v14) + v0 := v15 } } } default { - let v14 := and(mload(add($t, 64)), 0xff) - switch v14 + let v16 := and(mload(add($t, 64)), 0xff) + switch v16 case 0 { - let v15 := and(mload(add($t, 32)), 0xff) - let v16 := v15 - let v17 := and(mload($t), 0xff) + let v17 := and(mload(add($t, 32)), 0xff) let v18 := v17 - v0 := add(v18, v16) - } - default { let v19 := and(mload($t), 0xff) let v20 := v19 - let v21 := and(mload(add($t, 64)), 0xff) - let v22 := v21 - v0 := add(v20, v22) + let v21 := $checked_add_u8(v20, v18) + v0 := v21 + } + default { + let v22 := and(mload($t), 0xff) + let v23 := v22 + let v24 := and(mload(add($t, 64)), 0xff) + let v25 := v24 + let v26 := $checked_add_u8(v23, v25) + v0 := v26 } } - let v23 := $t + let v27 := $t + ret := v0 + leave +} +function $checked_add_u8($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u8__bc9d6eeaea22ffb5($a, $b) + ret := v0 + leave +} +function $checked_add_unsigned_impl__u8__bc9d6eeaea22ffb5($a, $b) -> ret { + let v0 := $u8_hbc9d6eeaea22ffb5_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u8_hbc9d6eeaea22ffb5_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u8_hbc9d6eeaea22ffb5_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u8_hbc9d6eeaea22ffb5_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u8_hbc9d6eeaea22ffb5_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := and(add(and($self, 0xff), and($other, 0xff)), 0xff) ret := v0 leave } diff --git a/crates/codegen/tests/fixtures/math_ops.snap b/crates/codegen/tests/fixtures/math_ops.snap index 93a3e312c3..d2ac6f1656 100644 --- a/crates/codegen/tests/fixtures/math_ops.snap +++ b/crates/codegen/tests/fixtures/math_ops.snap @@ -4,6 +4,104 @@ expression: output input_file: tests/fixtures/math_ops.fe --- function $math_ops() -> ret { - ret := mod(div(mul(sub(10, 3), 2), 7), 3) + let v0 := $checked_sub_u64(10, 3) + let v1 := $checked_mul_u64(v0, 2) + let v2 := $checked_div_u64(v1, 7) + let v3 := $checked_rem_u64(v2, 3) + ret := v3 + leave +} +function $checked_div_u64($a, $b) -> ret { + $ensure_nonzero_divisor__u64__aee7f05a097ffa16($b) + let v0 := and(div(and($a, 0xffffffffffffffff), and($b, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 + leave +} +function $checked_mul_u64($a, $b) -> ret { + let v0 := $checked_mul_unsigned_impl__u64__aee7f05a097ffa16($a, $b) + ret := v0 + leave +} +function $checked_mul_unsigned_impl__u64__aee7f05a097ffa16($a, $b) -> ret { + let v0 := $u64_haee7f05a097ffa16_wrappingmul_h64e6b83610cda761_wrapping_mul($a, $b) + let v1 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(v1, 0) + let v3 := v2 + if v3 { + let v4 := $checked_div_u64(v0, $a) + let v5 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word(v4) + let v6 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($b) + let v7 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(v5, v6) + let v8 := v7 + if v8 { + revert(0, 0) + } + ret := v0 + leave + } + if iszero(v3) { + ret := v0 + leave + } +} +function $checked_rem_u64($a, $b) -> ret { + $ensure_nonzero_divisor__u64__aee7f05a097ffa16($b) + let v0 := and(mod(and($a, 0xffffffffffffffff), and($b, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 + leave +} +function $checked_sub_u64($a, $b) -> ret { + let v0 := $checked_sub_unsigned_impl__u64__aee7f05a097ffa16($a, $b) + ret := v0 + leave +} +function $checked_sub_unsigned_impl__u64__aee7f05a097ffa16($a, $b) -> ret { + let v0 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0, v1) + let v3 := v2 + if v3 { + revert(0, 0) + } + let v4 := $u64_haee7f05a097ffa16_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + ret := v4 + leave +} +function $ensure_nonzero_divisor__u64__aee7f05a097ffa16($b) { + let v0 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0, 0) + let v2 := v1 + if v2 { + revert(0, 0) + } + leave +} +function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_eq_he50383edd273619f_ne($self, $other) -> ret { + let v0 := iszero(eq($self, $other)) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u64_haee7f05a097ffa16_wrappingmul_h64e6b83610cda761_wrapping_mul($self, $other) -> ret { + let v0 := and(mul(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := and(sub(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 leave } diff --git a/crates/codegen/tests/fixtures/momo.snap b/crates/codegen/tests/fixtures/momo.snap index 7c6696683b..fdf79cd0cf 100644 --- a/crates/codegen/tests/fixtures/momo.snap +++ b/crates/codegen/tests/fixtures/momo.snap @@ -1,12 +1,43 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 33 expression: output input_file: tests/fixtures/momo.fe --- function $read_x($val) -> ret { let v0 := and(mload($val), 0xff) let v1 := and(mload(add($val, 32)), 0xff) - ret := add(v0, v1) + let v2 := $checked_add_u8(v0, v1) + ret := v2 + leave +} +function $checked_add_u8($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u8__bc9d6eeaea22ffb5($a, $b) + ret := v0 + leave +} +function $checked_add_unsigned_impl__u8__bc9d6eeaea22ffb5($a, $b) -> ret { + let v0 := $u8_hbc9d6eeaea22ffb5_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u8_hbc9d6eeaea22ffb5_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u8_hbc9d6eeaea22ffb5_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u8_hbc9d6eeaea22ffb5_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u8_hbc9d6eeaea22ffb5_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := and(add(and($self, 0xff), and($other, 0xff)), 0xff) + ret := v0 leave } diff --git a/crates/codegen/tests/fixtures/name_collisions.snap b/crates/codegen/tests/fixtures/name_collisions.snap index 9c64b86b64..8d7b9c78bf 100644 --- a/crates/codegen/tests/fixtures/name_collisions.snap +++ b/crates/codegen/tests/fixtures/name_collisions.snap @@ -14,7 +14,8 @@ function $a_b_h948d5ab23860c017_flattened_fn() -> ret { function $test_module_qualifier_flatten_collision() -> ret { let v0 := $a_b_h12fd23afeb13a092_flattened_fn() let v1 := $a_b_h948d5ab23860c017_flattened_fn() - ret := add(v0, v1) + let v2 := $checked_add_u32(v0, v1) + ret := v2 leave } function $test_generic_type_collision() -> ret { @@ -40,13 +41,16 @@ function $test_trait_method_collision() -> ret { let v1 := $multitraitimpl_h60cc862fc809464_trait_h79853acec5b2b3ad_same_method(v0) let v2 := 100 let v3 := $multitraitimpl_h60cc862fc809464_trait_ha6da5e54b37dd39c_same_method(v2) - ret := add(v1, v3) + let v4 := $checked_add_u32(v1, v3) + ret := v4 leave } function $param_local_collision($v0) -> ret { - let v0 := add($v0, 1) - let v1 := add(v0, 2) - ret := v1 + let v0 := $checked_add_u32($v0, 1) + let v1 := v0 + let v2 := $checked_add_u32(v1, 2) + let v3 := v2 + ret := v3 leave } function $test_param_local_collision() -> ret { @@ -65,7 +69,8 @@ function $test_cast_shim_collision() -> ret { leave } function $ret_param_collision($ret) -> ret { - ret := add($ret, 1) + let v0 := $checked_add_u32($ret, 1) + ret := v0 leave } function $test_ret_param_collision() -> ret { @@ -104,22 +109,26 @@ function $main() -> ret { } function $widget_h8588afca9d68e578_process($self) -> ret { let v0 := $self - ret := mul(v0, 2) + let v1 := $checked_mul_u32(v0, 2) + ret := v1 leave } function $widget_h6847c0e3e0e4aa1e_process($self) -> ret { let v0 := $self - ret := mul(v0, 3) + let v1 := $checked_mul_u64(v0, 3) + ret := v1 leave } function $multitraitimpl_h60cc862fc809464_trait_h79853acec5b2b3ad_same_method($self) -> ret { let v0 := $self - ret := add(v0, 1) + let v1 := $checked_add_u32(v0, 1) + ret := v1 leave } function $multitraitimpl_h60cc862fc809464_trait_ha6da5e54b37dd39c_same_method($self) -> ret { let v0 := $self - ret := add(v0, 2) + let v1 := $checked_add_u32(v0, 2) + ret := v1 leave } function $generic_fn__S_h730d9dc564aaaf27__8d32801e7ec9d42b($val) -> ret { @@ -130,3 +139,142 @@ function $generic_fn__S_h2db58d011b97b333__42a13489a1ec39e8($val) -> ret { ret := $val leave } +function $checked_add_u32($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u32__20aa0c10687491ad($a, $b) + ret := v0 + leave +} +function $checked_add_unsigned_impl__u32__20aa0c10687491ad($a, $b) -> ret { + let v0 := $u32_h20aa0c10687491ad_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $checked_div_u32($a, $b) -> ret { + $ensure_nonzero_divisor__u32__20aa0c10687491ad($b) + let v0 := and(div(and($a, 0xffffffff), and($b, 0xffffffff)), 0xffffffff) + ret := v0 + leave +} +function $checked_div_u64($a, $b) -> ret { + $ensure_nonzero_divisor__u64__aee7f05a097ffa16($b) + let v0 := and(div(and($a, 0xffffffffffffffff), and($b, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 + leave +} +function $checked_mul_u32($a, $b) -> ret { + let v0 := $checked_mul_unsigned_impl__u32__20aa0c10687491ad($a, $b) + ret := v0 + leave +} +function $checked_mul_u64($a, $b) -> ret { + let v0 := $checked_mul_unsigned_impl__u64__aee7f05a097ffa16($a, $b) + ret := v0 + leave +} +function $checked_mul_unsigned_impl__u32__20aa0c10687491ad($a, $b) -> ret { + let v0 := $u32_h20aa0c10687491ad_wrappingmul_h64e6b83610cda761_wrapping_mul($a, $b) + let v1 := $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(v1, 0) + let v3 := v2 + if v3 { + let v4 := $checked_div_u32(v0, $a) + let v5 := $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_to_word(v4) + let v6 := $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_to_word($b) + let v7 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(v5, v6) + let v8 := v7 + if v8 { + revert(0, 0) + } + ret := v0 + leave + } + if iszero(v3) { + ret := v0 + leave + } +} +function $checked_mul_unsigned_impl__u64__aee7f05a097ffa16($a, $b) -> ret { + let v0 := $u64_haee7f05a097ffa16_wrappingmul_h64e6b83610cda761_wrapping_mul($a, $b) + let v1 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(v1, 0) + let v3 := v2 + if v3 { + let v4 := $checked_div_u64(v0, $a) + let v5 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word(v4) + let v6 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($b) + let v7 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(v5, v6) + let v8 := v7 + if v8 { + revert(0, 0) + } + ret := v0 + leave + } + if iszero(v3) { + ret := v0 + leave + } +} +function $ensure_nonzero_divisor__u32__20aa0c10687491ad($b) { + let v0 := $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0, 0) + let v2 := v1 + if v2 { + revert(0, 0) + } + leave +} +function $ensure_nonzero_divisor__u64__aee7f05a097ffa16($b) { + let v0 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0, 0) + let v2 := v1 + if v2 { + revert(0, 0) + } + leave +} +function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_eq_he50383edd273619f_ne($self, $other) -> ret { + let v0 := iszero(eq($self, $other)) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u32_h20aa0c10687491ad_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := and(add(and($self, 0xffffffff), and($other, 0xffffffff)), 0xffffffff) + ret := v0 + leave +} +function $u32_h20aa0c10687491ad_wrappingmul_h64e6b83610cda761_wrapping_mul($self, $other) -> ret { + let v0 := and(mul(and($self, 0xffffffff), and($other, 0xffffffff)), 0xffffffff) + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u64_haee7f05a097ffa16_wrappingmul_h64e6b83610cda761_wrapping_mul($self, $other) -> ret { + let v0 := and(mul(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 + leave +} diff --git a/crates/codegen/tests/fixtures/nested_struct.snap b/crates/codegen/tests/fixtures/nested_struct.snap index 90a28c1da0..288b3a868f 100644 --- a/crates/codegen/tests/fixtures/nested_struct.snap +++ b/crates/codegen/tests/fixtures/nested_struct.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 33 expression: output input_file: tests/fixtures/nested_struct.fe --- diff --git a/crates/codegen/tests/fixtures/newtype_field_mut_method_call.snap b/crates/codegen/tests/fixtures/newtype_field_mut_method_call.snap index b4a0999eb0..f3c7b3030e 100644 --- a/crates/codegen/tests/fixtures/newtype_field_mut_method_call.snap +++ b/crates/codegen/tests/fixtures/newtype_field_mut_method_call.snap @@ -29,12 +29,45 @@ function $newtype_field_mut_method_call($x) -> ret { function $counter_h872958864d1ad471_bump($self) { let v0 := $self let v1 := mload(v0) - mstore(v0, add(v1, 1)) + let v2 := $checked_add_u256(v1, 1) + mstore(v0, v2) leave } function $wrapcounter_hbcbd3a74a267488b_bump($self) { let v0 := $self let v1 := mload(v0) - mstore(v0, add(v1, 1)) + let v2 := $checked_add_u256(v1, 1) + mstore(v0, v2) + leave +} +function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave +} +function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 leave } diff --git a/crates/codegen/tests/fixtures/newtype_storage_byplace_effect_arg.snap b/crates/codegen/tests/fixtures/newtype_storage_byplace_effect_arg.snap index 617536eabe..45d28e767e 100644 --- a/crates/codegen/tests/fixtures/newtype_storage_byplace_effect_arg.snap +++ b/crates/codegen/tests/fixtures/newtype_storage_byplace_effect_arg.snap @@ -95,7 +95,7 @@ object "NewtypeByPlaceEffectArg" { leave } function $stor_ptr__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($slot) + let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Wrap_haf9e70905fcbd513__945a70bbbf171dbd($slot) ret := v0 leave } @@ -104,6 +104,10 @@ object "NewtypeByPlaceEffectArg" { ret := v0 leave } + function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Wrap_haf9e70905fcbd513__945a70bbbf171dbd($raw) -> ret { + ret := $raw + leave + } function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($raw) -> ret { ret := $raw leave @@ -116,9 +120,10 @@ object "NewtypeByPlaceEffectArg" { function $__NewtypeByPlaceEffectArg_recv_0_0($args, $w, $x) -> ret { $bump__StorPtr_Wrap___5036bb3e02939b91($w) let v0 := sload($x) - sstore($x, add(v0, 1)) - let v1 := sload($x) - ret := v1 + let v1 := $checked_add_u256(v0, 1) + sstore($x, v1) + let v2 := sload($x) + ret := v2 leave } function $__NewtypeByPlaceEffectArg_runtime() { @@ -138,7 +143,8 @@ object "NewtypeByPlaceEffectArg" { } function $bump__StorPtr_Wrap___5036bb3e02939b91($w) { let v0 := sload($w) - sstore($w, add(v0, 1)) + let v1 := $checked_add_u256(v0, 1) + sstore($w, v1) leave } function $bump_hfb5a53c6af92b8a6_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966($d) { @@ -146,15 +152,50 @@ object "NewtypeByPlaceEffectArg" { } function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len($self) -> ret { let v0 := calldatasize() - ret := sub(v0, $self) + let v1 := $checked_sub_u256(v0, $self) + ret := v1 leave } function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := add($self, $byte_offset) + let v0 := $checked_add_u256($self, $byte_offset) let v1 := calldataload(v0) ret := v1 leave } + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } + function $checked_sub_u256($a, $b) -> ret { + let v0 := $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0, v1) + let v3 := v2 + if v3 { + revert(0, 0) + } + let v4 := $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + ret := v4 + leave + } function $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self, $pos) -> ret { let v0 := mload($self) let v1 := mload(0x40) @@ -217,13 +258,14 @@ object "NewtypeByPlaceEffectArg" { function $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := lt(v1, 4) - if v2 { + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, 4) + let v3 := v2 + if v3 { $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) } - let v3 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) - let v4 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v3) - ret := v4 + let v4 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) + let v5 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v4) + ret := v5 leave } function $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35($self) -> ret { @@ -265,37 +307,41 @@ object "NewtypeByPlaceEffectArg" { function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish($self) -> ret { let v0 := mload($self) let v1 := mload(add($self, 64)) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 + let v2 := $checked_sub_u256(v1, v0) + let v3 := mload(0x40) + if iszero(v3) { + v3 := 0x80 } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), sub(v1, v0)) - ret := v2 + mstore(0x40, add(v3, 64)) + mstore(v3, v0) + mstore(add(v3, 32), v2) + ret := v3 leave } function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head($self, $bytes) -> ret { let v0 := mload($self) - let v1 := eq(v0, 0) - if v1 { - let v2 := mload(64) - if iszero(v2) { - v2 := 0x80 + let v1 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0, 0) + let v2 := v1 + if v2 { + let v3 := mload(64) + if iszero(v3) { + v3 := 0x80 } - mstore(64, add(v2, $bytes)) - mstore($self, v2) - mstore(add($self, 32), v2) - mstore(add($self, 64), add(v2, $bytes)) + mstore(64, add(v3, $bytes)) + mstore($self, v3) + mstore(add($self, 32), v3) + let v4 := $checked_add_u256(v3, $bytes) + mstore(add($self, 64), v4) } - let v3 := mload($self) - ret := v3 + let v5 := mload($self) + ret := v5 leave } function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($self, $v) { let v0 := mload(add($self, 32)) mstore(v0, $v) - mstore(add($self, 32), add(v0, 32)) + let v1 := $checked_add_u256(v0, 32) + mstore(add($self, 32), v1) leave } function $solencoder_h1b9228b90dad6928_new() -> ret { @@ -311,7 +357,7 @@ object "NewtypeByPlaceEffectArg" { leave } function $stor_ptr__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($slot) + let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Wrap_haf9e70905fcbd513__945a70bbbf171dbd($slot) ret := v0 leave } @@ -320,6 +366,10 @@ object "NewtypeByPlaceEffectArg" { ret := v0 leave } + function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Wrap_haf9e70905fcbd513__945a70bbbf171dbd($raw) -> ret { + ret := $raw + leave + } function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($raw) -> ret { ret := $raw leave @@ -328,10 +378,35 @@ object "NewtypeByPlaceEffectArg" { $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, $self) leave } + function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave + } function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { ret := $self leave } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := sub($self, $other) + ret := v0 + leave + } function $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word($word) -> ret { ret := $word leave diff --git a/crates/codegen/tests/fixtures/newtype_storage_field_mut_method_call.snap b/crates/codegen/tests/fixtures/newtype_storage_field_mut_method_call.snap index c664bf37e6..ab992bb6aa 100644 --- a/crates/codegen/tests/fixtures/newtype_storage_field_mut_method_call.snap +++ b/crates/codegen/tests/fixtures/newtype_storage_field_mut_method_call.snap @@ -95,7 +95,7 @@ object "NewtypeStorageFieldMutMethodCall" { leave } function $stor_ptr__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($slot) + let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Wrap_haf9e70905fcbd513__945a70bbbf171dbd($slot) ret := v0 leave } @@ -104,6 +104,10 @@ object "NewtypeStorageFieldMutMethodCall" { ret := v0 leave } + function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Wrap_haf9e70905fcbd513__945a70bbbf171dbd($raw) -> ret { + ret := $raw + leave + } function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($raw) -> ret { ret := $raw leave @@ -140,15 +144,50 @@ object "NewtypeStorageFieldMutMethodCall" { } function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len($self) -> ret { let v0 := calldatasize() - ret := sub(v0, $self) + let v1 := $checked_sub_u256(v0, $self) + ret := v1 leave } function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := add($self, $byte_offset) + let v0 := $checked_add_u256($self, $byte_offset) let v1 := calldataload(v0) ret := v1 leave } + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } + function $checked_sub_u256($a, $b) -> ret { + let v0 := $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0, v1) + let v3 := v2 + if v3 { + revert(0, 0) + } + let v4 := $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + ret := v4 + leave + } function $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self, $pos) -> ret { let v0 := mload($self) let v1 := mload(0x40) @@ -211,13 +250,14 @@ object "NewtypeStorageFieldMutMethodCall" { function $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := lt(v1, 4) - if v2 { + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, 4) + let v3 := v2 + if v3 { $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) } - let v3 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) - let v4 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v3) - ret := v4 + let v4 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) + let v5 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v4) + ret := v5 leave } function $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35($self) -> ret { @@ -259,37 +299,41 @@ object "NewtypeStorageFieldMutMethodCall" { function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish($self) -> ret { let v0 := mload($self) let v1 := mload(add($self, 64)) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 + let v2 := $checked_sub_u256(v1, v0) + let v3 := mload(0x40) + if iszero(v3) { + v3 := 0x80 } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), sub(v1, v0)) - ret := v2 + mstore(0x40, add(v3, 64)) + mstore(v3, v0) + mstore(add(v3, 32), v2) + ret := v3 leave } function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head($self, $bytes) -> ret { let v0 := mload($self) - let v1 := eq(v0, 0) - if v1 { - let v2 := mload(64) - if iszero(v2) { - v2 := 0x80 + let v1 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0, 0) + let v2 := v1 + if v2 { + let v3 := mload(64) + if iszero(v3) { + v3 := 0x80 } - mstore(64, add(v2, $bytes)) - mstore($self, v2) - mstore(add($self, 32), v2) - mstore(add($self, 64), add(v2, $bytes)) + mstore(64, add(v3, $bytes)) + mstore($self, v3) + mstore(add($self, 32), v3) + let v4 := $checked_add_u256(v3, $bytes) + mstore(add($self, 64), v4) } - let v3 := mload($self) - ret := v3 + let v5 := mload($self) + ret := v5 leave } function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($self, $v) { let v0 := mload(add($self, 32)) mstore(v0, $v) - mstore(add($self, 32), add(v0, 32)) + let v1 := $checked_add_u256(v0, 32) + mstore(add($self, 32), v1) leave } function $solencoder_h1b9228b90dad6928_new() -> ret { @@ -305,7 +349,7 @@ object "NewtypeStorageFieldMutMethodCall" { leave } function $stor_ptr__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($slot) + let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Wrap_haf9e70905fcbd513__945a70bbbf171dbd($slot) ret := v0 leave } @@ -314,6 +358,10 @@ object "NewtypeStorageFieldMutMethodCall" { ret := v0 leave } + function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Wrap_haf9e70905fcbd513__945a70bbbf171dbd($raw) -> ret { + ret := $raw + leave + } function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483($raw) -> ret { ret := $raw leave @@ -322,10 +370,35 @@ object "NewtypeStorageFieldMutMethodCall" { $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($e, $self) leave } + function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave + } function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { ret := $self leave } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := sub($self, $other) + ret := v0 + leave + } function $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word($word) -> ret { ret := $word leave @@ -333,7 +406,8 @@ object "NewtypeStorageFieldMutMethodCall" { function $wrap_haf9e70905fcbd513_bump_stor_arg0_root_stor($self) { let v0 := $self let v1 := sload($self) - sstore($self, add(v1, 1)) + let v2 := $checked_add_u256(v1, 1) + sstore($self, v2) leave } $__NewtypeStorageFieldMutMethodCall_runtime() diff --git a/crates/codegen/tests/fixtures/newtype_word_mut_method_call.snap b/crates/codegen/tests/fixtures/newtype_word_mut_method_call.snap index 475147aa46..d6e6d9bde8 100644 --- a/crates/codegen/tests/fixtures/newtype_word_mut_method_call.snap +++ b/crates/codegen/tests/fixtures/newtype_word_mut_method_call.snap @@ -10,7 +10,39 @@ function $newtype_word_mut_method_call($x) -> ret { leave } function $wrap_haf9e70905fcbd513_bump($self) -> ret { - $self := add($self, 1) + let v0 := $checked_add_u256($self, 1) + $self := v0 ret := $self leave } +function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave +} +function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave +} diff --git a/crates/codegen/tests/fixtures/range_bounds.snap b/crates/codegen/tests/fixtures/range_bounds.snap index 49c4a65311..7186de75ad 100644 --- a/crates/codegen/tests/fixtures/range_bounds.snap +++ b/crates/codegen/tests/fixtures/range_bounds.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 33 expression: output input_file: tests/fixtures/range_bounds.fe --- @@ -11,7 +10,8 @@ function $sum_const() -> ret { for { } lt(v1, v2) { v1 := add(v1, 1) } { let v3 := $range_known_const_s__usize___known_const_e__usize___hc7c7abc3858dd85e_seq_ha637d2df505bccf2_get__0_4__f9605efabd18106c(0, v1) let v4 := v3 - v0 := add(v0, v4) + let v5 := $checked_add_usize(v0, v4) + v0 := v5 } ret := v0 leave @@ -29,7 +29,8 @@ function $sum_dynamic_end($end) -> ret { for { } lt(v2, v3) { v2 := add(v2, 1) } { let v4 := $range_known_const_s__usize___known_const_e__usize___hc7c7abc3858dd85e_seq_ha637d2df505bccf2_get__0_4__f9605efabd18106c(v1, v2) let v5 := v4 - v0 := add(v0, v5) + let v6 := $checked_add_usize(v0, v5) + v0 := v6 } ret := v0 leave @@ -47,7 +48,8 @@ function $sum_dynamic_start($start) -> ret { for { } lt(v2, v3) { v2 := add(v2, 1) } { let v4 := $range_unknown__known_const_e__usize___h7984c64777ae465_seq_ha637d2df505bccf2_get__4__f248ae0e02044d7e(v1, v2) let v5 := v4 - v0 := add(v0, v5) + let v6 := $checked_add_usize(v0, v5) + v0 := v6 } ret := v0 leave @@ -64,39 +66,45 @@ function $sum_dynamic($start, $end) -> ret { let v2 := 0 let v3 := $range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_len(v1) for { } lt(v2, v3) { v2 := add(v2, 1) } { - let v4 := $range_unknown__known_const_e__usize___h7984c64777ae465_seq_ha637d2df505bccf2_get__4__f248ae0e02044d7e(v1, v2) + let v4 := $range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_get(v1, v2) let v5 := v4 - v0 := add(v0, v5) + let v6 := $checked_add_usize(v0, v5) + v0 := v6 } ret := v0 leave } function $range_known_const_s__usize___known_const_e__usize___hc7c7abc3858dd85e_seq_ha637d2df505bccf2_len__0_4__f9605efabd18106c($self) -> ret { let v0 := 0 - let v1 := lt(4, 0) - if v1 { + let v1 := $usize_ha12462c6d36e68b0_ord_h264f6d6d75097a_lt(4, 0) + let v2 := v1 + if v2 { v0 := 0 } - if iszero(v1) { - v0 := sub(4, 0) + if iszero(v2) { + let v3 := $checked_sub_usize(4, 0) + v0 := v3 } ret := v0 leave } function $range_known_const_s__usize___known_const_e__usize___hc7c7abc3858dd85e_seq_ha637d2df505bccf2_get__0_4__f9605efabd18106c($self, $i) -> ret { - ret := add(0, $i) + let v0 := $checked_add_usize(0, $i) + ret := v0 leave } function $range_known_const_s__usize___unknown__h4e84f6b6b8307914_seq_ha637d2df505bccf2_len__0__fc6647014fb554e5($self) -> ret { let v0 := 0 let v1 := mload($self) - let v2 := lt(v1, 0) - if v2 { + let v2 := $usize_ha12462c6d36e68b0_ord_h264f6d6d75097a_lt(v1, 0) + let v3 := v2 + if v3 { v0 := 0 } - if iszero(v2) { - let v3 := mload($self) - v0 := sub(v3, 0) + if iszero(v3) { + let v4 := mload($self) + let v5 := $checked_sub_usize(v4, 0) + v0 := v5 } ret := v0 leave @@ -104,35 +112,109 @@ function $range_known_const_s__usize___unknown__h4e84f6b6b8307914_seq_ha637d2df5 function $range_unknown__known_const_e__usize___h7984c64777ae465_seq_ha637d2df505bccf2_len__4__f248ae0e02044d7e($self) -> ret { let v0 := 0 let v1 := mload($self) - let v2 := lt(4, v1) - if v2 { + let v2 := $usize_ha12462c6d36e68b0_ord_h264f6d6d75097a_lt(4, v1) + let v3 := v2 + if v3 { v0 := 0 } - if iszero(v2) { - let v3 := mload($self) - v0 := sub(4, v3) + if iszero(v3) { + let v4 := mload($self) + let v5 := $checked_sub_usize(4, v4) + v0 := v5 } ret := v0 leave } function $range_unknown__known_const_e__usize___h7984c64777ae465_seq_ha637d2df505bccf2_get__4__f248ae0e02044d7e($self, $i) -> ret { let v0 := mload($self) - ret := add(v0, $i) + let v1 := $checked_add_usize(v0, $i) + ret := v1 leave } function $range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_len($self) -> ret { let v0 := 0 let v1 := mload(add($self, 32)) let v2 := mload($self) - let v3 := lt(v1, v2) - if v3 { + let v3 := $usize_ha12462c6d36e68b0_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { v0 := 0 } - if iszero(v3) { - let v4 := mload(add($self, 32)) - let v5 := mload($self) - v0 := sub(v4, v5) + if iszero(v4) { + let v5 := mload(add($self, 32)) + let v6 := mload($self) + let v7 := $checked_sub_usize(v5, v6) + v0 := v7 + } + ret := v0 + leave +} +function $range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_get($self, $i) -> ret { + let v0 := mload($self) + let v1 := $checked_add_usize(v0, $i) + ret := v1 + leave +} +function $usize_ha12462c6d36e68b0_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $checked_add_unsigned_impl__usize__a12462c6d36e68b0($a, $b) -> ret { + let v0 := $usize_ha12462c6d36e68b0_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $usize_ha12462c6d36e68b0_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $usize_ha12462c6d36e68b0_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) } ret := v0 leave } +function $checked_add_usize($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__usize__a12462c6d36e68b0($a, $b) + ret := v0 + leave +} +function $checked_sub_unsigned_impl__usize__a12462c6d36e68b0($a, $b) -> ret { + let v0 := $usize_ha12462c6d36e68b0_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $usize_ha12462c6d36e68b0_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0, v1) + let v3 := v2 + if v3 { + revert(0, 0) + } + let v4 := $usize_ha12462c6d36e68b0_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + ret := v4 + leave +} +function $checked_sub_usize($a, $b) -> ret { + let v0 := $checked_sub_unsigned_impl__usize__a12462c6d36e68b0($a, $b) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $usize_ha12462c6d36e68b0_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $usize_ha12462c6d36e68b0_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave +} +function $usize_ha12462c6d36e68b0_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := sub($self, $other) + ret := v0 + leave +} diff --git a/crates/codegen/tests/fixtures/ret.snap b/crates/codegen/tests/fixtures/ret.snap index 39c946feec..3435748385 100644 --- a/crates/codegen/tests/fixtures/ret.snap +++ b/crates/codegen/tests/fixtures/ret.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 42 expression: output input_file: tests/fixtures/ret.fe --- @@ -11,22 +10,94 @@ function $retfoo($b1, $x) -> ret { leave } if iszero(v0) { - let v1 := lt($x, 5) - if v1 { + let v1 := $u64_haee7f05a097ffa16_ord_h264f6d6d75097a_lt($x, 5) + let v2 := v1 + if v2 { ret := 1 leave } - if iszero(v1) { - let v2 := sub($x, 1) - let v3 := eq(v2, 42) - if v3 { + if iszero(v2) { + let v3 := $checked_sub_u64($x, 1) + let v4 := v3 + let v5 := $u64_haee7f05a097ffa16_eq_he50383edd273619f_eq(v4, 42) + let v6 := v5 + if v6 { ret := 2 leave } - if iszero(v3) { - ret := add(v2, 1) + if iszero(v6) { + let v7 := $checked_add_u64(v4, 1) + ret := v7 leave } } } } +function $u64_haee7f05a097ffa16_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)) + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)) + ret := v0 + leave +} +function $checked_add_u64($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) + ret := v0 + leave +} +function $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) -> ret { + let v0 := $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $checked_sub_u64($a, $b) -> ret { + let v0 := $checked_sub_unsigned_impl__u64__aee7f05a097ffa16($a, $b) + ret := v0 + leave +} +function $checked_sub_unsigned_impl__u64__aee7f05a097ffa16($a, $b) -> ret { + let v0 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0, v1) + let v3 := v2 + if v3 { + revert(0, 0) + } + let v4 := $u64_haee7f05a097ffa16_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + ret := v4 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := and(add(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := and(sub(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 + leave +} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/alloc.snap b/crates/codegen/tests/fixtures/sonatina_ir/alloc.snap index 62285fb763..bd95276604 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/alloc.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/alloc.snap @@ -7,16 +7,16 @@ target = "evm-ethereum-osaka" func private %bump(v0.i256) -> i256 { block0: - v2.*i8 = evm_malloc v0; - v3.i256 = ptr_to_int v2 i256; - return v3; + v1.*i8 = evm_malloc v0; + v2.i256 = ptr_to_int v1 i256; + return v2; } func private %bump_const() -> i256 { block0: - v2.*i8 = evm_malloc 64.i256; - v3.i256 = ptr_to_int v2 i256; - return v3; + v1.*i8 = evm_malloc 64.i256; + v2.i256 = ptr_to_int v1 i256; + return v2; } func private %__fe_sonatina_entry() { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/alloc_self_assign.snap b/crates/codegen/tests/fixtures/sonatina_ir/alloc_self_assign.snap index 55a38ac390..c320da8e7f 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/alloc_self_assign.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/alloc_self_assign.snap @@ -7,9 +7,9 @@ target = "evm-ethereum-osaka" func private %bump_self_assign(v0.i256) -> i256 { block0: - v2.*i8 = evm_malloc v0; - v3.i256 = ptr_to_int v2 i256; - return v3; + v1.*i8 = evm_malloc v0; + v2.i256 = ptr_to_int v1 i256; + return v2; } func private %__fe_sonatina_entry() { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/arg_bindings.snap b/crates/codegen/tests/fixtures/sonatina_ir/arg_bindings.snap index bde5fbc0b9..f25b268bd1 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/arg_bindings.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/arg_bindings.snap @@ -5,15 +5,21 @@ input_file: crates/codegen/tests/fixtures/arg_bindings.fe --- target = "evm-ethereum-osaka" -func private %arg_bindings(v0.i256, v1.i256) -> i256 { +func private %arg_bindings(v0.i64, v1.i64) -> i64 { block0: - v3.i256 = add v0 v1; - return v3; + (v2.i64, v3.i1) = uaddo v0 v1; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; } func private %__fe_sonatina_entry() { block0: - v1.i256 = call %arg_bindings 0.i256 0.i256; + v1.i64 = call %arg_bindings 0.i64 0.i64; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/array_literal.snap b/crates/codegen/tests/fixtures/sonatina_ir/array_literal.snap index 0e4ea3046f..6fca86b95d 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/array_literal.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/array_literal.snap @@ -9,12 +9,12 @@ global private const [i8; 2048] $__fe_const_data_0 = [0, 0, 0, 0, 0, 0, 0, 0, 0, func private %large_array_literal() -> i256 { block0: - v2.*i8 = evm_malloc 2048.i256; - v3.i256 = ptr_to_int v2 i256; - v4.i256 = sym_addr $__fe_const_data_0; - v5.i256 = sym_size $__fe_const_data_0; - evm_code_copy v3 v4 v5; - return v3; + v1.*i8 = evm_malloc 2048.i256; + v2.i256 = ptr_to_int v1 i256; + v3.i256 = sym_addr $__fe_const_data_0; + v4.i256 = sym_size $__fe_const_data_0; + evm_code_copy v2 v3 v4; + return v2; } func private %__fe_sonatina_entry() { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/array_mut.snap b/crates/codegen/tests/fixtures/sonatina_ir/array_mut.snap index e1fcdafd02..4f525fb64c 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/array_mut.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/array_mut.snap @@ -5,36 +5,32 @@ input_file: crates/codegen/tests/fixtures/array_mut.fe --- target = "evm-ethereum-osaka" -func private %array_mut(v0.i256) -> i256 { +func private %array_mut(v0.i8) -> i256 { block0: - v3.*i8 = evm_malloc 128.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i8 = trunc v0 i8; - v6.i256 = zext v5 i256; - v7.*[i256; 4] = bitcast v3 *[i256; 4]; - v8.*i256 = gep v7 0.i256 0.i256; - mstore v8 v6 i256; - v10.i8 = trunc 2.i256 i8; - v11.i256 = zext v10 i256; - v12.*[i256; 4] = bitcast v3 *[i256; 4]; - v14.*i256 = gep v12 0.i256 1.i256; - mstore v14 v11 i256; - v16.i8 = trunc 3.i256 i8; - v17.i256 = zext v16 i256; - v18.*[i256; 4] = bitcast v3 *[i256; 4]; - v19.*i256 = gep v18 0.i256 2.i256; - mstore v19 v17 i256; - v21.i8 = trunc 4.i256 i8; - v22.i256 = zext v21 i256; - v23.*[i256; 4] = bitcast v3 *[i256; 4]; - v24.*i256 = gep v23 0.i256 3.i256; - mstore v24 v22 i256; - return v4; + v2.*i8 = evm_malloc 128.i256; + v3.i256 = ptr_to_int v2 i256; + v4.i256 = zext v0 i256; + v5.*[i8; 4] = bitcast v2 *[i8; 4]; + v7.*i8 = gep v5 0.i256 0.i256; + mstore v7 v4 i256; + v9.i256 = zext 2.i8 i256; + v10.*[i8; 4] = bitcast v2 *[i8; 4]; + v12.*i8 = gep v10 0.i256 1.i256; + mstore v12 v9 i256; + v14.i256 = zext 3.i8 i256; + v15.*[i8; 4] = bitcast v2 *[i8; 4]; + v17.*i8 = gep v15 0.i256 2.i256; + mstore v17 v14 i256; + v19.i256 = zext 4.i8 i256; + v20.*[i8; 4] = bitcast v2 *[i8; 4]; + v22.*i8 = gep v20 0.i256 3.i256; + mstore v22 v19 i256; + return v3; } func private %__fe_sonatina_entry() { block0: - v1.i256 = call %array_mut 0.i256; + v1.i256 = call %array_mut 0.i8; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/aug_assign.snap b/crates/codegen/tests/fixtures/sonatina_ir/aug_assign.snap index 1e7f2649ae..22f391fb2d 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/aug_assign.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/aug_assign.snap @@ -5,17 +5,29 @@ input_file: crates/codegen/tests/fixtures/aug_assign.fe --- target = "evm-ethereum-osaka" -func private %aug_assign(v0.i256, v1.i256) -> i256 { +func private %aug_assign(v0.i64, v1.i64) -> i64 { block0: - v3.i256 = add v0 v1; - v5.i256 = mul v3 2.i256; - v6.i256 = evm_udiv v5 2.i256; - return v6; + (v2.i64, v3.i1) = uaddo v0 v1; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + (v6.i64, v7.i1) = umulo v2 2.i64; + br v7 block1 block3; + + block3: + (v8.i64, v9.i1) = evm_udivo v6 2.i64; + br v9 block1 block4; + + block4: + return v8; } func private %__fe_sonatina_entry() { block0: - v1.i256 = call %aug_assign 0.i256 0.i256; + v1.i64 = call %aug_assign 0.i64 0.i64; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/aug_assign_bit_ops.snap b/crates/codegen/tests/fixtures/sonatina_ir/aug_assign_bit_ops.snap index 73bdc4c3ce..7a1ad0dae8 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/aug_assign_bit_ops.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/aug_assign_bit_ops.snap @@ -7,13 +7,124 @@ target = "evm-ethereum-osaka" func private %aug_assign_bit_ops(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = evm_exp v0 v1; - v5.i256 = shl 3.i256 v3; - v7.i256 = shr 1.i256 v5; - v9.i256 = and v7 255.i256; - v10.i256 = or v9 1.i256; - v12.i256 = xor v10 2.i256; - return v12; + v3.*i8 = evm_malloc 32.i256; + v4.i256 = ptr_to_int v3 i256; + v5.*i256 = bitcast v3 *i256; + mstore v5 v0 i256; + call %u256_h3271ca15373d4483_powassign_h1c527c5fd2f9bd8a_pow_assign v4 v1; + v6.*i256 = bitcast v3 *i256; + v7.i256 = mload v6 i256; + v9.i256 = shl 3.i256 v7; + v11.i256 = shr 1.i256 v9; + v13.i256 = and v11 255.i256; + v14.i256 = or v13 1.i256; + v16.i256 = xor v14 2.i256; + return v16; +} + +func private %u256_h3271ca15373d4483_powassign_h1c527c5fd2f9bd8a_pow_assign(v0.i256, v1.i256) { + block0: + v2.*i256 = int_to_ptr v0 *i256; + v3.i256 = mload v2 i256; + v4.i256 = call %u256_h3271ca15373d4483_pow_haae116e5e5042c2c_pow v3 v1; + v5.*i256 = int_to_ptr v0 *i256; + mstore v5 v4 i256; + return; +} + +func private %u256_h3271ca15373d4483_pow_haae116e5e5042c2c_pow(v0.i256, v1.i256) -> i256 { + block0: + v2.i256 = call %pow_checked__u256__3271ca15373d4483 v0 v1; + return v2; +} + +func private %pow_checked__u256__3271ca15373d4483(v0.i256, v1.i256) -> i256 { + block0: + v2.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word v1; + v4.i256 = and v2 -1.i256; + br 0.i1 block3 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v9.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word v0; + jump block4; + + block3: + v12.i256 = and v4 0.i256; + v13.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_ne v12 0.i256; + br v13 block1 block2; + + block4: + v39.i256 = phi (v9 block2) (v40 block10); + v37.i256 = phi (1.i256 block2) (v42 block10); + v14.i256 = phi (v4 block2) (v28 block10); + v15.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt v14 0.i256; + br v15 block5 block6; + + block5: + v17.i256 = and v14 1.i256; + v18.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_ne v17 0.i256; + br v18 block7 block8; + + block6: + v20.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word v37; + return v20; + + block7: + v22.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word v37; + v24.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word v39; + v25.i256 = call %u256_h3271ca15373d4483_mul_h290dcc921ed80777_mul v22 v24; + v26.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word v25; + jump block8; + + block8: + v42.i256 = phi (v37 block5) (v26 block7); + v28.i256 = shr 1.i256 v14; + v29.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt v28 0.i256; + br v29 block9 block10; + + block9: + v31.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word v39; + v32.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word v39; + v33.i256 = call %u256_h3271ca15373d4483_mul_h290dcc921ed80777_mul v31 v32; + v34.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word v33; + jump block10; + + block10: + v40.i256 = phi (v39 block8) (v34 block9); + jump block4; +} + +func private %u256_h3271ca15373d4483_eq_he50383edd273619f_ne(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; + v3.i1 = is_zero v2; + return v3; +} + +func private %u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = gt v0 v1; + return v2; +} + +func private %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i256 { + block0: + return v0; +} + +func private %u256_h3271ca15373d4483_mul_h290dcc921ed80777_mul(v0.i256, v1.i256) -> i256 { + block0: + (v2.i256, v3.i1) = umulo v0 v1; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; } func private %__fe_sonatina_entry() { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/bit_and.snap b/crates/codegen/tests/fixtures/sonatina_ir/bit_and.snap index 7f03de33ae..5a673c9206 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/bit_and.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/bit_and.snap @@ -5,15 +5,15 @@ input_file: crates/codegen/tests/fixtures/bit_and.fe --- target = "evm-ethereum-osaka" -func private %bit_and() -> i256 { +func private %bit_and() -> i64 { block0: - v3.i256 = and 1.i256 2.i256; - return v3; + v2.i64 = and 1.i64 2.i64; + return v2; } func private %__fe_sonatina_entry() { block0: - v0.i256 = call %bit_and; + v0.i64 = call %bit_and; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/bit_ops.snap b/crates/codegen/tests/fixtures/sonatina_ir/bit_ops.snap index a214c0a94c..2d51195076 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/bit_ops.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/bit_ops.snap @@ -9,37 +9,132 @@ type @__fe_tuple_0 = {i256, i256, i256, i256, i256}; func private %bit_ops(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = and v0 v1; - v4.i256 = or v0 v1; - v5.i256 = xor v0 v1; - v7.i256 = shl 8.i256 v0; - v9.i256 = shr 2.i256 v0; - v11.*i8 = evm_malloc 160.i256; - v12.i256 = ptr_to_int v11 i256; - v13.*@__fe_tuple_0 = bitcast v11 *@__fe_tuple_0; - v14.*i256 = gep v13 0.i256 0.i256; - mstore v14 v3 i256; - v15.*@__fe_tuple_0 = bitcast v11 *@__fe_tuple_0; + v2.i256 = and v0 v1; + v3.i256 = or v0 v1; + v4.i256 = xor v0 v1; + v6.i256 = shl 8.i256 v0; + v8.i256 = shr 2.i256 v0; + v10.*i8 = evm_malloc 160.i256; + v11.i256 = ptr_to_int v10 i256; + v12.*@__fe_tuple_0 = bitcast v10 *@__fe_tuple_0; + v14.*i256 = gep v12 0.i256 0.i256; + mstore v14 v2 i256; + v15.*@__fe_tuple_0 = bitcast v10 *@__fe_tuple_0; v17.*i256 = gep v15 0.i256 1.i256; - mstore v17 v4 i256; - v18.*@__fe_tuple_0 = bitcast v11 *@__fe_tuple_0; + mstore v17 v3 i256; + v18.*@__fe_tuple_0 = bitcast v10 *@__fe_tuple_0; v19.*i256 = gep v18 0.i256 2.i256; - mstore v19 v5 i256; - v20.*@__fe_tuple_0 = bitcast v11 *@__fe_tuple_0; + mstore v19 v4 i256; + v20.*@__fe_tuple_0 = bitcast v10 *@__fe_tuple_0; v22.*i256 = gep v20 0.i256 3.i256; - mstore v22 v7 i256; - v23.*@__fe_tuple_0 = bitcast v11 *@__fe_tuple_0; + mstore v22 v6 i256; + v23.*@__fe_tuple_0 = bitcast v10 *@__fe_tuple_0; v25.*i256 = gep v23 0.i256 4.i256; - mstore v25 v9 i256; - return v12; + mstore v25 v8 i256; + return v11; } func private %pow_op(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = evm_exp v0 v1; + v2.i256 = call %u256_h3271ca15373d4483_pow_haae116e5e5042c2c_pow v0 v1; + return v2; +} + +func private %u256_h3271ca15373d4483_pow_haae116e5e5042c2c_pow(v0.i256, v1.i256) -> i256 { + block0: + v2.i256 = call %pow_checked__u256__3271ca15373d4483 v0 v1; + return v2; +} + +func private %pow_checked__u256__3271ca15373d4483(v0.i256, v1.i256) -> i256 { + block0: + v2.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word v1; + v4.i256 = and v2 -1.i256; + br 0.i1 block3 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v9.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word v0; + jump block4; + + block3: + v12.i256 = and v4 0.i256; + v13.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_ne v12 0.i256; + br v13 block1 block2; + + block4: + v39.i256 = phi (v9 block2) (v40 block10); + v37.i256 = phi (1.i256 block2) (v42 block10); + v14.i256 = phi (v4 block2) (v28 block10); + v15.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt v14 0.i256; + br v15 block5 block6; + + block5: + v17.i256 = and v14 1.i256; + v18.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_ne v17 0.i256; + br v18 block7 block8; + + block6: + v20.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word v37; + return v20; + + block7: + v22.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word v37; + v24.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word v39; + v25.i256 = call %u256_h3271ca15373d4483_mul_h290dcc921ed80777_mul v22 v24; + v26.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word v25; + jump block8; + + block8: + v42.i256 = phi (v37 block5) (v26 block7); + v28.i256 = shr 1.i256 v14; + v29.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt v28 0.i256; + br v29 block9 block10; + + block9: + v31.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word v39; + v32.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word v39; + v33.i256 = call %u256_h3271ca15373d4483_mul_h290dcc921ed80777_mul v31 v32; + v34.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word v33; + jump block10; + + block10: + v40.i256 = phi (v39 block8) (v34 block9); + jump block4; +} + +func private %u256_h3271ca15373d4483_eq_he50383edd273619f_ne(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; + v3.i1 = is_zero v2; return v3; } +func private %u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = gt v0 v1; + return v2; +} + +func private %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i256 { + block0: + return v0; +} + +func private %u256_h3271ca15373d4483_mul_h290dcc921ed80777_mul(v0.i256, v1.i256) -> i256 { + block0: + (v2.i256, v3.i1) = umulo v0 v1; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; +} + func private %__fe_sonatina_entry() { block0: v1.i256 = call %bit_ops 0.i256 0.i256; diff --git a/crates/codegen/tests/fixtures/sonatina_ir/bitnot.snap b/crates/codegen/tests/fixtures/sonatina_ir/bitnot.snap index 50fdc85088..70405027a8 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/bitnot.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/bitnot.snap @@ -7,8 +7,8 @@ target = "evm-ethereum-osaka" func private %bit_not(v0.i256) -> i256 { block0: - v2.i256 = not v0; - return v2; + v1.i256 = not v0; + return v1; } func private %__fe_sonatina_entry() { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/block_expr.snap b/crates/codegen/tests/fixtures/sonatina_ir/block_expr.snap index ca8431aa62..18c43f43d5 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/block_expr.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/block_expr.snap @@ -5,15 +5,21 @@ input_file: crates/codegen/tests/fixtures/block_expr.fe --- target = "evm-ethereum-osaka" -func private %block_expr() -> i256 { +func private %block_expr() -> i64 { block0: - v3.i256 = add 1.i256 2.i256; - return v3; + (v2.i64, v3.i1) = uaddo 1.i64 2.i64; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; } func private %__fe_sonatina_entry() { block0: - v0.i256 = call %block_expr; + v0.i64 = call %block_expr; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/bool_literal.snap b/crates/codegen/tests/fixtures/sonatina_ir/bool_literal.snap index e99a56f7d0..2f635b7488 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/bool_literal.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/bool_literal.snap @@ -5,14 +5,14 @@ input_file: crates/codegen/tests/fixtures/bool_literal.fe --- target = "evm-ethereum-osaka" -func private %bool_literal() -> i256 { +func private %bool_literal() -> i1 { block0: - return 1.i256; + return 1.i1; } func private %__fe_sonatina_entry() { block0: - v0.i256 = call %bool_literal; + v0.i1 = call %bool_literal; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/borrow_handles_readback.snap b/crates/codegen/tests/fixtures/sonatina_ir/borrow_handles_readback.snap index db2ff15545..488aa2d446 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/borrow_handles_readback.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/borrow_handles_readback.snap @@ -7,10 +7,10 @@ target = "evm-ethereum-osaka" func private %borrow_handles_readback() -> i256 { block0: - v1.*i256 = alloca i256; - v2.i256 = ptr_to_int v1 i256; - mstore v1 0.i256 i256; - mstore v1 5.i256 i256; + v0.*i256 = alloca i256; + v1.i256 = ptr_to_int v0 i256; + mstore v0 0.i256 i256; + mstore v0 5.i256 i256; return 5.i256; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/borrow_storage_field_handle.snap b/crates/codegen/tests/fixtures/sonatina_ir/borrow_storage_field_handle.snap index fe66524509..97a570d777 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/borrow_storage_field_handle.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/borrow_storage_field_handle.snap @@ -7,11 +7,17 @@ target = "evm-ethereum-osaka" func private %borrow_storage_field_handle__StorPtr_CoinStore___ba1c0d0726e89ba2(v0.i256) -> i256 { block0: - v2.i256 = evm_sload v0; - v4.i256 = add v2 1.i256; - evm_sstore v0 v4; - v5.i256 = evm_sload v0; - return v5; + v1.i256 = evm_sload v0; + (v3.i256, v4.i1) = uaddo v1 1.i256; + br v4 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + evm_sstore v0 v3; + v8.i256 = evm_sload v0; + return v8; } func private %__fe_sonatina_entry() { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/by_ref_trait_provider_storage_bug.snap b/crates/codegen/tests/fixtures/sonatina_ir/by_ref_trait_provider_storage_bug.snap index c4b99f1792..806482c765 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/by_ref_trait_provider_storage_bug.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/by_ref_trait_provider_storage_bug.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 expression: output input_file: crates/codegen/tests/fixtures/by_ref_trait_provider_storage_bug.fe --- @@ -18,28 +17,34 @@ type @__fe_SolDecoder_8 = {@__fe_Cursor_7, i256}; func private %pair_h956dff41e88ee341_ctx_h4952b3c1f066f039_sum(v0.i256) -> i256 { block0: - v2.*@__fe_Pair_0 = int_to_ptr v0 *@__fe_Pair_0; - v3.*i256 = gep v2 0.i256 0.i256; + v1.*@__fe_Pair_0 = int_to_ptr v0 *@__fe_Pair_0; + v3.*i256 = gep v1 0.i256 0.i256; v4.i256 = mload v3 i256; v5.*@__fe_Pair_0 = int_to_ptr v0 *@__fe_Pair_0; v7.*i256 = gep v5 0.i256 1.i256; v8.i256 = mload v7 i256; - v9.i256 = add v4 v8; + (v9.i256, v10.i1) = uaddo v4 v8; + br v10 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: return v9; } func private %__ByRefTraitProviderStorageBug_init_contract(v0.i256) { block0: - v2.*@__fe_Pair_0 = alloca @__fe_Pair_0; - v3.i256 = ptr_to_int v2 i256; - v5.*i256 = gep v2 0.i256 0.i256; + v1.*@__fe_Pair_0 = alloca @__fe_Pair_0; + v2.i256 = ptr_to_int v1 i256; + v5.*i256 = gep v1 0.i256 0.i256; mstore v5 40.i256 i256; - v8.*i256 = gep v2 0.i256 1.i256; + v8.*i256 = gep v1 0.i256 1.i256; mstore v8 2.i256 i256; - v9.*i256 = gep v2 0.i256 0.i256; + v9.*i256 = gep v1 0.i256 0.i256; v10.i256 = mload v9 i256; evm_sstore v0 v10; - v11.*i256 = gep v2 0.i256 1.i256; + v11.*i256 = gep v1 0.i256 1.i256; v12.i256 = mload v11 i256; v13.i256 = add v0 1.i256; evm_sstore v13 v12; @@ -54,70 +59,68 @@ func private %__ByRefTraitProviderStorageBug_recv_0_0(v0.i256) -> i256 { func private %__ByRefTraitProviderStorageBug_init() { block0: - v1.i256 = call %init_field__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785 0.i256 0.i256; - v2.i256 = sym_addr &__ByRefTraitProviderStorageBug_runtime; - v3.i256 = sym_size &__ByRefTraitProviderStorageBug_runtime; - v4.i256 = sym_size .; - v5.i256 = evm_code_size; - v6.i1 = lt v5 v4; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block1 block2; + v2.i256 = call %init_field__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785 0.i256 0.i256; + v3.i256 = sym_addr &__ByRefTraitProviderStorageBug_runtime; + v4.i256 = sym_size &__ByRefTraitProviderStorageBug_runtime; + v5.i256 = sym_size .; + v6.i256 = evm_code_size; + v7.i1 = lt v6 v5; + br v7 block1 block2; block1: call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; evm_invalid; block2: - v11.i256 = sub v5 v4; - v12.i256 = sub v5 v4; + v11.i256 = sub v6 v5; + v12.i256 = sub v6 v5; v13.*i8 = evm_malloc v12; v14.i256 = ptr_to_int v13 i256; - v15.i256 = sub v5 v4; - evm_code_copy v14 v4 v15; + v15.i256 = sub v6 v5; + evm_code_copy v14 v5 v15; v17.*i8 = evm_malloc 64.i256; v18.i256 = ptr_to_int v17 i256; v19.*@__fe_MemoryBytes_1 = bitcast v17 *@__fe_MemoryBytes_1; v20.*i256 = gep v19 0.i256 0.i256; mstore v20 v14 i256; - v21.i256 = sub v5 v4; + v21.i256 = sub v6 v5; v22.*@__fe_MemoryBytes_1 = bitcast v17 *@__fe_MemoryBytes_1; v24.*i256 = gep v22 0.i256 1.i256; mstore v24 v21 i256; v25.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v18; - call %__ByRefTraitProviderStorageBug_init_contract v1; - evm_code_copy 0.i256 v2 v3; - evm_return 0.i256 v3; + call %__ByRefTraitProviderStorageBug_init_contract v2; + evm_code_copy 0.i256 v3 v4; + evm_return 0.i256 v4; } func private %__ByRefTraitProviderStorageBug_runtime() { block0: - v1.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140 0.i256 0.i256; - v2.i256 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v3.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - br_table v2 block1 (1.i256 block2); + v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140 0.i256 0.i256; + v4.i32 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; + v6.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; + br_table v4 block1 (1.i32 block2); block1: call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; evm_invalid; block2: - call %go_h50739b8917c22b82_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v3; - v7.i256 = call %__ByRefTraitProviderStorageBug_recv_0_0 v1; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v7; + call %go_h50739b8917c22b82_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v6; + v11.i256 = call %__ByRefTraitProviderStorageBug_recv_0_0 v2; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v11; evm_invalid; } func private %use_ctx_eff0_stor__Pair_h956dff41e88ee341__acec41afdc898140(v0.i256) -> i256 { block0: - v2.i256 = call %pair_h956dff41e88ee341_ctx_h4952b3c1f066f039_sum_stor_arg0_root_stor v0; - return v2; + v1.i256 = call %pair_h956dff41e88ee341_ctx_h4952b3c1f066f039_sum_stor_arg0_root_stor v0; + return v1; } func private %init_field__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140 v0 v1; - return v3; + v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140 v0 v1; + return v2; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(v0.i256) { @@ -127,40 +130,38 @@ func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(v0.i256 func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; + v1.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; + return v1; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %stor_ptr__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785 0.i256 v1; - return v3; + v4.i256 = call %stor_ptr__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785 0.i256 v1; + return v4; } -func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { +func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i32 { block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; - v3.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v2; - v5.i1 = lt v3 4.i256; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; + v1.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; + v2.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v1; + v4.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt v2 4.i256; + br v4 block1 block2; block1: call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort v0; evm_invalid; block2: - v10.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v2 0.i256; - v11.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v10; - return v11; + v8.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v1 0.i256; + v9.i32 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v8; + return v9; } func private %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; - v4.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 4.i256; - return v4; + v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; + v5.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 4.i256; + return v5; } func private %go_h50739b8917c22b82_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) { @@ -170,14 +171,14 @@ func private %go_h50739b8917c22b82_decode_h624c3cd8c996d995_decode__SolDecoder_C func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f(v0.i256, v1.i256) { block0: - v3.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v3; - v6.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v7.*@__fe_tuple_2 = int_to_ptr v6 *@__fe_tuple_2; - v8.*i256 = gep v7 0.i256 0.i256; + v2.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; + v4.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v2 32.i256; + call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v2; + v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v2; + v6.*@__fe_tuple_2 = int_to_ptr v5 *@__fe_tuple_2; + v8.*i256 = gep v6 0.i256 0.i256; v9.i256 = mload v8 i256; - v10.*@__fe_tuple_2 = int_to_ptr v6 *@__fe_tuple_2; + v10.*@__fe_tuple_2 = int_to_ptr v5 *@__fe_tuple_2; v12.*i256 = gep v10 0.i256 1.i256; v13.i256 = mload v12 i256; call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes 0.i256 v9 v13; @@ -186,46 +187,52 @@ func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4 func private %pair_h956dff41e88ee341_ctx_h4952b3c1f066f039_sum_stor_arg0_root_stor(v0.i256) -> i256 { block0: - v2.i256 = evm_sload v0; - v4.i256 = add v0 1.i256; - v5.i256 = evm_sload v4; - v6.i256 = add v2 v5; - return v6; + v1.i256 = evm_sload v0; + v3.i256 = add v0 1.i256; + v4.i256 = evm_sload v3; + (v5.i256, v6.i1) = uaddo v1 v4; + br v6 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v5; } func private %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v2.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - v4.*i8 = evm_malloc 128.i256; - v5.i256 = ptr_to_int v4 i256; - v6.*@__fe_Cursor_3 = int_to_ptr v2 *@__fe_Cursor_3; - v7.*i256 = gep v6 0.i256 0.i256 0.i256; + v1.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; + v3.*i8 = evm_malloc 128.i256; + v4.i256 = ptr_to_int v3 i256; + v5.*@__fe_Cursor_3 = int_to_ptr v1 *@__fe_Cursor_3; + v7.*i256 = gep v5 0.i256 0.i256 0.i256; v8.i256 = mload v7 i256; - v9.*@__fe_SolDecoder_4 = bitcast v4 *@__fe_SolDecoder_4; + v9.*@__fe_SolDecoder_4 = bitcast v3 *@__fe_SolDecoder_4; v10.*i256 = gep v9 0.i256 0.i256 0.i256 0.i256; mstore v10 v8 i256; - v11.*@__fe_Cursor_3 = int_to_ptr v2 *@__fe_Cursor_3; + v11.*@__fe_Cursor_3 = int_to_ptr v1 *@__fe_Cursor_3; v13.*i256 = gep v11 0.i256 0.i256 1.i256; v14.i256 = mload v13 i256; - v15.*@__fe_SolDecoder_4 = bitcast v4 *@__fe_SolDecoder_4; + v15.*@__fe_SolDecoder_4 = bitcast v3 *@__fe_SolDecoder_4; v16.*i256 = gep v15 0.i256 0.i256 0.i256 1.i256; mstore v16 v14 i256; - v17.*@__fe_Cursor_3 = int_to_ptr v2 *@__fe_Cursor_3; + v17.*@__fe_Cursor_3 = int_to_ptr v1 *@__fe_Cursor_3; v18.*i256 = gep v17 0.i256 1.i256; v19.i256 = mload v18 i256; - v20.*@__fe_SolDecoder_4 = bitcast v4 *@__fe_SolDecoder_4; + v20.*@__fe_SolDecoder_4 = bitcast v3 *@__fe_SolDecoder_4; v21.*i256 = gep v20 0.i256 0.i256 1.i256; mstore v21 v19 i256; - v22.*@__fe_SolDecoder_4 = bitcast v4 *@__fe_SolDecoder_4; + v22.*@__fe_SolDecoder_4 = bitcast v3 *@__fe_SolDecoder_4; v23.*i256 = gep v22 0.i256 1.i256; mstore v23 0.i256 i256; - return v5; + return v4; } func private %stor_ptr__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Pair_h956dff41e88ee341__acec41afdc898140 v1; - return v3; + v2.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Pair_h956dff41e88ee341__acec41afdc898140 v1; + return v2; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256) -> i256 { @@ -235,68 +242,89 @@ func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256 func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { block0: - v2.i256 = evm_calldata_size; - v3.i256 = sub v2 v0; - return v3; + v1.i256 = evm_calldata_size; + (v2.i256, v3.i1) = usubo v1 v0; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; +} + +func private %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = lt v0 v1; + return v2; } func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = add v0 v1; - v4.i256 = add v0 v1; - v5.i256 = evm_calldata_load v4; + (v2.i256, v3.i1) = uaddo v0 v1; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v5.i256 = evm_calldata_load v2; return v5; } -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i256 { +func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i32 { block0: - v3.i256 = shr 224.i256 v0; - v4.i256 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v3; - return v4; + v2.i256 = shr 224.i256 v0; + v3.i32 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v2; + return v3; } func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; - return v3; + v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; + return v2; } func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() -> i256 { block0: - v1.i256 = call %solencoder_h1b9228b90dad6928_new; - return v1; + v0.i256 = call %solencoder_h1b9228b90dad6928_new; + return v0; } func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; - v4.*i256 = gep v3 0.i256 0.i256; + v2.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; + v4.*i256 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; - v6.i1 = eq v5 0.i256; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block1 block2; + v6.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq v5 0.i256; + br v6 block1 block2; block1: - v10.*i8 = evm_malloc v1; - v11.i256 = ptr_to_int v10 i256; + v8.*i8 = evm_malloc v1; + v9.i256 = ptr_to_int v8 i256; + v11.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; + v12.*i256 = gep v11 0.i256 0.i256; + mstore v12 v9 i256; v13.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; - v14.*i256 = gep v13 0.i256 0.i256; - mstore v14 v11 i256; - v15.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; - v17.*i256 = gep v15 0.i256 1.i256; - mstore v17 v11 i256; - v18.i256 = add v11 v1; - v19.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; - v21.*i256 = gep v19 0.i256 2.i256; - mstore v21 v18 i256; - jump block2; + v15.*i256 = gep v13 0.i256 1.i256; + mstore v15 v9 i256; + (v16.i256, v17.i1) = uaddo v9 v1; + br v17 block3 block4; block2: v23.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; v24.*i256 = gep v23 0.i256 0.i256; v25.i256 = mload v24 i256; return v25; + + block3: + evm_revert 0.i256 0.i256; + + block4: + v19.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; + v21.*i256 = gep v19 0.i256 2.i256; + mstore v21 v16 i256; + jump block2; } func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { @@ -307,22 +335,28 @@ func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482 func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0.i256) -> i256 { block0: - v2.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; - v3.*i256 = gep v2 0.i256 0.i256; + v1.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; + v3.*i256 = gep v1 0.i256 0.i256; v4.i256 = mload v3 i256; v5.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; v7.*i256 = gep v5 0.i256 2.i256; v8.i256 = mload v7 i256; - v10.*i8 = evm_malloc 64.i256; - v11.i256 = ptr_to_int v10 i256; - v12.*@__fe_tuple_2 = bitcast v10 *@__fe_tuple_2; - v13.*i256 = gep v12 0.i256 0.i256; - mstore v13 v4 i256; - v14.i256 = sub v8 v4; - v15.*@__fe_tuple_2 = bitcast v10 *@__fe_tuple_2; - v17.*i256 = gep v15 0.i256 1.i256; - mstore v17 v14 i256; - return v11; + (v9.i256, v10.i1) = usubo v8 v4; + br v10 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v12.*i8 = evm_malloc 64.i256; + v13.i256 = ptr_to_int v12 i256; + v15.*@__fe_tuple_2 = bitcast v12 *@__fe_tuple_2; + v16.*i256 = gep v15 0.i256 0.i256; + mstore v16 v4 i256; + v17.*@__fe_tuple_2 = bitcast v12 *@__fe_tuple_2; + v19.*i256 = gep v17 0.i256 1.i256; + mstore v19 v9 i256; + return v13; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(v0.i256, v1.i256, v2.i256) { @@ -332,24 +366,24 @@ func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes( func private %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v3.*i8 = evm_malloc 96.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_MemoryBytes_1 = int_to_ptr v0 *@__fe_MemoryBytes_1; - v6.*i256 = gep v5 0.i256 0.i256; + v2.*i8 = evm_malloc 96.i256; + v3.i256 = ptr_to_int v2 i256; + v4.*@__fe_MemoryBytes_1 = int_to_ptr v0 *@__fe_MemoryBytes_1; + v6.*i256 = gep v4 0.i256 0.i256; v7.i256 = mload v6 i256; - v8.*@__fe_Cursor_3 = bitcast v3 *@__fe_Cursor_3; + v8.*@__fe_Cursor_3 = bitcast v2 *@__fe_Cursor_3; v9.*i256 = gep v8 0.i256 0.i256 0.i256; mstore v9 v7 i256; v10.*@__fe_MemoryBytes_1 = int_to_ptr v0 *@__fe_MemoryBytes_1; v12.*i256 = gep v10 0.i256 1.i256; v13.i256 = mload v12 i256; - v14.*@__fe_Cursor_3 = bitcast v3 *@__fe_Cursor_3; + v14.*@__fe_Cursor_3 = bitcast v2 *@__fe_Cursor_3; v15.*i256 = gep v14 0.i256 0.i256 1.i256; mstore v15 v13 i256; - v16.*@__fe_Cursor_3 = bitcast v3 *@__fe_Cursor_3; + v16.*@__fe_Cursor_3 = bitcast v2 *@__fe_Cursor_3; v17.*i256 = gep v16 0.i256 1.i256; mstore v17 0.i256 i256; - return v4; + return v3; } func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Pair_h956dff41e88ee341__acec41afdc898140(v0.i256) -> i256 { @@ -357,63 +391,75 @@ func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_r return v0; } -func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i256 { +func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i32 { block0: - v2.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; - v3.i256 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v2; - return v3; + v1.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; + v2.i32 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v1; + return v2; } func private %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - v4.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 v1; - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_Cursor_7 = int_to_ptr v4 *@__fe_Cursor_7; - v9.*i256 = gep v8 0.i256 0.i256 0.i256; + v2.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; + v3.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 v1; + v5.*i8 = evm_malloc 96.i256; + v6.i256 = ptr_to_int v5 i256; + v7.*@__fe_Cursor_7 = int_to_ptr v3 *@__fe_Cursor_7; + v9.*i256 = gep v7 0.i256 0.i256 0.i256; v10.i256 = mload v9 i256; - v11.*@__fe_SolDecoder_8 = bitcast v6 *@__fe_SolDecoder_8; + v11.*@__fe_SolDecoder_8 = bitcast v5 *@__fe_SolDecoder_8; v12.*i256 = gep v11 0.i256 0.i256 0.i256 0.i256; mstore v12 v10 i256; - v13.*@__fe_Cursor_7 = int_to_ptr v4 *@__fe_Cursor_7; + v13.*@__fe_Cursor_7 = int_to_ptr v3 *@__fe_Cursor_7; v15.*i256 = gep v13 0.i256 1.i256; v16.i256 = mload v15 i256; - v17.*@__fe_SolDecoder_8 = bitcast v6 *@__fe_SolDecoder_8; + v17.*@__fe_SolDecoder_8 = bitcast v5 *@__fe_SolDecoder_8; v18.*i256 = gep v17 0.i256 0.i256 1.i256; mstore v18 v16 i256; - v19.*@__fe_SolDecoder_8 = bitcast v6 *@__fe_SolDecoder_8; + v19.*@__fe_SolDecoder_8 = bitcast v5 *@__fe_SolDecoder_8; v20.*i256 = gep v19 0.i256 1.i256; mstore v20 v1 i256; - return v7; + return v6; } func private %solencoder_h1b9228b90dad6928_new() -> i256 { block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v4.*@__fe_SolEncoder_5 = bitcast v2 *@__fe_SolEncoder_5; + v1.*i8 = evm_malloc 96.i256; + v2.i256 = ptr_to_int v1 i256; + v4.*@__fe_SolEncoder_5 = bitcast v1 *@__fe_SolEncoder_5; v5.*i256 = gep v4 0.i256 0.i256; mstore v5 0.i256 i256; - v6.*@__fe_SolEncoder_5 = bitcast v2 *@__fe_SolEncoder_5; + v6.*@__fe_SolEncoder_5 = bitcast v1 *@__fe_SolEncoder_5; v8.*i256 = gep v6 0.i256 1.i256; mstore v8 0.i256 i256; - v9.*@__fe_SolEncoder_5 = bitcast v2 *@__fe_SolEncoder_5; + v9.*@__fe_SolEncoder_5 = bitcast v1 *@__fe_SolEncoder_5; v11.*i256 = gep v9 0.i256 2.i256; mstore v11 0.i256 i256; - return v3; + return v2; +} + +func private %u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; + return v2; } func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word(v0.i256, v1.i256) { block0: - v3.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; - v5.*i256 = gep v3 0.i256 1.i256; + v2.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; + v5.*i256 = gep v2 0.i256 1.i256; v6.i256 = mload v5 i256; mstore v6 v1 i256; - v8.i256 = add v6 32.i256; - v9.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; - v10.*i256 = gep v9 0.i256 1.i256; - mstore v10 v8 i256; + (v8.i256, v9.i1) = uaddo v6 32.i256; + br v9 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v11.*@__fe_SolEncoder_5 = int_to_ptr v0 *@__fe_SolEncoder_5; + v12.*i256 = gep v11 0.i256 1.i256; + mstore v12 v8 i256; return; } @@ -422,28 +468,29 @@ func private %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0.i256) return v0; } -func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i256 { +func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i32 { block0: - return v0; + v1.i32 = trunc v0 i32; + return v1; } func private %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256) -> i256 { block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_7 = bitcast v3 *@__fe_Cursor_7; - v6.*@__fe_CallData_6 = gep v5 0.i256 0.i256; + v2.*i8 = evm_malloc 64.i256; + v3.i256 = ptr_to_int v2 i256; + v4.*@__fe_Cursor_7 = bitcast v2 *@__fe_Cursor_7; + v6.*@__fe_CallData_6 = gep v4 0.i256 0.i256; mstore v6 v0 i256; - v7.*@__fe_Cursor_7 = bitcast v3 *@__fe_Cursor_7; + v7.*@__fe_Cursor_7 = bitcast v2 *@__fe_Cursor_7; v9.*i256 = gep v7 0.i256 1.i256; mstore v9 0.i256 i256; - return v4; + return v3; } func private %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_Cursor_7 = int_to_ptr v0 *@__fe_Cursor_7; - v4.*@__fe_CallData_6 = gep v3 0.i256 0.i256; + v2.*@__fe_Cursor_7 = int_to_ptr v0 *@__fe_Cursor_7; + v4.*@__fe_CallData_6 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; v7.*i8 = evm_malloc 64.i256; v8.i256 = ptr_to_int v7 i256; diff --git a/crates/codegen/tests/fixtures/sonatina_ir/caller.snap b/crates/codegen/tests/fixtures/sonatina_ir/caller.snap index b9faeec75b..3a1a3a9ed5 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/caller.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/caller.snap @@ -7,8 +7,8 @@ target = "evm-ethereum-osaka" func private %who_called__Evm_hef0af3106e109414__3af54274b2985741(v0.i256) -> i256 { block0: - v2.i256 = evm_caller; - return v2; + v1.i256 = evm_caller; + return v1; } func private %__fe_sonatina_entry() { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/cast_u8_usize_cmp.snap b/crates/codegen/tests/fixtures/sonatina_ir/cast_u8_usize_cmp.snap index d0d5db632e..f3b4be340f 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/cast_u8_usize_cmp.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/cast_u8_usize_cmp.snap @@ -5,46 +5,60 @@ input_file: crates/codegen/tests/fixtures/cast_u8_usize_cmp.fe --- target = "evm-ethereum-osaka" -func private %cast_u8_usize_cmp(v0.i256, v1.i256, v2.i256) -> i256 { +func private %cast_u8_usize_cmp(v0.i256, v1.i256, v2.i256) -> i8 { block0: - v4.*[i256; 8] = int_to_ptr v0 *[i256; 8]; - v5.*i256 = gep v4 0.i256 v1; + v3.*[i8; 8] = int_to_ptr v0 *[i8; 8]; + v5.*i8 = gep v3 0.i256 v1; v6.i256 = mload v5 i256; v7.i8 = trunc v6 i8; v8.i256 = zext v7 i256; - v9.i1 = lt v2 v8; - v10.i256 = zext v9 i256; - v11.i1 = ne v10 0.i256; - br v11 block1 block2; + v9.i1 = call %usize_ha12462c6d36e68b0_ord_h264f6d6d75097a_lt v2 v8; + br v9 block1 block2; block1: - return 1.i256; + return 1.i8; block2: - v15.i1 = eq v2 v8; - v16.i256 = zext v15 i256; - v17.i1 = ne v16 0.i256; - br v17 block3 block4; + v13.i256 = zext v7 i256; + v14.i1 = call %usize_ha12462c6d36e68b0_eq_he50383edd273619f_eq v2 v13; + br v14 block3 block4; block3: - return 2.i256; + return 2.i8; block4: - v21.i1 = gt v2 v8; - v22.i256 = zext v21 i256; - v23.i1 = ne v22 0.i256; - br v23 block5 block6; + v18.i256 = zext v7 i256; + v19.i1 = call %usize_ha12462c6d36e68b0_ord_h264f6d6d75097a_gt v2 v18; + br v19 block5 block6; block5: - return 3.i256; + return 3.i8; block6: - return 0.i256; + return 0.i8; +} + +func private %usize_ha12462c6d36e68b0_ord_h264f6d6d75097a_lt(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = lt v0 v1; + return v2; +} + +func private %usize_ha12462c6d36e68b0_eq_he50383edd273619f_eq(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; + return v2; +} + +func private %usize_ha12462c6d36e68b0_ord_h264f6d6d75097a_gt(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = gt v0 v1; + return v2; } func private %__fe_sonatina_entry() { block0: - v1.i256 = call %cast_u8_usize_cmp 0.i256 0.i256 0.i256; + v1.i8 = call %cast_u8_usize_cmp 0.i256 0.i256 0.i256; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/code_region.snap b/crates/codegen/tests/fixtures/sonatina_ir/code_region.snap index 92615d8444..c951fbc3fd 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/code_region.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/code_region.snap @@ -9,19 +9,19 @@ func private %init__StorPtr_Evm___207f35a85ac4062e() { block0: v1.i256 = sym_size &child_init__StorPtr_Evm___207f35a85ac4062e; v2.i256 = sym_addr &child_init__StorPtr_Evm___207f35a85ac4062e; - v3.i256 = call %allocate__Evm_hef0af3106e109414__3af54274b2985741 v1 0.i256; - evm_code_copy v3 v2 v1; - v5.i256 = call %evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create2_raw_stor_arg0_root_stor 0.i256 0.i256 v2 v1 4660.i256; - v6.i256 = sym_size &runtime__StorPtr_Evm___207f35a85ac4062e; - v7.i256 = sym_addr &runtime__StorPtr_Evm___207f35a85ac4062e; - v8.i256 = call %allocate__Evm_hef0af3106e109414__3af54274b2985741 v6 0.i256; - evm_code_copy v8 v7 v6; - evm_return v8 v6; + v4.i256 = call %allocate__Evm_hef0af3106e109414__3af54274b2985741 v1 0.i256; + evm_code_copy v4 v2 v1; + v6.i256 = call %evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create2_raw_stor_arg0_root_stor 0.i256 0.i256 v2 v1 4660.i256; + v7.i256 = sym_size &runtime__StorPtr_Evm___207f35a85ac4062e; + v8.i256 = sym_addr &runtime__StorPtr_Evm___207f35a85ac4062e; + v10.i256 = call %allocate__Evm_hef0af3106e109414__3af54274b2985741 v7 0.i256; + evm_code_copy v10 v8 v7; + evm_return v10 v7; } func private %runtime__StorPtr_Evm___207f35a85ac4062e() { block0: - v1.i256 = call %read_selector__Evm_hef0af3106e109414__3af54274b2985741 0.i256; + v2.i256 = call %read_selector__Evm_hef0af3106e109414__3af54274b2985741 0.i256; jump block5; block1: @@ -39,7 +39,7 @@ func private %runtime__StorPtr_Evm___207f35a85ac4062e() { jump block2; block5: - br_table v1 block4 (305419896.i256 block1) (591751049.i256 block3); + br_table v2 block4 (305419896.i256 block1) (591751049.i256 block3); } func private %child_init__StorPtr_Evm___207f35a85ac4062e() { @@ -58,20 +58,24 @@ func private %child_runtime__StorPtr_Evm___207f35a85ac4062e() { func private %allocate__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) -> i256 { block0: - v4.i256 = mload 64.i256 i256; - v5.i1 = eq v4 0.i256; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; + v3.i256 = mload 64.i256 i256; + v5.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq v3 0.i256; + br v5 block1 block2; block1: jump block2; block2: - v9.i256 = phi (v4 block0) (96.i256 block1); - v11.i256 = add v9 v0; - mstore 64.i256 v11 i256; - return v9; + v7.i256 = phi (v3 block0) (96.i256 block1); + (v9.i256, v10.i1) = uaddo v7 v0; + br v10 block3 block4; + + block3: + evm_revert 0.i256 0.i256; + + block4: + mstore 64.i256 v9 i256; + return v7; } func private %balance__Evm_hef0af3106e109414__3af54274b2985741(v0.i256) { @@ -93,8 +97,14 @@ func private %read_selector__Evm_hef0af3106e109414__3af54274b2985741(v0.i256) -> func private %evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create2_raw_stor_arg0_root_stor(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256) -> i256 { block0: - v6.i256 = evm_create2 v1 v2 v3 v4; - return v6; + v5.i256 = evm_create2 v1 v2 v3 v4; + return v5; +} + +func private %u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; + return v2; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/comparison_ops.snap b/crates/codegen/tests/fixtures/sonatina_ir/comparison_ops.snap index cac3e10f9f..b0aa4e27dc 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/comparison_ops.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/comparison_ops.snap @@ -5,58 +5,82 @@ input_file: crates/codegen/tests/fixtures/comparison_ops.fe --- target = "evm-ethereum-osaka" -type @__fe_tuple_0 = {i256, i256, i256, i256, i256, i256}; +type @__fe_tuple_0 = {i1, i1, i1, i1, i1, i1}; func private %comparison_ops() -> i256 { block0: - v5.*i8 = evm_malloc 192.i256; - v6.i256 = ptr_to_int v5 i256; - v7.i1 = eq 1.i256 1.i256; - v8.i256 = zext v7 i256; - v9.i1 = ne v8 0.i256; - v10.i256 = zext v9 i256; - v11.*@__fe_tuple_0 = bitcast v5 *@__fe_tuple_0; - v12.*i256 = gep v11 0.i256 0.i256; - mstore v12 v10 i256; - v13.i1 = eq 1.i256 2.i256; - v14.i1 = is_zero v13; - v15.i256 = zext v14 i256; - v16.i1 = ne v15 0.i256; - v17.i256 = zext v16 i256; - v18.*@__fe_tuple_0 = bitcast v5 *@__fe_tuple_0; - v19.*i256 = gep v18 0.i256 1.i256; - mstore v19 v17 i256; - v20.i1 = lt 1.i256 2.i256; - v21.i256 = zext v20 i256; - v22.i1 = ne v21 0.i256; - v23.i256 = zext v22 i256; - v24.*@__fe_tuple_0 = bitcast v5 *@__fe_tuple_0; - v25.*i256 = gep v24 0.i256 2.i256; - mstore v25 v23 i256; - v26.i1 = gt 2.i256 2.i256; - v27.i1 = is_zero v26; - v28.i256 = zext v27 i256; - v29.i1 = ne v28 0.i256; - v30.i256 = zext v29 i256; - v31.*@__fe_tuple_0 = bitcast v5 *@__fe_tuple_0; - v32.*i256 = gep v31 0.i256 3.i256; - mstore v32 v30 i256; - v33.i1 = gt 3.i256 2.i256; - v34.i256 = zext v33 i256; - v35.i1 = ne v34 0.i256; - v36.i256 = zext v35 i256; - v37.*@__fe_tuple_0 = bitcast v5 *@__fe_tuple_0; - v39.*i256 = gep v37 0.i256 4.i256; - mstore v39 v36 i256; - v40.i1 = lt 3.i256 3.i256; - v41.i1 = is_zero v40; - v42.i256 = zext v41 i256; - v43.i1 = ne v42 0.i256; - v44.i256 = zext v43 i256; - v45.*@__fe_tuple_0 = bitcast v5 *@__fe_tuple_0; - v47.*i256 = gep v45 0.i256 5.i256; - mstore v47 v44 i256; - return v6; + v3.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq 1.i256 1.i256; + v4.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_ne 1.i256 2.i256; + v5.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt 1.i256 2.i256; + v6.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_le 2.i256 2.i256; + v7.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt 3.i256 2.i256; + v8.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_ge 3.i256 3.i256; + v10.*i8 = evm_malloc 192.i256; + v11.i256 = ptr_to_int v10 i256; + v12.i256 = zext v3 i256; + v13.*@__fe_tuple_0 = bitcast v10 *@__fe_tuple_0; + v15.*i1 = gep v13 0.i256 0.i256; + mstore v15 v12 i256; + v16.i256 = zext v4 i256; + v17.*@__fe_tuple_0 = bitcast v10 *@__fe_tuple_0; + v18.*i1 = gep v17 0.i256 1.i256; + mstore v18 v16 i256; + v19.i256 = zext v5 i256; + v20.*@__fe_tuple_0 = bitcast v10 *@__fe_tuple_0; + v21.*i1 = gep v20 0.i256 2.i256; + mstore v21 v19 i256; + v22.i256 = zext v6 i256; + v23.*@__fe_tuple_0 = bitcast v10 *@__fe_tuple_0; + v24.*i1 = gep v23 0.i256 3.i256; + mstore v24 v22 i256; + v25.i256 = zext v7 i256; + v26.*@__fe_tuple_0 = bitcast v10 *@__fe_tuple_0; + v28.*i1 = gep v26 0.i256 4.i256; + mstore v28 v25 i256; + v29.i256 = zext v8 i256; + v30.*@__fe_tuple_0 = bitcast v10 *@__fe_tuple_0; + v32.*i1 = gep v30 0.i256 5.i256; + mstore v32 v29 i256; + return v11; +} + +func private %u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; + return v2; +} + +func private %u256_h3271ca15373d4483_eq_he50383edd273619f_ne(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; + v3.i1 = is_zero v2; + return v3; +} + +func private %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = lt v0 v1; + return v2; +} + +func private %u256_h3271ca15373d4483_ord_h264f6d6d75097a_le(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = gt v0 v1; + v3.i1 = is_zero v2; + return v3; +} + +func private %u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = gt v0 v1; + return v2; +} + +func private %u256_h3271ca15373d4483_ord_h264f6d6d75097a_ge(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = lt v0 v1; + v3.i1 = is_zero v2; + return v3; } func private %__fe_sonatina_entry() { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/const_array.snap b/crates/codegen/tests/fixtures/sonatina_ir/const_array.snap index fd75867ce6..ed1477ce5b 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/const_array.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/const_array.snap @@ -9,13 +9,13 @@ global private const [i8; 96] $__fe_const_data_0 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0 func private %sum_two(v0.i256, v1.i256) -> i256 { block0: - v4.*i8 = evm_malloc 96.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = sym_addr $__fe_const_data_0; - v7.i256 = sym_size $__fe_const_data_0; - evm_code_copy v5 v6 v7; - v8.*[i256; 3] = bitcast v4 *[i256; 3]; - v9.*i256 = gep v8 0.i256 v0; + v3.*i8 = evm_malloc 96.i256; + v4.i256 = ptr_to_int v3 i256; + v5.i256 = sym_addr $__fe_const_data_0; + v6.i256 = sym_size $__fe_const_data_0; + evm_code_copy v4 v5 v6; + v7.*[i256; 3] = bitcast v3 *[i256; 3]; + v9.*i256 = gep v7 0.i256 v0; v10.i256 = mload v9 i256; v11.*i8 = evm_malloc 96.i256; v12.i256 = ptr_to_int v11 i256; @@ -25,18 +25,24 @@ func private %sum_two(v0.i256, v1.i256) -> i256 { v15.*[i256; 3] = bitcast v11 *[i256; 3]; v16.*i256 = gep v15 0.i256 v1; v17.i256 = mload v16 i256; - v18.*i8 = evm_malloc 96.i256; - v19.i256 = ptr_to_int v18 i256; - v20.i256 = sym_addr $__fe_const_data_0; - v21.i256 = sym_size $__fe_const_data_0; - evm_code_copy v19 v20 v21; - v22.*i8 = evm_malloc 96.i256; - v23.i256 = ptr_to_int v22 i256; - v24.i256 = sym_addr $__fe_const_data_0; - v25.i256 = sym_size $__fe_const_data_0; - evm_code_copy v23 v24 v25; - v26.i256 = add v10 v17; - return v26; + (v18.i256, v19.i1) = uaddo v10 v17; + br v19 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v20.*i8 = evm_malloc 96.i256; + v21.i256 = ptr_to_int v20 i256; + v22.i256 = sym_addr $__fe_const_data_0; + v23.i256 = sym_size $__fe_const_data_0; + evm_code_copy v21 v22 v23; + v24.*i8 = evm_malloc 96.i256; + v25.i256 = ptr_to_int v24 i256; + v26.i256 = sym_addr $__fe_const_data_0; + v27.i256 = sym_size $__fe_const_data_0; + evm_code_copy v25 v26 v27; + return v18; } func private %__fe_sonatina_entry() { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/const_array_add.snap b/crates/codegen/tests/fixtures/sonatina_ir/const_array_add.snap index 527583c529..8385d5dc93 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/const_array_add.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/const_array_add.snap @@ -9,15 +9,21 @@ global private const [i8; 96] $__fe_const_data_0 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0 func private %get_sum() -> i256 { block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v4.i256 = sym_addr $__fe_const_data_0; - v5.i256 = sym_size $__fe_const_data_0; - evm_code_copy v3 v4 v5; - v6.*[i256; 3] = bitcast v2 *[i256; 3]; - v7.*i256 = gep v6 0.i256 0.i256; + v1.*i8 = evm_malloc 96.i256; + v2.i256 = ptr_to_int v1 i256; + v3.i256 = sym_addr $__fe_const_data_0; + v4.i256 = sym_size $__fe_const_data_0; + evm_code_copy v2 v3 v4; + v5.*[i256; 3] = bitcast v1 *[i256; 3]; + v7.*i256 = gep v5 0.i256 0.i256; v8.i256 = mload v7 i256; - v10.i256 = add 1.i256 v8; + (v10.i256, v11.i1) = uaddo 1.i256 v8; + br v11 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: return v10; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/const_array_addmod.snap b/crates/codegen/tests/fixtures/sonatina_ir/const_array_addmod.snap index 1fdf55a171..6b17583bef 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/const_array_addmod.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/const_array_addmod.snap @@ -9,13 +9,13 @@ global private const [i8; 96] $__fe_const_data_0 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0 func private %get_sum() -> i256 { block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v4.i256 = sym_addr $__fe_const_data_0; - v5.i256 = sym_size $__fe_const_data_0; - evm_code_copy v3 v4 v5; - v6.*[i256; 3] = bitcast v2 *[i256; 3]; - v7.*i256 = gep v6 0.i256 0.i256; + v1.*i8 = evm_malloc 96.i256; + v2.i256 = ptr_to_int v1 i256; + v3.i256 = sym_addr $__fe_const_data_0; + v4.i256 = sym_size $__fe_const_data_0; + evm_code_copy v2 v3 v4; + v5.*[i256; 3] = bitcast v1 *[i256; 3]; + v7.*i256 = gep v5 0.i256 0.i256; v8.i256 = mload v7 i256; v11.i256 = evm_add_mod 1.i256 v8 100.i256; return v11; diff --git a/crates/codegen/tests/fixtures/sonatina_ir/const_array_branch.snap b/crates/codegen/tests/fixtures/sonatina_ir/const_array_branch.snap index d9a552abe5..6717772348 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/const_array_branch.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/const_array_branch.snap @@ -7,51 +7,50 @@ target = "evm-ethereum-osaka" global private const [i8; 32] $__fe_const_data_0 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]; -func private %const_array_branch(v0.i256) -> i256 { +func private %const_array_branch(v0.i1) -> i256 { block0: - v2.i1 = ne v0 0.i256; - br v2 block1 block2; + br v0 block1 block2; block1: - v4.*i8 = evm_malloc 32.i256; - v5.i256 = ptr_to_int v4 i256; - v6.i256 = sym_addr $__fe_const_data_0; - v7.i256 = sym_size $__fe_const_data_0; - evm_code_copy v5 v6 v7; - v8.*[i256; 1] = bitcast v4 *[i256; 1]; - v9.*i256 = gep v8 0.i256 0.i256; - v10.i256 = mload v9 i256; + v3.*i8 = evm_malloc 32.i256; + v4.i256 = ptr_to_int v3 i256; + v5.i256 = sym_addr $__fe_const_data_0; + v6.i256 = sym_size $__fe_const_data_0; + evm_code_copy v4 v5 v6; + v7.*[i256; 1] = bitcast v3 *[i256; 1]; + v8.*i256 = gep v7 0.i256 0.i256; + v9.i256 = mload v8 i256; jump block3; block2: - v11.*i8 = evm_malloc 32.i256; - v12.i256 = ptr_to_int v11 i256; - v13.i256 = sym_addr $__fe_const_data_0; - v14.i256 = sym_size $__fe_const_data_0; - evm_code_copy v12 v13 v14; - v15.*[i256; 1] = bitcast v11 *[i256; 1]; - v16.*i256 = gep v15 0.i256 0.i256; - v17.i256 = mload v16 i256; + v10.*i8 = evm_malloc 32.i256; + v11.i256 = ptr_to_int v10 i256; + v12.i256 = sym_addr $__fe_const_data_0; + v13.i256 = sym_size $__fe_const_data_0; + evm_code_copy v11 v12 v13; + v14.*[i256; 1] = bitcast v10 *[i256; 1]; + v15.*i256 = gep v14 0.i256 0.i256; + v16.i256 = mload v15 i256; jump block3; block3: - v26.i256 = phi (v10 block1) (v17 block2); - v18.*i8 = evm_malloc 32.i256; - v19.i256 = ptr_to_int v18 i256; - v20.i256 = sym_addr $__fe_const_data_0; - v21.i256 = sym_size $__fe_const_data_0; - evm_code_copy v19 v20 v21; - v22.*i8 = evm_malloc 32.i256; - v23.i256 = ptr_to_int v22 i256; - v24.i256 = sym_addr $__fe_const_data_0; - v25.i256 = sym_size $__fe_const_data_0; - evm_code_copy v23 v24 v25; - return v26; + v25.i256 = phi (v9 block1) (v16 block2); + v17.*i8 = evm_malloc 32.i256; + v18.i256 = ptr_to_int v17 i256; + v19.i256 = sym_addr $__fe_const_data_0; + v20.i256 = sym_size $__fe_const_data_0; + evm_code_copy v18 v19 v20; + v21.*i8 = evm_malloc 32.i256; + v22.i256 = ptr_to_int v21 i256; + v23.i256 = sym_addr $__fe_const_data_0; + v24.i256 = sym_size $__fe_const_data_0; + evm_code_copy v22 v23 v24; + return v25; } func private %__fe_sonatina_entry() { block0: - v1.i256 = call %const_array_branch 0.i256; + v1.i256 = call %const_array_branch 0.i1; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/const_fn_packed_config.snap b/crates/codegen/tests/fixtures/sonatina_ir/const_fn_packed_config.snap index 607090a90f..3ea6593f9f 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/const_fn_packed_config.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/const_fn_packed_config.snap @@ -1,74 +1,66 @@ --- source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 expression: output input_file: crates/codegen/tests/fixtures/const_fn_packed_config.fe --- target = "evm-ethereum-osaka" -type @__fe_tuple_0 = {i256, i256}; +type @__fe_tuple_0 = {i8, i16}; -func private %token_params(v0.i256) -> i256 { +func private %token_params(v0.i8) -> i256 { block0: jump block5; block1: v3.*i8 = evm_malloc 64.i256; v4.i256 = ptr_to_int v3 i256; - v6.i8 = trunc 18.i256 i8; - v7.i256 = zext v6 i256; - v8.*@__fe_tuple_0 = bitcast v3 *@__fe_tuple_0; - v9.*i256 = gep v8 0.i256 0.i256; - mstore v9 v7 i256; - v11.i16 = trunc 30.i256 i16; - v12.i256 = zext v11 i256; - v13.*@__fe_tuple_0 = bitcast v3 *@__fe_tuple_0; - v15.*i256 = gep v13 0.i256 1.i256; - mstore v15 v12 i256; + v6.i256 = zext 18.i8 i256; + v7.*@__fe_tuple_0 = bitcast v3 *@__fe_tuple_0; + v8.*i8 = gep v7 0.i256 0.i256; + mstore v8 v6 i256; + v10.i256 = zext 30.i16 i256; + v11.*@__fe_tuple_0 = bitcast v3 *@__fe_tuple_0; + v13.*i16 = gep v11 0.i256 1.i256; + mstore v13 v10 i256; jump block2; block2: - v16.i256 = phi (v4 block1) (v18 block3) (v30 block4); - return v16; + v14.i256 = phi (v4 block1) (v16 block3) (v26 block4); + return v14; block3: - v17.*i8 = evm_malloc 64.i256; - v18.i256 = ptr_to_int v17 i256; - v20.i8 = trunc 6.i256 i8; - v21.i256 = zext v20 i256; - v22.*@__fe_tuple_0 = bitcast v17 *@__fe_tuple_0; - v23.*i256 = gep v22 0.i256 0.i256; - mstore v23 v21 i256; - v25.i16 = trunc 5.i256 i16; - v26.i256 = zext v25 i256; - v27.*@__fe_tuple_0 = bitcast v17 *@__fe_tuple_0; - v28.*i256 = gep v27 0.i256 1.i256; - mstore v28 v26 i256; + v15.*i8 = evm_malloc 64.i256; + v16.i256 = ptr_to_int v15 i256; + v18.i256 = zext 6.i8 i256; + v19.*@__fe_tuple_0 = bitcast v15 *@__fe_tuple_0; + v20.*i8 = gep v19 0.i256 0.i256; + mstore v20 v18 i256; + v22.i256 = zext 5.i16 i256; + v23.*@__fe_tuple_0 = bitcast v15 *@__fe_tuple_0; + v24.*i16 = gep v23 0.i256 1.i256; + mstore v24 v22 i256; jump block2; block4: - v29.*i8 = evm_malloc 64.i256; - v30.i256 = ptr_to_int v29 i256; - v31.i8 = trunc 18.i256 i8; - v32.i256 = zext v31 i256; - v33.*@__fe_tuple_0 = bitcast v29 *@__fe_tuple_0; - v34.*i256 = gep v33 0.i256 0.i256; - mstore v34 v32 i256; - v35.i16 = trunc 0.i256 i16; - v36.i256 = zext v35 i256; - v37.*@__fe_tuple_0 = bitcast v29 *@__fe_tuple_0; - v38.*i256 = gep v37 0.i256 1.i256; - mstore v38 v36 i256; + v25.*i8 = evm_malloc 64.i256; + v26.i256 = ptr_to_int v25 i256; + v27.i256 = zext 18.i8 i256; + v28.*@__fe_tuple_0 = bitcast v25 *@__fe_tuple_0; + v29.*i8 = gep v28 0.i256 0.i256; + mstore v29 v27 i256; + v31.i256 = zext 0.i16 i256; + v32.*@__fe_tuple_0 = bitcast v25 *@__fe_tuple_0; + v33.*i16 = gep v32 0.i256 1.i256; + mstore v33 v31 i256; jump block2; block5: - br_table v0 block4 (0.i256 block1) (1.i256 block3); + br_table v0 block4 (0.i8 block1) (1.i8 block3); } -func private %pack_config(v0.i256, v1.i256, v2.i256) -> i256 { +func private %pack_config(v0.i8, v1.i1, v2.i16) -> i256 { block0: - v4.i1 = ne v1 0.i256; - br v4 block1 block2; + br v1 block1 block2; block1: jump block3; @@ -77,29 +69,29 @@ func private %pack_config(v0.i256, v1.i256, v2.i256) -> i256 { jump block3; block3: - v6.i256 = phi (1.i256 block1) (0.i256 block2); - v10.i256 = shl 24.i256 v6; - v12.i256 = shl 16.i256 v0; - v13.i256 = or v10 v12; - v14.i256 = or v13 v2; - return v14; + v5.i256 = phi (1.i256 block1) (0.i256 block2); + v7.i256 = zext v0 i256; + v9.i256 = zext v2 i256; + v11.i256 = shl 24.i256 v5; + v13.i256 = shl 16.i256 v7; + v14.i256 = or v11 v13; + v15.i256 = or v14 v9; + return v15; } -func private %packed_token_config(v0.i256, v1.i256) -> i256 { +func private %packed_token_config(v0.i8, v1.i1) -> i256 { block0: - v3.i256 = call %token_params v0; - v4.*@__fe_tuple_0 = int_to_ptr v3 *@__fe_tuple_0; - v5.*i256 = gep v4 0.i256 0.i256; + v2.i256 = call %token_params v0; + v3.*@__fe_tuple_0 = int_to_ptr v2 *@__fe_tuple_0; + v5.*i8 = gep v3 0.i256 0.i256; v6.i256 = mload v5 i256; v7.i8 = trunc v6 i8; - v8.i256 = zext v7 i256; - v9.*@__fe_tuple_0 = int_to_ptr v3 *@__fe_tuple_0; - v11.*i256 = gep v9 0.i256 1.i256; - v12.i256 = mload v11 i256; - v13.i16 = trunc v12 i16; - v14.i256 = zext v13 i256; - v15.i256 = call %pack_config v8 v1 v14; - return v15; + v8.*@__fe_tuple_0 = int_to_ptr v2 *@__fe_tuple_0; + v10.*i16 = gep v8 0.i256 1.i256; + v11.i256 = mload v10 i256; + v12.i16 = trunc v11 i16; + v13.i256 = call %pack_config v7 v1 v12; + return v13; } func private %main() -> i256 { @@ -109,7 +101,7 @@ func private %main() -> i256 { func private %__fe_sonatina_entry() { block0: - v1.i256 = call %token_params 0.i256; + v1.i256 = call %token_params 0.i8; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/const_nested_u8_array.snap b/crates/codegen/tests/fixtures/sonatina_ir/const_nested_u8_array.snap index a5b8206d72..f5aa8b56a1 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/const_nested_u8_array.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/const_nested_u8_array.snap @@ -7,31 +7,30 @@ target = "evm-ethereum-osaka" global private const [i8; 128] $__fe_const_data_0 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4]; -func private %const_nested_u8_array() -> i256 { +func private %const_nested_u8_array() -> i8 { block0: - v2.*i8 = evm_malloc 128.i256; - v3.i256 = ptr_to_int v2 i256; - v4.i256 = sym_addr $__fe_const_data_0; - v5.i256 = sym_size $__fe_const_data_0; - evm_code_copy v3 v4 v5; - v6.*[[i256; 2]; 2] = bitcast v2 *[[i256; 2]; 2]; - v8.*[i256; 2] = gep v6 0.i256 1.i256; + v1.*i8 = evm_malloc 128.i256; + v2.i256 = ptr_to_int v1 i256; + v3.i256 = sym_addr $__fe_const_data_0; + v4.i256 = sym_size $__fe_const_data_0; + evm_code_copy v2 v3 v4; + v5.*[[i8; 2]; 2] = bitcast v1 *[[i8; 2]; 2]; + v8.*[i8; 2] = gep v5 0.i256 1.i256; v9.i256 = ptr_to_int v8 i256; - v10.*i256 = gep v8 0.i256 0.i256; + v10.*i8 = gep v8 0.i256 0.i256; v11.i256 = mload v10 i256; v12.i8 = trunc v11 i8; - v13.i256 = zext v12 i256; - v14.*i8 = evm_malloc 128.i256; - v15.i256 = ptr_to_int v14 i256; - v16.i256 = sym_addr $__fe_const_data_0; - v17.i256 = sym_size $__fe_const_data_0; - evm_code_copy v15 v16 v17; - return v13; + v13.*i8 = evm_malloc 128.i256; + v14.i256 = ptr_to_int v13 i256; + v15.i256 = sym_addr $__fe_const_data_0; + v16.i256 = sym_size $__fe_const_data_0; + evm_code_copy v14 v15 v16; + return v12; } func private %__fe_sonatina_entry() { block0: - v0.i256 = call %const_nested_u8_array; + v0.i8 = call %const_nested_u8_array; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/contract_dispatch.snap b/crates/codegen/tests/fixtures/sonatina_ir/contract_dispatch.snap index 9d959e5c6d..b6edd3619f 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/contract_dispatch.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/contract_dispatch.snap @@ -5,14 +5,14 @@ input_file: crates/codegen/tests/fixtures/contract_dispatch.fe --- target = "evm-ethereum-osaka" -func private %emit_code() -> i256 { +func private %emit_code() -> i64 { block0: - return 1.i256; + return 1.i64; } func private %dispatch() { block0: - v0.i256 = call %emit_code; + v0.i64 = call %emit_code; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/create_contract.snap b/crates/codegen/tests/fixtures/sonatina_ir/create_contract.snap index 94d6e3d6f4..1417173efd 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/create_contract.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/create_contract.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 expression: output input_file: crates/codegen/tests/fixtures/create_contract.fe --- @@ -20,56 +19,54 @@ type @__fe_SolDecoder_9 = {@__fe_Cursor_8, i256}; func private %__Child_init_contract(v0.i256, v1.i256, v2.i256) { block0: evm_sstore v2 v0; - v5.i256 = add v2 1.i256; - evm_sstore v5 v1; + v4.i256 = add v2 1.i256; + evm_sstore v4 v1; return; } func private %__Child_init() { block0: - v1.i256 = call %init_field__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785 0.i256 0.i256; - v2.i256 = sym_addr &__Child_runtime; - v3.i256 = sym_size &__Child_runtime; - v4.i256 = sym_size .; - v5.i256 = evm_code_size; - v6.i1 = lt v5 v4; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block1 block2; + v2.i256 = call %init_field__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785 0.i256 0.i256; + v3.i256 = sym_addr &__Child_runtime; + v4.i256 = sym_size &__Child_runtime; + v5.i256 = sym_size .; + v6.i256 = evm_code_size; + v7.i1 = lt v6 v5; + br v7 block1 block2; block1: call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; evm_invalid; block2: - v11.i256 = sub v5 v4; - v12.i256 = sub v5 v4; + v11.i256 = sub v6 v5; + v12.i256 = sub v6 v5; v13.*i8 = evm_malloc v12; v14.i256 = ptr_to_int v13 i256; - v15.i256 = sub v5 v4; - evm_code_copy v14 v4 v15; + v15.i256 = sub v6 v5; + evm_code_copy v14 v5 v15; v17.*i8 = evm_malloc 64.i256; v18.i256 = ptr_to_int v17 i256; v19.*@__fe_MemoryBytes_0 = bitcast v17 *@__fe_MemoryBytes_0; v20.*i256 = gep v19 0.i256 0.i256; mstore v20 v14 i256; - v21.i256 = sub v5 v4; + v21.i256 = sub v6 v5; v22.*@__fe_MemoryBytes_0 = bitcast v17 *@__fe_MemoryBytes_0; v24.*i256 = gep v22 0.i256 1.i256; mstore v24 v21 i256; v25.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v18; v26.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v25; v27.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v25; - call %__Child_init_contract v26 v27 v1; - evm_code_copy 0.i256 v2 v3; - evm_return 0.i256 v3; + call %__Child_init_contract v26 v27 v2; + evm_code_copy 0.i256 v3 v4; + evm_return 0.i256 v4; } func private %__Child_runtime() { block0: - v1.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140 0.i256 0.i256; - v2.i256 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v3.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; + v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140 0.i256 0.i256; + v4.i32 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; + v6.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; jump block1; block1: @@ -79,8 +76,8 @@ func private %__Child_runtime() { func private %__Factory_recv_0_0(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_Deploy_1 = int_to_ptr v0 *@__fe_Deploy_1; - v4.*i256 = gep v3 0.i256 0.i256; + v2.*@__fe_Deploy_1 = int_to_ptr v0 *@__fe_Deploy_1; + v4.*i256 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; v6.*@__fe_Deploy_1 = int_to_ptr v0 *@__fe_Deploy_1; v8.*i256 = gep v6 0.i256 1.i256; @@ -99,8 +96,8 @@ func private %__Factory_recv_0_0(v0.i256, v1.i256) -> i256 { func private %__Factory_recv_0_1(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_Deploy2_3 = int_to_ptr v0 *@__fe_Deploy2_3; - v4.*i256 = gep v3 0.i256 0.i256; + v2.*@__fe_Deploy2_3 = int_to_ptr v0 *@__fe_Deploy2_3; + v4.*i256 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; v6.*@__fe_Deploy2_3 = int_to_ptr v0 *@__fe_Deploy2_3; v8.*i256 = gep v6 0.i256 1.i256; @@ -130,31 +127,31 @@ func private %__Factory_init() { func private %__Factory_runtime() { block0: - v1.i256 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v2.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - br_table v1 block1 (1.i256 block2) (2.i256 block3); + v2.i32 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; + v4.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; + br_table v2 block1 (1.i32 block2) (2.i32 block3); block1: call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; evm_invalid; block2: - v6.i256 = call %deploy_h5c6b1804553edb1_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v2; - v7.i256 = call %__Factory_recv_0_0 v6 0.i256; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_Address_h257056268eac7027__2d9a2ca106cd007c 0.i256 v7; + v9.i256 = call %deploy_h5c6b1804553edb1_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v4; + v10.i256 = call %__Factory_recv_0_0 v9 0.i256; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_Address_h257056268eac7027__2d9a2ca106cd007c 0.i256 v10; evm_invalid; block3: - v9.i256 = call %deploy2_ha2b981aa2f8bf9fd_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v2; - v10.i256 = call %__Factory_recv_0_1 v9 0.i256; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_Address_h257056268eac7027__2d9a2ca106cd007c 0.i256 v10; + v13.i256 = call %deploy2_ha2b981aa2f8bf9fd_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v4; + v14.i256 = call %__Factory_recv_0_1 v13 0.i256; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_Address_h257056268eac7027__2d9a2ca106cd007c 0.i256 v14; evm_invalid; } func private %init_field__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140 v0 v1; - return v3; + v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140 v0 v1; + return v2; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(v0.i256) { @@ -164,151 +161,169 @@ func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(v0.i256 func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; + v1.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; + return v1; } func private %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6(v0.i256) -> i256 { block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; + v1.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; + return v1; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Pair_h956dff41e88ee341__acec41afdc898140(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %stor_ptr__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785 0.i256 v1; - return v3; + v4.i256 = call %stor_ptr__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785 0.i256 v1; + return v4; } -func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { +func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i32 { block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; - v3.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v2; - v5.i1 = lt v3 4.i256; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; + v1.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; + v2.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v1; + v4.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt v2 4.i256; + br v4 block1 block2; block1: call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort v0; evm_invalid; block2: - v10.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v2 0.i256; - v11.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v10; - return v11; + v8.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v1 0.i256; + v9.i32 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v8; + return v9; } func private %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; - v4.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 4.i256; - return v4; + v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; + v5.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 4.i256; + return v5; } func private %create_stor_arg0_root_stor__Evm_hef0af3106e109414_Child_hdfa2e9d62e9c9ad3__8303e18f50f8d8ed(v0.i256, v1.i256, v2.i256) -> i256 { block0: - v4.i256 = call %__Child_init_code_len; - v5.i256 = call %__Child_init_code_offset; - v7.i256 = add v4 64.i256; - v8.*i8 = evm_malloc v7; - v9.i256 = ptr_to_int v8 i256; - evm_code_copy v9 v5 v4; - v10.i256 = add v9 v4; - v12.*i8 = evm_malloc 96.i256; - v13.i256 = ptr_to_int v12 i256; - v14.*@__fe_SolEncoder_4 = bitcast v12 *@__fe_SolEncoder_4; - v15.*i256 = gep v14 0.i256 0.i256; - mstore v15 v10 i256; - v16.*@__fe_SolEncoder_4 = bitcast v12 *@__fe_SolEncoder_4; - v18.*i256 = gep v16 0.i256 1.i256; - mstore v18 v10 i256; - v19.i256 = add v10 64.i256; - v20.*@__fe_SolEncoder_4 = bitcast v12 *@__fe_SolEncoder_4; - v22.*i256 = gep v20 0.i256 2.i256; - mstore v22 v19 i256; - call %_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64 v2 v13; - v23.i256 = call %evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create_raw_stor_arg0_root_stor v0 v1 v9 v7; - v24.i1 = eq v23 0.i256; - v25.i256 = zext v24 i256; - v26.i1 = ne v25 0.i256; - br v26 block1 block2; + v3.i256 = call %__Child_init_code_len; + v4.i256 = call %__Child_init_code_offset; + (v6.i256, v7.i1) = uaddo v3 64.i256; + br v7 block3 block4; block1: - v27.i256 = evm_return_data_size; - v28.*i8 = evm_malloc v27; - v29.i256 = ptr_to_int v28 i256; - evm_return_data_copy v29 0.i256 v27; - evm_revert v29 v27; + v37.i256 = evm_return_data_size; + v38.*i8 = evm_malloc v37; + v39.i256 = ptr_to_int v38 i256; + evm_return_data_copy v39 0.i256 v37; + evm_revert v39 v37; block2: - return v23; + return v35; + + block3: + evm_revert 0.i256 0.i256; + + block4: + v9.*i8 = evm_malloc v6; + v10.i256 = ptr_to_int v9 i256; + evm_code_copy v10 v4 v3; + (v13.i256, v14.i1) = uaddo v10 v3; + br v14 block3 block5; + + block5: + (v16.i256, v17.i1) = uaddo v13 64.i256; + br v17 block3 block6; + + block6: + v19.*i8 = evm_malloc 96.i256; + v20.i256 = ptr_to_int v19 i256; + v22.*@__fe_SolEncoder_4 = bitcast v19 *@__fe_SolEncoder_4; + v23.*i256 = gep v22 0.i256 0.i256; + mstore v23 v13 i256; + v24.*@__fe_SolEncoder_4 = bitcast v19 *@__fe_SolEncoder_4; + v26.*i256 = gep v24 0.i256 1.i256; + mstore v26 v13 i256; + v27.*@__fe_SolEncoder_4 = bitcast v19 *@__fe_SolEncoder_4; + v29.*i256 = gep v27 0.i256 2.i256; + mstore v29 v16 i256; + call %_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64 v2 v20; + v35.i256 = call %evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create_raw_stor_arg0_root_stor v0 v1 v10 v6; + v36.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq v35 0.i256; + br v36 block1 block2; } func private %create2_stor_arg0_root_stor__Evm_hef0af3106e109414_Child_hdfa2e9d62e9c9ad3__8303e18f50f8d8ed(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { block0: - v5.i256 = call %__Child_init_code_len; - v6.i256 = call %__Child_init_code_offset; - v8.i256 = add v5 64.i256; - v9.*i8 = evm_malloc v8; - v10.i256 = ptr_to_int v9 i256; - evm_code_copy v10 v6 v5; - v11.i256 = add v10 v5; - v13.*i8 = evm_malloc 96.i256; - v14.i256 = ptr_to_int v13 i256; - v15.*@__fe_SolEncoder_4 = bitcast v13 *@__fe_SolEncoder_4; - v16.*i256 = gep v15 0.i256 0.i256; - mstore v16 v11 i256; - v17.*@__fe_SolEncoder_4 = bitcast v13 *@__fe_SolEncoder_4; - v19.*i256 = gep v17 0.i256 1.i256; - mstore v19 v11 i256; - v20.i256 = add v11 64.i256; - v21.*@__fe_SolEncoder_4 = bitcast v13 *@__fe_SolEncoder_4; - v23.*i256 = gep v21 0.i256 2.i256; - mstore v23 v20 i256; - call %_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64 v2 v14; - v24.i256 = call %evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create2_raw_stor_arg0_root_stor v0 v1 v10 v8 v3; - v25.i1 = eq v24 0.i256; - v26.i256 = zext v25 i256; - v27.i1 = ne v26 0.i256; - br v27 block1 block2; + v4.i256 = call %__Child_init_code_len; + v5.i256 = call %__Child_init_code_offset; + (v7.i256, v8.i1) = uaddo v4 64.i256; + br v8 block3 block4; block1: - v28.i256 = evm_return_data_size; - v29.*i8 = evm_malloc v28; - v30.i256 = ptr_to_int v29 i256; - evm_return_data_copy v30 0.i256 v28; - evm_revert v30 v28; + v39.i256 = evm_return_data_size; + v40.*i8 = evm_malloc v39; + v41.i256 = ptr_to_int v40 i256; + evm_return_data_copy v41 0.i256 v39; + evm_revert v41 v39; block2: - return v24; + return v37; + + block3: + evm_revert 0.i256 0.i256; + + block4: + v10.*i8 = evm_malloc v7; + v11.i256 = ptr_to_int v10 i256; + evm_code_copy v11 v5 v4; + (v14.i256, v15.i1) = uaddo v11 v4; + br v15 block3 block5; + + block5: + (v17.i256, v18.i1) = uaddo v14 64.i256; + br v18 block3 block6; + + block6: + v20.*i8 = evm_malloc 96.i256; + v21.i256 = ptr_to_int v20 i256; + v23.*@__fe_SolEncoder_4 = bitcast v20 *@__fe_SolEncoder_4; + v24.*i256 = gep v23 0.i256 0.i256; + mstore v24 v14 i256; + v25.*@__fe_SolEncoder_4 = bitcast v20 *@__fe_SolEncoder_4; + v27.*i256 = gep v25 0.i256 1.i256; + mstore v27 v14 i256; + v28.*@__fe_SolEncoder_4 = bitcast v20 *@__fe_SolEncoder_4; + v30.*i256 = gep v28 0.i256 2.i256; + mstore v30 v17 i256; + call %_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64 v2 v21; + v37.i256 = call %evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create2_raw_stor_arg0_root_stor v0 v1 v11 v7 v3; + v38.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq v37 0.i256; + br v38 block1 block2; } func private %deploy_h5c6b1804553edb1_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { block0: + v1.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; v2.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v3.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_Deploy_1 = bitcast v5 *@__fe_Deploy_1; - v8.*i256 = gep v7 0.i256 0.i256; - mstore v8 v2 i256; - v9.*@__fe_Deploy_1 = bitcast v5 *@__fe_Deploy_1; + v4.*i8 = evm_malloc 64.i256; + v5.i256 = ptr_to_int v4 i256; + v6.*@__fe_Deploy_1 = bitcast v4 *@__fe_Deploy_1; + v8.*i256 = gep v6 0.i256 0.i256; + mstore v8 v1 i256; + v9.*@__fe_Deploy_1 = bitcast v4 *@__fe_Deploy_1; v11.*i256 = gep v9 0.i256 1.i256; - mstore v11 v3 i256; - return v6; + mstore v11 v2 i256; + return v5; } func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_Address_h257056268eac7027__2d9a2ca106cd007c(v0.i256, v1.i256) { block0: - v3.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - call %address_h257056268eac7027_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v3; - v6.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v7.*@__fe_tuple_2 = int_to_ptr v6 *@__fe_tuple_2; - v8.*i256 = gep v7 0.i256 0.i256; + v2.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; + v4.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v2 32.i256; + call %address_h257056268eac7027_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v2; + v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v2; + v6.*@__fe_tuple_2 = int_to_ptr v5 *@__fe_tuple_2; + v8.*i256 = gep v6 0.i256 0.i256; v9.i256 = mload v8 i256; - v10.*@__fe_tuple_2 = int_to_ptr v6 *@__fe_tuple_2; + v10.*@__fe_tuple_2 = int_to_ptr v5 *@__fe_tuple_2; v12.*i256 = gep v10 0.i256 1.i256; v13.i256 = mload v12 i256; call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes 0.i256 v9 v13; @@ -317,56 +332,56 @@ func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_Address_ func private %deploy2_ha2b981aa2f8bf9fd_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { block0: + v1.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; v2.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; v3.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v4.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_Deploy2_3 = bitcast v6 *@__fe_Deploy2_3; - v9.*i256 = gep v8 0.i256 0.i256; - mstore v9 v2 i256; - v10.*@__fe_Deploy2_3 = bitcast v6 *@__fe_Deploy2_3; + v5.*i8 = evm_malloc 96.i256; + v6.i256 = ptr_to_int v5 i256; + v7.*@__fe_Deploy2_3 = bitcast v5 *@__fe_Deploy2_3; + v9.*i256 = gep v7 0.i256 0.i256; + mstore v9 v1 i256; + v10.*@__fe_Deploy2_3 = bitcast v5 *@__fe_Deploy2_3; v12.*i256 = gep v10 0.i256 1.i256; - mstore v12 v3 i256; - v13.*@__fe_Deploy2_3 = bitcast v6 *@__fe_Deploy2_3; + mstore v12 v2 i256; + v13.*@__fe_Deploy2_3 = bitcast v5 *@__fe_Deploy2_3; v15.*i256 = gep v13 0.i256 2.i256; - mstore v15 v4 i256; - return v7; + mstore v15 v3 i256; + return v6; } func private %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v2.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - v4.*i8 = evm_malloc 128.i256; - v5.i256 = ptr_to_int v4 i256; - v6.*@__fe_Cursor_5 = int_to_ptr v2 *@__fe_Cursor_5; - v7.*i256 = gep v6 0.i256 0.i256 0.i256; + v1.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; + v3.*i8 = evm_malloc 128.i256; + v4.i256 = ptr_to_int v3 i256; + v5.*@__fe_Cursor_5 = int_to_ptr v1 *@__fe_Cursor_5; + v7.*i256 = gep v5 0.i256 0.i256 0.i256; v8.i256 = mload v7 i256; - v9.*@__fe_SolDecoder_6 = bitcast v4 *@__fe_SolDecoder_6; + v9.*@__fe_SolDecoder_6 = bitcast v3 *@__fe_SolDecoder_6; v10.*i256 = gep v9 0.i256 0.i256 0.i256 0.i256; mstore v10 v8 i256; - v11.*@__fe_Cursor_5 = int_to_ptr v2 *@__fe_Cursor_5; + v11.*@__fe_Cursor_5 = int_to_ptr v1 *@__fe_Cursor_5; v13.*i256 = gep v11 0.i256 0.i256 1.i256; v14.i256 = mload v13 i256; - v15.*@__fe_SolDecoder_6 = bitcast v4 *@__fe_SolDecoder_6; + v15.*@__fe_SolDecoder_6 = bitcast v3 *@__fe_SolDecoder_6; v16.*i256 = gep v15 0.i256 0.i256 0.i256 1.i256; mstore v16 v14 i256; - v17.*@__fe_Cursor_5 = int_to_ptr v2 *@__fe_Cursor_5; + v17.*@__fe_Cursor_5 = int_to_ptr v1 *@__fe_Cursor_5; v18.*i256 = gep v17 0.i256 1.i256; v19.i256 = mload v18 i256; - v20.*@__fe_SolDecoder_6 = bitcast v4 *@__fe_SolDecoder_6; + v20.*@__fe_SolDecoder_6 = bitcast v3 *@__fe_SolDecoder_6; v21.*i256 = gep v20 0.i256 0.i256 1.i256; mstore v21 v19 i256; - v22.*@__fe_SolDecoder_6 = bitcast v4 *@__fe_SolDecoder_6; + v22.*@__fe_SolDecoder_6 = bitcast v3 *@__fe_SolDecoder_6; v23.*i256 = gep v22 0.i256 1.i256; mstore v23 0.i256 i256; - return v5; + return v4; } func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v2.*@__fe_SolDecoder_6 = int_to_ptr v0 *@__fe_SolDecoder_6; - v3.*@__fe_Cursor_5 = gep v2 0.i256 0.i256; + v1.*@__fe_SolDecoder_6 = int_to_ptr v0 *@__fe_SolDecoder_6; + v3.*@__fe_Cursor_5 = gep v1 0.i256 0.i256; v4.i256 = ptr_to_int v3 i256; v5.*@__fe_MemoryBytes_0 = gep v3 0.i256 0.i256; v6.i256 = ptr_to_int v5 i256; @@ -376,16 +391,8 @@ func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_ v10.i256 = ptr_to_int v9 i256; v12.*i256 = gep v9 0.i256 1.i256; v13.i256 = mload v12 i256; - v15.i256 = add v13 32.i256; - v16.*@__fe_SolDecoder_6 = int_to_ptr v0 *@__fe_SolDecoder_6; - v17.*@__fe_Cursor_5 = gep v16 0.i256 0.i256; - v18.i256 = ptr_to_int v17 i256; - v19.*i256 = gep v17 0.i256 1.i256; - v20.i256 = mload v19 i256; - v21.i1 = lt v15 v20; - v22.i256 = zext v21 i256; - v23.i1 = ne v22 0.i256; - br v23 block1 block3; + (v15.i256, v16.i1) = uaddo v13 32.i256; + br v16 block4 block5; block1: evm_revert 0.i256 0.i256; @@ -410,16 +417,26 @@ func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_ return v35; block3: - v43.i1 = gt v15 v7; - v44.i256 = zext v43 i256; - v45.i1 = ne v44 0.i256; - br v45 block1 block2; + v43.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt v15 v7; + br v43 block1 block2; + + block4: + evm_revert 0.i256 0.i256; + + block5: + v18.*@__fe_SolDecoder_6 = int_to_ptr v0 *@__fe_SolDecoder_6; + v19.*@__fe_Cursor_5 = gep v18 0.i256 0.i256; + v20.i256 = ptr_to_int v19 i256; + v21.*i256 = gep v19 0.i256 1.i256; + v22.i256 = mload v21 i256; + v23.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt v15 v22; + br v23 block1 block3; } func private %stor_ptr__Evm_hef0af3106e109414_Pair_h956dff41e88ee341__18f2eb617f185785(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Pair_h956dff41e88ee341__acec41afdc898140 v1; - return v3; + v2.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Pair_h956dff41e88ee341__acec41afdc898140 v1; + return v2; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256) -> i256 { @@ -429,48 +446,65 @@ func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256 func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { block0: - v2.i256 = evm_calldata_size; - v3.i256 = sub v2 v0; - return v3; + v1.i256 = evm_calldata_size; + (v2.i256, v3.i1) = usubo v1 v0; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; +} + +func private %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = lt v0 v1; + return v2; } func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = add v0 v1; - v4.i256 = add v0 v1; - v5.i256 = evm_calldata_load v4; + (v2.i256, v3.i1) = uaddo v0 v1; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v5.i256 = evm_calldata_load v2; return v5; } -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i256 { +func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i32 { block0: - v3.i256 = shr 224.i256 v0; - v4.i256 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v3; - return v4; + v2.i256 = shr 224.i256 v0; + v3.i32 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v2; + return v3; } func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; - return v3; + v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; + return v2; } func private %__Child_init_code_len() -> i256 { block0: - v1.i256 = sym_size &__Child_init; - return v1; + v0.i256 = sym_size &__Child_init; + return v0; } func private %__Child_init_code_offset() -> i256 { block0: - v1.i256 = sym_addr &__Child_init; - return v1; + v0.i256 = sym_addr &__Child_init; + return v0; } func private %_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64(v0.i256, v1.i256) { block0: - v3.*@__fe_tuple_2 = int_to_ptr v0 *@__fe_tuple_2; - v4.*i256 = gep v3 0.i256 0.i256; + v2.*@__fe_tuple_2 = int_to_ptr v0 *@__fe_tuple_2; + v4.*i256 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v5 v1; v6.*@__fe_tuple_2 = int_to_ptr v0 *@__fe_tuple_2; @@ -482,58 +516,68 @@ func private %_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd func private %evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create_raw_stor_arg0_root_stor(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { block0: - v5.i256 = evm_create v1 v2 v3; - return v5; + v4.i256 = evm_create v1 v2 v3; + return v4; +} + +func private %u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; + return v2; } func private %evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create2_raw_stor_arg0_root_stor(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256) -> i256 { block0: - v6.i256 = evm_create2 v1 v2 v3 v4; - return v6; + v5.i256 = evm_create2 v1 v2 v3 v4; + return v5; } func private %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98(v0.i256) -> i256 { block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - return v2; + v1.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; + return v1; } func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() -> i256 { block0: - v1.i256 = call %solencoder_h1b9228b90dad6928_new; - return v1; + v0.i256 = call %solencoder_h1b9228b90dad6928_new; + return v0; } func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v4.*i256 = gep v3 0.i256 0.i256; + v2.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v4.*i256 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; - v6.i1 = eq v5 0.i256; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block1 block2; + v6.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq v5 0.i256; + br v6 block1 block2; block1: - v10.*i8 = evm_malloc v1; - v11.i256 = ptr_to_int v10 i256; + v8.*i8 = evm_malloc v1; + v9.i256 = ptr_to_int v8 i256; + v11.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v12.*i256 = gep v11 0.i256 0.i256; + mstore v12 v9 i256; v13.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v14.*i256 = gep v13 0.i256 0.i256; - mstore v14 v11 i256; - v15.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v17.*i256 = gep v15 0.i256 1.i256; - mstore v17 v11 i256; - v18.i256 = add v11 v1; - v19.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v21.*i256 = gep v19 0.i256 2.i256; - mstore v21 v18 i256; - jump block2; + v15.*i256 = gep v13 0.i256 1.i256; + mstore v15 v9 i256; + (v16.i256, v17.i1) = uaddo v9 v1; + br v17 block3 block4; block2: v23.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; v24.*i256 = gep v23 0.i256 0.i256; v25.i256 = mload v24 i256; return v25; + + block3: + evm_revert 0.i256 0.i256; + + block4: + v19.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v21.*i256 = gep v19 0.i256 2.i256; + mstore v21 v16 i256; + jump block2; } func private %address_h257056268eac7027_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { @@ -544,22 +588,28 @@ func private %address_h257056268eac7027_encode_hab7243eccf2714fb_encode__Sol_hfd func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0.i256) -> i256 { block0: - v2.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v3.*i256 = gep v2 0.i256 0.i256; + v1.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v3.*i256 = gep v1 0.i256 0.i256; v4.i256 = mload v3 i256; v5.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; v7.*i256 = gep v5 0.i256 2.i256; v8.i256 = mload v7 i256; - v10.*i8 = evm_malloc 64.i256; - v11.i256 = ptr_to_int v10 i256; - v12.*@__fe_tuple_2 = bitcast v10 *@__fe_tuple_2; - v13.*i256 = gep v12 0.i256 0.i256; - mstore v13 v4 i256; - v14.i256 = sub v8 v4; - v15.*@__fe_tuple_2 = bitcast v10 *@__fe_tuple_2; - v17.*i256 = gep v15 0.i256 1.i256; - mstore v17 v14 i256; - return v11; + (v9.i256, v10.i1) = usubo v8 v4; + br v10 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v12.*i8 = evm_malloc 64.i256; + v13.i256 = ptr_to_int v12 i256; + v15.*@__fe_tuple_2 = bitcast v12 *@__fe_tuple_2; + v16.*i256 = gep v15 0.i256 0.i256; + mstore v16 v4 i256; + v17.*@__fe_tuple_2 = bitcast v12 *@__fe_tuple_2; + v19.*i256 = gep v17 0.i256 1.i256; + mstore v19 v9 i256; + return v13; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(v0.i256, v1.i256, v2.i256) { @@ -569,79 +619,90 @@ func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes( func private %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v3.*i8 = evm_malloc 96.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v6.*i256 = gep v5 0.i256 0.i256; + v2.*i8 = evm_malloc 96.i256; + v3.i256 = ptr_to_int v2 i256; + v4.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; + v6.*i256 = gep v4 0.i256 0.i256; v7.i256 = mload v6 i256; - v8.*@__fe_Cursor_5 = bitcast v3 *@__fe_Cursor_5; + v8.*@__fe_Cursor_5 = bitcast v2 *@__fe_Cursor_5; v9.*i256 = gep v8 0.i256 0.i256 0.i256; mstore v9 v7 i256; v10.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; v12.*i256 = gep v10 0.i256 1.i256; v13.i256 = mload v12 i256; - v14.*@__fe_Cursor_5 = bitcast v3 *@__fe_Cursor_5; + v14.*@__fe_Cursor_5 = bitcast v2 *@__fe_Cursor_5; v15.*i256 = gep v14 0.i256 0.i256 1.i256; mstore v15 v13 i256; - v16.*@__fe_Cursor_5 = bitcast v3 *@__fe_Cursor_5; + v16.*@__fe_Cursor_5 = bitcast v2 *@__fe_Cursor_5; v17.*i256 = gep v16 0.i256 1.i256; mstore v17 0.i256 i256; - return v4; + return v3; } func private %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { block0: - v2.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v4.*i256 = gep v2 0.i256 1.i256; + v1.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; + v4.*i256 = gep v1 0.i256 1.i256; v5.i256 = mload v4 i256; return v5; } func private %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v4.*i256 = gep v3 0.i256 0.i256; + v2.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; + v4.*i256 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; - v6.i256 = add v5 v1; - v7.i256 = add v5 v1; - v8.i256 = mload v7 i256; + (v6.i256, v7.i1) = uaddo v5 v1; + br v7 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v8.i256 = mload v6 i256; return v8; } +func private %u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = gt v0 v1; + return v2; +} + func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Pair_h956dff41e88ee341__acec41afdc898140(v0.i256) -> i256 { block0: return v0; } -func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i256 { +func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i32 { block0: - v2.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; - v3.i256 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v2; - return v3; + v1.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; + v2.i32 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v1; + return v2; } func private %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - v4.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 v1; - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_Cursor_8 = int_to_ptr v4 *@__fe_Cursor_8; - v9.*i256 = gep v8 0.i256 0.i256 0.i256; + v2.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; + v3.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 v1; + v5.*i8 = evm_malloc 96.i256; + v6.i256 = ptr_to_int v5 i256; + v7.*@__fe_Cursor_8 = int_to_ptr v3 *@__fe_Cursor_8; + v9.*i256 = gep v7 0.i256 0.i256 0.i256; v10.i256 = mload v9 i256; - v11.*@__fe_SolDecoder_9 = bitcast v6 *@__fe_SolDecoder_9; + v11.*@__fe_SolDecoder_9 = bitcast v5 *@__fe_SolDecoder_9; v12.*i256 = gep v11 0.i256 0.i256 0.i256 0.i256; mstore v12 v10 i256; - v13.*@__fe_Cursor_8 = int_to_ptr v4 *@__fe_Cursor_8; + v13.*@__fe_Cursor_8 = int_to_ptr v3 *@__fe_Cursor_8; v15.*i256 = gep v13 0.i256 1.i256; v16.i256 = mload v15 i256; - v17.*@__fe_SolDecoder_9 = bitcast v6 *@__fe_SolDecoder_9; + v17.*@__fe_SolDecoder_9 = bitcast v5 *@__fe_SolDecoder_9; v18.*i256 = gep v17 0.i256 0.i256 1.i256; mstore v18 v16 i256; - v19.*@__fe_SolDecoder_9 = bitcast v6 *@__fe_SolDecoder_9; + v19.*@__fe_SolDecoder_9 = bitcast v5 *@__fe_SolDecoder_9; v20.*i256 = gep v19 0.i256 1.i256; mstore v20 v1 i256; - return v7; + return v6; } func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { @@ -652,8 +713,8 @@ func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482 func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256) -> i256 { block0: - v2.*@__fe_SolDecoder_9 = int_to_ptr v0 *@__fe_SolDecoder_9; - v3.*@__fe_Cursor_8 = gep v2 0.i256 0.i256; + v1.*@__fe_SolDecoder_9 = int_to_ptr v0 *@__fe_SolDecoder_9; + v3.*@__fe_Cursor_8 = gep v1 0.i256 0.i256; v4.i256 = ptr_to_int v3 i256; v5.*@__fe_CallData_7 = gep v3 0.i256 0.i256; v6.i256 = mload v5 i256; @@ -663,16 +724,8 @@ func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_ v10.i256 = ptr_to_int v9 i256; v12.*i256 = gep v9 0.i256 1.i256; v13.i256 = mload v12 i256; - v15.i256 = add v13 32.i256; - v16.*@__fe_SolDecoder_9 = int_to_ptr v0 *@__fe_SolDecoder_9; - v17.*@__fe_Cursor_8 = gep v16 0.i256 0.i256; - v18.i256 = ptr_to_int v17 i256; - v19.*i256 = gep v17 0.i256 1.i256; - v20.i256 = mload v19 i256; - v21.i1 = lt v15 v20; - v22.i256 = zext v21 i256; - v23.i1 = ne v22 0.i256; - br v23 block1 block3; + (v15.i256, v16.i1) = uaddo v13 32.i256; + br v16 block4 block5; block1: evm_revert 0.i256 0.i256; @@ -697,38 +750,54 @@ func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_ return v35; block3: - v43.i1 = gt v15 v7; - v44.i256 = zext v43 i256; - v45.i1 = ne v44 0.i256; - br v45 block1 block2; + v43.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt v15 v7; + br v43 block1 block2; + + block4: + evm_revert 0.i256 0.i256; + + block5: + v18.*@__fe_SolDecoder_9 = int_to_ptr v0 *@__fe_SolDecoder_9; + v19.*@__fe_Cursor_8 = gep v18 0.i256 0.i256; + v20.i256 = ptr_to_int v19 i256; + v21.*i256 = gep v19 0.i256 1.i256; + v22.i256 = mload v21 i256; + v23.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt v15 v22; + br v23 block1 block3; } func private %solencoder_h1b9228b90dad6928_new() -> i256 { block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v4.*@__fe_SolEncoder_4 = bitcast v2 *@__fe_SolEncoder_4; + v1.*i8 = evm_malloc 96.i256; + v2.i256 = ptr_to_int v1 i256; + v4.*@__fe_SolEncoder_4 = bitcast v1 *@__fe_SolEncoder_4; v5.*i256 = gep v4 0.i256 0.i256; mstore v5 0.i256 i256; - v6.*@__fe_SolEncoder_4 = bitcast v2 *@__fe_SolEncoder_4; + v6.*@__fe_SolEncoder_4 = bitcast v1 *@__fe_SolEncoder_4; v8.*i256 = gep v6 0.i256 1.i256; mstore v8 0.i256 i256; - v9.*@__fe_SolEncoder_4 = bitcast v2 *@__fe_SolEncoder_4; + v9.*@__fe_SolEncoder_4 = bitcast v1 *@__fe_SolEncoder_4; v11.*i256 = gep v9 0.i256 2.i256; mstore v11 0.i256 i256; - return v3; + return v2; } func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word(v0.i256, v1.i256) { block0: - v3.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v5.*i256 = gep v3 0.i256 1.i256; + v2.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v5.*i256 = gep v2 0.i256 1.i256; v6.i256 = mload v5 i256; mstore v6 v1 i256; - v8.i256 = add v6 32.i256; - v9.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v10.*i256 = gep v9 0.i256 1.i256; - mstore v10 v8 i256; + (v8.i256, v9.i1) = uaddo v6 32.i256; + br v9 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v11.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v12.*i256 = gep v11 0.i256 1.i256; + mstore v12 v8 i256; return; } @@ -737,28 +806,29 @@ func private %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0.i256) return v0; } -func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i256 { +func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i32 { block0: - return v0; + v1.i32 = trunc v0 i32; + return v1; } func private %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256) -> i256 { block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_8 = bitcast v3 *@__fe_Cursor_8; - v6.*@__fe_CallData_7 = gep v5 0.i256 0.i256; + v2.*i8 = evm_malloc 64.i256; + v3.i256 = ptr_to_int v2 i256; + v4.*@__fe_Cursor_8 = bitcast v2 *@__fe_Cursor_8; + v6.*@__fe_CallData_7 = gep v4 0.i256 0.i256; mstore v6 v0 i256; - v7.*@__fe_Cursor_8 = bitcast v3 *@__fe_Cursor_8; + v7.*@__fe_Cursor_8 = bitcast v2 *@__fe_Cursor_8; v9.*i256 = gep v7 0.i256 1.i256; mstore v9 0.i256 i256; - return v4; + return v3; } func private %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_Cursor_8 = int_to_ptr v0 *@__fe_Cursor_8; - v4.*@__fe_CallData_7 = gep v3 0.i256 0.i256; + v2.*@__fe_Cursor_8 = int_to_ptr v0 *@__fe_Cursor_8; + v4.*@__fe_CallData_7 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; v7.*i8 = evm_malloc 64.i256; v8.i256 = ptr_to_int v7 i256; diff --git a/crates/codegen/tests/fixtures/sonatina_ir/effect_ptr_calldata_domain.snap b/crates/codegen/tests/fixtures/sonatina_ir/effect_ptr_calldata_domain.snap index 5a77fad1bf..b2def6dd0a 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/effect_ptr_calldata_domain.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/effect_ptr_calldata_domain.snap @@ -7,8 +7,8 @@ target = "evm-ethereum-osaka" func private %read_x__StorPtr_u256___64779554cfbf0358(v0.i256) -> i256 { block0: - v2.i256 = evm_sload v0; - return v2; + v1.i256 = evm_sload v0; + return v1; } func private %test_calldata_ptr_domain() { @@ -19,8 +19,8 @@ func private %test_calldata_ptr_domain() { func private %read_x__CalldataPtr_u256___1e20dc3e834a8f96(v0.i256) -> i256 { block0: - v2.i256 = evm_calldata_load v0; - return v2; + v1.i256 = evm_calldata_load v0; + return v1; } func private %__fe_sonatina_entry() { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/effect_ptr_domains.snap b/crates/codegen/tests/fixtures/sonatina_ir/effect_ptr_domains.snap index 6a812d6df8..2285ad8a73 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/effect_ptr_domains.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/effect_ptr_domains.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 expression: output input_file: crates/codegen/tests/fixtures/effect_ptr_domains.fe --- @@ -10,21 +9,30 @@ type @__fe_Foo_0 = {i256, i256}; func private %bump__StorPtr_Foo___3698cc3c4b2626e3(v0.i256) { block0: - v2.i256 = evm_sload v0; - v4.i256 = add v2 1.i256; - evm_sstore v0 v4; - v5.i256 = add v0 1.i256; - v6.i256 = evm_sload v5; - v8.i256 = add v6 2.i256; - v9.i256 = add v0 1.i256; - evm_sstore v9 v8; + v1.i256 = evm_sload v0; + (v3.i256, v4.i1) = uaddo v1 1.i256; + br v4 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + evm_sstore v0 v3; + v7.i256 = add v0 1.i256; + v8.i256 = evm_sload v7; + (v10.i256, v11.i1) = uaddo v8 2.i256; + br v11 block1 block3; + + block3: + v13.i256 = add v0 1.i256; + evm_sstore v13 v10; return; } func private %test_effect_ptr_domains__Evm_hef0af3106e109414_Evm_hef0af3106e109414__7ab75559784fbc59(v0.i256, v1.i256) { block0: - v4.i256 = call %mem_ptr_stor_arg0_root_stor__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d v1 256.i256; - call %bump__MemPtr_Foo___cdd30998d577b6ea v4; + v3.i256 = call %mem_ptr_stor_arg0_root_stor__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d v1 256.i256; + call %bump__MemPtr_Foo___cdd30998d577b6ea v3; v5.i256 = call %stor_ptr_stor_arg0_root_stor__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d v0 0.i256; call %bump__StorPtr_Foo___3698cc3c4b2626e3 v5; v7.*i8 = evm_malloc 64.i256; @@ -41,33 +49,42 @@ func private %test_effect_ptr_domains__Evm_hef0af3106e109414_Evm_hef0af3106e1094 func private %mem_ptr_stor_arg0_root_stor__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %memptr_t__hf71ec14ffe47fb3f_effecthandle_hfc52f915596f993a_from_raw__Foo_h6dbce71a6ea992b8__21493237fe9c2c26 v1; - return v3; + v2.i256 = call %memptr_t__hf71ec14ffe47fb3f_effecthandle_hfc52f915596f993a_from_raw__Foo_h6dbce71a6ea992b8__21493237fe9c2c26 v1; + return v2; } func private %bump__MemPtr_Foo___cdd30998d577b6ea(v0.i256) { block0: - v2.*@__fe_Foo_0 = int_to_ptr v0 *@__fe_Foo_0; - v3.*i256 = gep v2 0.i256 0.i256; + v1.*@__fe_Foo_0 = int_to_ptr v0 *@__fe_Foo_0; + v3.*i256 = gep v1 0.i256 0.i256; v4.i256 = mload v3 i256; - v6.i256 = add v4 1.i256; - v7.*@__fe_Foo_0 = int_to_ptr v0 *@__fe_Foo_0; - v8.*i256 = gep v7 0.i256 0.i256; - mstore v8 v6 i256; + (v6.i256, v7.i1) = uaddo v4 1.i256; + br v7 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: v9.*@__fe_Foo_0 = int_to_ptr v0 *@__fe_Foo_0; - v10.*i256 = gep v9 0.i256 1.i256; - v11.i256 = mload v10 i256; - v13.i256 = add v11 2.i256; - v14.*@__fe_Foo_0 = int_to_ptr v0 *@__fe_Foo_0; - v15.*i256 = gep v14 0.i256 1.i256; - mstore v15 v13 i256; + v10.*i256 = gep v9 0.i256 0.i256; + mstore v10 v6 i256; + v11.*@__fe_Foo_0 = int_to_ptr v0 *@__fe_Foo_0; + v12.*i256 = gep v11 0.i256 1.i256; + v13.i256 = mload v12 i256; + (v15.i256, v16.i1) = uaddo v13 2.i256; + br v16 block1 block3; + + block3: + v18.*@__fe_Foo_0 = int_to_ptr v0 *@__fe_Foo_0; + v19.*i256 = gep v18 0.i256 1.i256; + mstore v19 v15 i256; return; } func private %stor_ptr_stor_arg0_root_stor__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Foo_h6dbce71a6ea992b8__21493237fe9c2c26 v1; - return v3; + v2.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Foo_h6dbce71a6ea992b8__21493237fe9c2c26 v1; + return v2; } func private %memptr_t__hf71ec14ffe47fb3f_effecthandle_hfc52f915596f993a_from_raw__Foo_h6dbce71a6ea992b8__21493237fe9c2c26(v0.i256) -> i256 { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/enum_variant_contract.snap b/crates/codegen/tests/fixtures/sonatina_ir/enum_variant_contract.snap index eadb4c8bc3..668556f43a 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/enum_variant_contract.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/enum_variant_contract.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 expression: output input_file: crates/codegen/tests/fixtures/enum_variant_contract.fe --- @@ -24,94 +23,88 @@ func private %runtime__StorPtr_Evm___207f35a85ac4062e() { block0: v1.i256 = evm_calldata_load 0.i256; v3.i256 = shr 224.i256 v1; - v5.i1 = eq v3 1817627404.i256; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; + v5.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq v3 1817627404.i256; + br v5 block1 block2; block1: - v9.i256 = evm_calldata_load 4.i256; - v10.*[i8; 64] = alloca [i8; 64]; - v11.i256 = ptr_to_int v10 i256; - v13.*i256 = bitcast v10 *i256; - mstore v13 1.i256 i256; - v15.i256 = add v11 32.i256; - v16.*i256 = int_to_ptr v15 *i256; - mstore v16 v9 i256; + v7.i256 = evm_calldata_load 4.i256; + v8.*[i8; 64] = alloca [i8; 64]; + v9.i256 = ptr_to_int v8 i256; + v11.*i256 = bitcast v8 *i256; + mstore v11 1.i256 i256; + v13.i256 = add v9 32.i256; + v14.*i256 = int_to_ptr v13 *i256; + mstore v14 v7 i256; jump block6; block2: - v19.i1 = eq v3 1163776883.i256; - v20.i256 = zext v19 i256; - v21.i1 = ne v20 0.i256; - br v21 block8 block9; + v17.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq v3 1163776883.i256; + br v17 block8 block9; block3: - v23.i256 = add v11 32.i256; - v24.*i256 = int_to_ptr v23 *i256; - v25.i256 = mload v24 i256; + v19.i256 = add v9 32.i256; + v20.*i256 = int_to_ptr v19 *i256; + v21.i256 = mload v20 i256; jump block4; block4: - v27.i256 = phi (v25 block3) (0.i256 block5); - call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v27 0.i256; + v23.i256 = phi (v21 block3) (0.i256 block5); + call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v23 0.i256; evm_invalid; block5: jump block4; block6: - v29.*i256 = int_to_ptr v11 *i256; - v30.i256 = mload v29 i256; - br_table v30 block7 (1.i256 block3) (0.i256 block5); + v26.*i256 = int_to_ptr v9 *i256; + v27.i256 = mload v26 i256; + br_table v27 block7 (1.i256 block3) (0.i256 block5); block7: evm_invalid; block8: - v31.*[i8; 64] = alloca [i8; 64]; - v32.i256 = ptr_to_int v31 i256; - v33.*i256 = bitcast v31 *i256; - mstore v33 0.i256 i256; + v28.*[i8; 64] = alloca [i8; 64]; + v29.i256 = ptr_to_int v28 i256; + v30.*i256 = bitcast v28 *i256; + mstore v30 0.i256 i256; jump block13; block9: - v36.i1 = eq v3 3572425762.i256; - v37.i256 = zext v36 i256; - v38.i1 = ne v37 0.i256; - br v38 block15 block16; + v33.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq v3 3572425762.i256; + br v33 block15 block16; block10: - v40.i256 = add v32 32.i256; - v41.*i256 = int_to_ptr v40 *i256; - v42.i256 = mload v41 i256; + v35.i256 = add v29 32.i256; + v36.*i256 = int_to_ptr v35 *i256; + v37.i256 = mload v36 i256; jump block11; block11: - v44.i256 = phi (v42 block10) (0.i256 block12); - call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v44 0.i256; + v39.i256 = phi (v37 block10) (0.i256 block12); + call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v39 0.i256; evm_invalid; block12: jump block11; block13: - v46.*i256 = int_to_ptr v32 *i256; - v47.i256 = mload v46 i256; - br_table v47 block14 (1.i256 block10) (0.i256 block12); + v42.*i256 = int_to_ptr v29 *i256; + v43.i256 = mload v42 i256; + br_table v43 block14 (1.i256 block10) (0.i256 block12); block14: evm_invalid; block15: - v48.i256 = evm_calldata_load 4.i256; - v49.*[i8; 64] = alloca [i8; 64]; - v50.i256 = ptr_to_int v49 i256; - v51.*i256 = bitcast v49 *i256; - mstore v51 1.i256 i256; - v52.i256 = add v50 32.i256; - v53.*i256 = int_to_ptr v52 *i256; - mstore v53 v48 i256; + v44.i256 = evm_calldata_load 4.i256; + v45.*[i8; 64] = alloca [i8; 64]; + v46.i256 = ptr_to_int v45 i256; + v47.*i256 = bitcast v45 *i256; + mstore v47 1.i256 i256; + v48.i256 = add v46 32.i256; + v49.*i256 = int_to_ptr v48 *i256; + mstore v49 v44 i256; jump block20; block16: @@ -121,22 +114,28 @@ func private %runtime__StorPtr_Evm___207f35a85ac4062e() { jump block18; block18: - v54.i256 = phi (1.i256 block17) (0.i256 block19); - call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v54 0.i256; + v50.i256 = phi (1.i256 block17) (0.i256 block19); + call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v50 0.i256; evm_invalid; block19: jump block18; block20: - v56.*i256 = int_to_ptr v50 *i256; - v57.i256 = mload v56 i256; - br_table v57 block21 (1.i256 block17) (0.i256 block19); + v53.*i256 = int_to_ptr v46 *i256; + v54.i256 = mload v53 i256; + br_table v54 block21 (1.i256 block17) (0.i256 block19); block21: evm_invalid; } +func private %u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; + return v2; +} + object @EnumContract { section init { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/erc20.snap b/crates/codegen/tests/fixtures/sonatina_ir/erc20.snap index 035367efad..c5673ec120 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/erc20.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/erc20.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 expression: output input_file: crates/codegen/tests/fixtures/erc20.fe --- @@ -32,10 +31,8 @@ func private %__CoolCoin_init_contract(v0.i256, v1.i256, v2.i256, v3.i256, v4.i2 block0: call %accesscontrol____h4c85da5bbb505ade_grant_stor_arg0_root_stor__3__577ab43c73dd3cef v3 1.i256 v1; call %accesscontrol____h4c85da5bbb505ade_grant_stor_arg0_root_stor__3__577ab43c73dd3cef v3 2.i256 v1; - v9.i1 = gt v0 0.i256; - v10.i256 = zext v9 i256; - v11.i1 = ne v10 0.i256; - br v11 block1 block2; + v9.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt v0 0.i256; + br v9 block1 block2; block1: call %mint__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb v1 v0 v2 v5; @@ -45,36 +42,36 @@ func private %__CoolCoin_init_contract(v0.i256, v1.i256, v2.i256, v3.i256, v4.i2 return; } -func private %__CoolCoin_recv_0_0(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { +func private %__CoolCoin_recv_0_0(v0.i256, v1.i256, v2.i256, v3.i256) -> i1 { block0: - v5.*@__fe_Transfer_1 = int_to_ptr v0 *@__fe_Transfer_1; - v6.*@__fe_Address_0 = gep v5 0.i256 0.i256; + v4.*@__fe_Transfer_1 = int_to_ptr v0 *@__fe_Transfer_1; + v6.*@__fe_Address_0 = gep v4 0.i256 0.i256; v7.i256 = mload v6 i256; v8.*@__fe_Transfer_1 = int_to_ptr v0 *@__fe_Transfer_1; v10.*i256 = gep v8 0.i256 1.i256; v11.i256 = mload v10 i256; v12.i256 = evm_caller; call %transfer__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb v12 v7 v11 v2 v3; - return 1.i256; + return 1.i1; } -func private %__CoolCoin_recv_0_1(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { +func private %__CoolCoin_recv_0_1(v0.i256, v1.i256, v2.i256, v3.i256) -> i1 { block0: - v5.*@__fe_Approve_2 = int_to_ptr v0 *@__fe_Approve_2; - v6.*@__fe_Address_0 = gep v5 0.i256 0.i256; + v4.*@__fe_Approve_2 = int_to_ptr v0 *@__fe_Approve_2; + v6.*@__fe_Address_0 = gep v4 0.i256 0.i256; v7.i256 = mload v6 i256; v8.*@__fe_Approve_2 = int_to_ptr v0 *@__fe_Approve_2; v10.*i256 = gep v8 0.i256 1.i256; v11.i256 = mload v10 i256; v12.i256 = evm_caller; call %approve__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb v12 v7 v11 v2 v3; - return 1.i256; + return 1.i1; } -func private %__CoolCoin_recv_0_2(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { +func private %__CoolCoin_recv_0_2(v0.i256, v1.i256, v2.i256, v3.i256) -> i1 { block0: - v5.*@__fe_TransferFrom_3 = int_to_ptr v0 *@__fe_TransferFrom_3; - v6.*@__fe_Address_0 = gep v5 0.i256 0.i256; + v4.*@__fe_TransferFrom_3 = int_to_ptr v0 *@__fe_TransferFrom_3; + v6.*@__fe_Address_0 = gep v4 0.i256 0.i256; v7.i256 = mload v6 i256; v8.*@__fe_TransferFrom_3 = int_to_ptr v0 *@__fe_TransferFrom_3; v10.*@__fe_Address_0 = gep v8 0.i256 1.i256; @@ -85,19 +82,19 @@ func private %__CoolCoin_recv_0_2(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { v16.i256 = evm_caller; call %spend_allowance__0_1_StorPtr_TokenStore_0__1____d3adca980e228028 v7 v16 v15 v2; call %transfer__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb v7 v11 v15 v2 v3; - return 1.i256; + return 1.i1; } func private %__CoolCoin_recv_0_3(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0; - return v3; + v4.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0; + return v4; } func private %__CoolCoin_recv_0_4(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_Allowance_4 = int_to_ptr v0 *@__fe_Allowance_4; - v4.*@__fe_Address_0 = gep v3 0.i256 0.i256; + v2.*@__fe_Allowance_4 = int_to_ptr v0 *@__fe_Allowance_4; + v4.*@__fe_Address_0 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; v6.*@__fe_Allowance_4 = int_to_ptr v0 *@__fe_Allowance_4; v8.*@__fe_Address_0 = gep v6 0.i256 1.i256; @@ -110,8 +107,8 @@ func private %__CoolCoin_recv_0_4(v0.i256, v1.i256) -> i256 { v15.*@__fe_tuple_5 = bitcast v11 *@__fe_tuple_5; v16.*@__fe_Address_0 = gep v15 0.i256 1.i256; mstore v16 v9 i256; - v17.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v12; - return v17; + v18.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v12; + return v18; } func private %__CoolCoin_recv_0_5(v0.i256) -> i256 { @@ -130,35 +127,35 @@ func private %__CoolCoin_recv_0_7() -> i256 { return 1129271116.i256; } -func private %__CoolCoin_recv_0_8() -> i256 { +func private %__CoolCoin_recv_0_8() -> i8 { block0: - return 18.i256; + return 18.i8; } -func private %__CoolCoin_recv_1_0(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256) -> i256 { +func private %__CoolCoin_recv_1_0(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256) -> i1 { block0: - v6.*@__fe_Mint_6 = int_to_ptr v0 *@__fe_Mint_6; - v7.*@__fe_Address_0 = gep v6 0.i256 0.i256; + v5.*@__fe_Mint_6 = int_to_ptr v0 *@__fe_Mint_6; + v7.*@__fe_Address_0 = gep v5 0.i256 0.i256; v8.i256 = mload v7 i256; v9.*@__fe_Mint_6 = int_to_ptr v0 *@__fe_Mint_6; v11.*i256 = gep v9 0.i256 1.i256; v12.i256 = mload v11 i256; call %accesscontrol____h4c85da5bbb505ade_require_stor_arg0_root_stor__3_Evm_hef0af3106e109414__5baaa260f0d18873 v4 1.i256 v1; call %mint__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb v8 v12 v2 v3; - return 1.i256; + return 1.i1; } -func private %__CoolCoin_recv_1_1(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { +func private %__CoolCoin_recv_1_1(v0.i256, v1.i256, v2.i256, v3.i256) -> i1 { block0: - v5.i256 = evm_caller; - call %burn__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb v5 v0 v2 v3; - return 1.i256; + v4.i256 = evm_caller; + call %burn__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb v4 v0 v2 v3; + return 1.i1; } -func private %__CoolCoin_recv_1_2(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { +func private %__CoolCoin_recv_1_2(v0.i256, v1.i256, v2.i256, v3.i256) -> i1 { block0: - v5.*@__fe_BurnFrom_7 = int_to_ptr v0 *@__fe_BurnFrom_7; - v6.*@__fe_Address_0 = gep v5 0.i256 0.i256; + v4.*@__fe_BurnFrom_7 = int_to_ptr v0 *@__fe_BurnFrom_7; + v6.*@__fe_Address_0 = gep v4 0.i256 0.i256; v7.i256 = mload v6 i256; v8.*@__fe_BurnFrom_7 = int_to_ptr v0 *@__fe_BurnFrom_7; v10.*i256 = gep v8 0.i256 1.i256; @@ -166,13 +163,13 @@ func private %__CoolCoin_recv_1_2(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { v12.i256 = evm_caller; call %spend_allowance__0_1_StorPtr_TokenStore_0__1____d3adca980e228028 v7 v12 v11 v2; call %burn__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb v7 v11 v2 v3; - return 1.i256; + return 1.i1; } -func private %__CoolCoin_recv_1_3(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { +func private %__CoolCoin_recv_1_3(v0.i256, v1.i256, v2.i256, v3.i256) -> i1 { block0: - v5.*@__fe_IncreaseAllowance_8 = int_to_ptr v0 *@__fe_IncreaseAllowance_8; - v6.*@__fe_Address_0 = gep v5 0.i256 0.i256; + v4.*@__fe_IncreaseAllowance_8 = int_to_ptr v0 *@__fe_IncreaseAllowance_8; + v6.*@__fe_Address_0 = gep v4 0.i256 0.i256; v7.i256 = mload v6 i256; v8.*@__fe_IncreaseAllowance_8 = int_to_ptr v0 *@__fe_IncreaseAllowance_8; v10.*i256 = gep v8 0.i256 1.i256; @@ -186,16 +183,22 @@ func private %__CoolCoin_recv_1_3(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { v18.*@__fe_tuple_5 = bitcast v14 *@__fe_tuple_5; v19.*@__fe_Address_0 = gep v18 0.i256 1.i256; mstore v19 v7 i256; - v20.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v15; - v21.i256 = add v20 v11; - call %approve__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb v12 v7 v21 v2 v3; - return 1.i256; + v21.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v15; + (v22.i256, v23.i1) = uaddo v21 v11; + br v23 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + call %approve__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb v12 v7 v22 v2 v3; + return 1.i1; } -func private %__CoolCoin_recv_1_4(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { +func private %__CoolCoin_recv_1_4(v0.i256, v1.i256, v2.i256, v3.i256) -> i1 { block0: - v5.*@__fe_DecreaseAllowance_9 = int_to_ptr v0 *@__fe_DecreaseAllowance_9; - v6.*@__fe_Address_0 = gep v5 0.i256 0.i256; + v4.*@__fe_DecreaseAllowance_9 = int_to_ptr v0 *@__fe_DecreaseAllowance_9; + v6.*@__fe_Address_0 = gep v4 0.i256 0.i256; v7.i256 = mload v6 i256; v8.*@__fe_DecreaseAllowance_9 = int_to_ptr v0 *@__fe_DecreaseAllowance_9; v10.*i256 = gep v8 0.i256 1.i256; @@ -209,27 +212,29 @@ func private %__CoolCoin_recv_1_4(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { v18.*@__fe_tuple_5 = bitcast v14 *@__fe_tuple_5; v19.*@__fe_Address_0 = gep v18 0.i256 1.i256; mstore v19 v7 i256; - v20.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v15; - v21.i1 = lt v20 v11; - v22.i1 = is_zero v21; - v23.i256 = zext v22 i256; - call %assert v23; - v24.i256 = sub v20 v11; - call %approve__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb v12 v7 v24 v2 v3; - return 1.i256; + v21.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v15; + v22.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_ge v21 v11; + call %assert v22; + (v23.i256, v24.i1) = usubo v21 v11; + br v24 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + call %approve__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb v12 v7 v23 v2 v3; + return 1.i1; } func private %__CoolCoin_init() { block0: - v1.i256 = call %init_field__Evm_hef0af3106e109414_TokenStore_0__1___db7d7c067dc14cc5 0.i256 0.i256; - v3.i256 = call %init_field__Evm_hef0af3106e109414_AccessControl_3___1911f7c438797961 0.i256 3.i256; - v4.i256 = sym_addr &__CoolCoin_runtime; - v5.i256 = sym_size &__CoolCoin_runtime; - v6.i256 = sym_size .; - v7.i256 = evm_code_size; - v8.i1 = lt v7 v6; - v9.i256 = zext v8 i256; - v10.i1 = ne v9 0.i256; + v2.i256 = call %init_field__Evm_hef0af3106e109414_TokenStore_0__1___db7d7c067dc14cc5 0.i256 0.i256; + v5.i256 = call %init_field__Evm_hef0af3106e109414_AccessControl_3___1911f7c438797961 0.i256 3.i256; + v6.i256 = sym_addr &__CoolCoin_runtime; + v7.i256 = sym_size &__CoolCoin_runtime; + v8.i256 = sym_size .; + v9.i256 = evm_code_size; + v10.i1 = lt v9 v8; br v10 block1 block2; block1: @@ -237,257 +242,283 @@ func private %__CoolCoin_init() { evm_invalid; block2: - v13.i256 = sub v7 v6; - v14.i256 = sub v7 v6; - v15.*i8 = evm_malloc v14; - v16.i256 = ptr_to_int v15 i256; - v17.i256 = sub v7 v6; - evm_code_copy v16 v6 v17; - v19.*i8 = evm_malloc 64.i256; - v20.i256 = ptr_to_int v19 i256; - v21.*@__fe_MemoryBytes_10 = bitcast v19 *@__fe_MemoryBytes_10; - v22.*i256 = gep v21 0.i256 0.i256; - mstore v22 v16 i256; - v23.i256 = sub v7 v6; - v24.*@__fe_MemoryBytes_10 = bitcast v19 *@__fe_MemoryBytes_10; - v26.*i256 = gep v24 0.i256 1.i256; - mstore v26 v23 i256; - v27.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v20; - v28.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v27; - v29.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v27; - call %__CoolCoin_init_contract v28 v29 v1 v3 0.i256 0.i256; - evm_code_copy 0.i256 v4 v5; - evm_return 0.i256 v5; + v14.i256 = sub v9 v8; + v15.i256 = sub v9 v8; + v16.*i8 = evm_malloc v15; + v17.i256 = ptr_to_int v16 i256; + v18.i256 = sub v9 v8; + evm_code_copy v17 v8 v18; + v20.*i8 = evm_malloc 64.i256; + v21.i256 = ptr_to_int v20 i256; + v22.*@__fe_MemoryBytes_10 = bitcast v20 *@__fe_MemoryBytes_10; + v23.*i256 = gep v22 0.i256 0.i256; + mstore v23 v17 i256; + v24.i256 = sub v9 v8; + v25.*@__fe_MemoryBytes_10 = bitcast v20 *@__fe_MemoryBytes_10; + v27.*i256 = gep v25 0.i256 1.i256; + mstore v27 v24 i256; + v28.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v21; + v29.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v28; + v30.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v28; + call %__CoolCoin_init_contract v29 v30 v2 v5 0.i256 0.i256; + evm_code_copy 0.i256 v6 v7; + evm_return 0.i256 v7; } func private %__CoolCoin_runtime() { block0: - v1.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__TokenStore_0__1___175215aa56127bde 0.i256 0.i256; - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__AccessControl_3___3633e113b859df5f 0.i256 3.i256; - v4.i256 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v5.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - br_table v4 block1 (2835717307.i256 block2) (157198259.i256 block3) (599290589.i256 block4) (1889567281.i256 block5) (3714247998.i256 block6) (404098525.i256 block7) (117300739.i256 block8) (2514000705.i256 block9) (826074471.i256 block10) (1086394137.i256 block11) (1117154408.i256 block12) (2043438992.i256 block13) (961581905.i256 block14) (2757214935.i256 block15); + v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__TokenStore_0__1___175215aa56127bde 0.i256 0.i256; + v5.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__AccessControl_3___3633e113b859df5f 0.i256 3.i256; + v7.i32 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; + v9.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; + br_table v7 block1 (-1459249989.i32 block2) (157198259.i32 block3) (599290589.i32 block4) (1889567281.i32 block5) (-580719298.i32 block6) (404098525.i32 block7) (117300739.i32 block8) (-1780966591.i32 block9) (826074471.i32 block10) (1086394137.i32 block11) (1117154408.i32 block12) (2043438992.i32 block13) (961581905.i32 block14) (-1537752361.i32 block15); block1: call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; evm_invalid; block2: - v21.i256 = call %transfer_h13f5ec5985ebba60_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v23.i256 = call %__CoolCoin_recv_0_0 v21 0.i256 v1 0.i256; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v23; + v26.i256 = call %transfer_h13f5ec5985ebba60_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v9; + v28.i1 = call %__CoolCoin_recv_0_0 v26 0.i256 v2 0.i256; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v28; evm_invalid; block3: - v25.i256 = call %approve_h90175fc19dafde67_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v27.i256 = call %__CoolCoin_recv_0_1 v25 0.i256 v1 0.i256; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v27; + v31.i256 = call %approve_h90175fc19dafde67_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v9; + v33.i1 = call %__CoolCoin_recv_0_1 v31 0.i256 v2 0.i256; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v33; evm_invalid; block4: - v29.i256 = call %transferfrom_h939549e4bad999e8_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v31.i256 = call %__CoolCoin_recv_0_2 v29 0.i256 v1 0.i256; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v31; + v36.i256 = call %transferfrom_h939549e4bad999e8_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v9; + v38.i1 = call %__CoolCoin_recv_0_2 v36 0.i256 v2 0.i256; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v38; evm_invalid; block5: - v33.i256 = call %balanceof_hf830ebedc81244a7_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v35.i256 = call %__CoolCoin_recv_0_3 v33 v1; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v35; + v41.i256 = call %balanceof_hf830ebedc81244a7_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v9; + v43.i256 = call %__CoolCoin_recv_0_3 v41 v2; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v43; evm_invalid; block6: - v37.i256 = call %allowance_h4bb1267f662bd2a8_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v39.i256 = call %__CoolCoin_recv_0_4 v37 v1; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v39; + v46.i256 = call %allowance_h4bb1267f662bd2a8_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v9; + v48.i256 = call %__CoolCoin_recv_0_4 v46 v2; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v48; evm_invalid; block7: - call %totalsupply_h6bf4f2c3498c901c_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v42.i256 = call %__CoolCoin_recv_0_5 v1; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v42; + call %totalsupply_h6bf4f2c3498c901c_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v9; + v52.i256 = call %__CoolCoin_recv_0_5 v2; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v52; evm_invalid; block8: - call %name_h327e3db4a53b027e_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v44.i256 = call %__CoolCoin_recv_0_6; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_String_32___7798a45a8b22b7ed 0.i256 v44; + call %name_h327e3db4a53b027e_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v9; + v55.i256 = call %__CoolCoin_recv_0_6; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_String_32___7798a45a8b22b7ed 0.i256 v55; evm_invalid; block9: - call %symbol_h6dabcb627bde53b9_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v46.i256 = call %__CoolCoin_recv_0_7; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_String_8___99627a2b067a3b64 0.i256 v46; + call %symbol_h6dabcb627bde53b9_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v9; + v58.i256 = call %__CoolCoin_recv_0_7; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_String_8___99627a2b067a3b64 0.i256 v58; evm_invalid; block10: - call %decimals_h247e095089bd9dcb_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v48.i256 = call %__CoolCoin_recv_0_8; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u8__5f40d25b4a1c5efd 0.i256 v48; + call %decimals_h247e095089bd9dcb_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v9; + v61.i8 = call %__CoolCoin_recv_0_8; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u8__5f40d25b4a1c5efd 0.i256 v61; evm_invalid; block11: - v50.i256 = call %mint_ha2f94817be433a2e_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v53.i256 = call %__CoolCoin_recv_1_0 v50 0.i256 v1 0.i256 v3; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v53; + v64.i256 = call %mint_ha2f94817be433a2e_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v9; + v67.i1 = call %__CoolCoin_recv_1_0 v64 0.i256 v2 0.i256 v5; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v67; evm_invalid; block12: - v55.i256 = call %burn_h25a61f4466d20eed_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v57.i256 = call %__CoolCoin_recv_1_1 v55 0.i256 v1 0.i256; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v57; + v70.i256 = call %burn_h25a61f4466d20eed_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v9; + v72.i1 = call %__CoolCoin_recv_1_1 v70 0.i256 v2 0.i256; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v72; evm_invalid; block13: - v59.i256 = call %burnfrom_ha9fb0972f143e40c_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v61.i256 = call %__CoolCoin_recv_1_2 v59 0.i256 v1 0.i256; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v61; + v75.i256 = call %burnfrom_ha9fb0972f143e40c_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v9; + v77.i1 = call %__CoolCoin_recv_1_2 v75 0.i256 v2 0.i256; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v77; evm_invalid; block14: - v63.i256 = call %increaseallowance_h9840135eaea36633_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v65.i256 = call %__CoolCoin_recv_1_3 v63 0.i256 v1 0.i256; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v65; + v80.i256 = call %increaseallowance_h9840135eaea36633_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v9; + v82.i1 = call %__CoolCoin_recv_1_3 v80 0.i256 v2 0.i256; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v82; evm_invalid; block15: - v67.i256 = call %decreaseallowance_h635474f45639c83d_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v69.i256 = call %__CoolCoin_recv_1_4 v67 0.i256 v1 0.i256; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v69; + v85.i256 = call %decreaseallowance_h635474f45639c83d_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v9; + v87.i1 = call %__CoolCoin_recv_1_4 v85 0.i256 v2 0.i256; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v87; evm_invalid; } func private %accesscontrol____h4c85da5bbb505ade_grant_stor_arg0_root_stor__3__577ab43c73dd3cef(v0.i256, v1.i256, v2.i256) { block0: - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_tuple_11 = bitcast v5 *@__fe_tuple_11; - v8.*i256 = gep v7 0.i256 0.i256; + v4.*i8 = evm_malloc 64.i256; + v5.i256 = ptr_to_int v4 i256; + v6.*@__fe_tuple_11 = bitcast v4 *@__fe_tuple_11; + v8.*i256 = gep v6 0.i256 0.i256; mstore v8 v1 i256; - v9.*@__fe_tuple_11 = bitcast v5 *@__fe_tuple_11; + v9.*@__fe_tuple_11 = bitcast v4 *@__fe_tuple_11; v11.*@__fe_Address_0 = gep v9 0.i256 1.i256; mstore v11 v2 i256; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___u256__Address__bool_3__5e1c6d4e3f4fb7e8 0.i256 v6 1.i256; + call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___u256__Address__bool_3__5e1c6d4e3f4fb7e8 0.i256 v5 1.i1; return; } +func private %u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = gt v0 v1; + return v2; +} + func private %mint__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb(v0.i256, v1.i256, v2.i256, v3.i256) { block0: - v5.i256 = call %address_h257056268eac7027_zero; - v6.i256 = call %ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v0 v5; - call %assert v6; - v7.i256 = evm_sload v2; - v8.i256 = add v7 v1; - evm_sstore v2 v8; - v9.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0; - v10.i256 = add v9 v1; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0 v10; - v11.i256 = call %address_h257056268eac7027_zero; - v13.*i8 = evm_malloc 96.i256; - v14.i256 = ptr_to_int v13 i256; - v15.*@__fe_TransferEvent_12 = bitcast v13 *@__fe_TransferEvent_12; - v16.*@__fe_Address_0 = gep v15 0.i256 0.i256; - mstore v16 v11 i256; - v17.*@__fe_TransferEvent_12 = bitcast v13 *@__fe_TransferEvent_12; - v19.*@__fe_Address_0 = gep v17 0.i256 1.i256; - mstore v19 v0 i256; - v20.*@__fe_TransferEvent_12 = bitcast v13 *@__fe_TransferEvent_12; - v22.*i256 = gep v20 0.i256 2.i256; - mstore v22 v1 i256; - call %emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63 v3 v14; + v4.i256 = call %address_h257056268eac7027_zero; + v5.i1 = call %ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v0 v4; + call %assert v5; + v6.i256 = evm_sload v2; + (v7.i256, v8.i1) = uaddo v6 v1; + br v8 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + evm_sstore v2 v7; + v13.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0; + (v15.i256, v16.i1) = uaddo v13 v1; + br v16 block1 block3; + + block3: + call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0 v15; + v19.i256 = call %address_h257056268eac7027_zero; + v21.*i8 = evm_malloc 96.i256; + v22.i256 = ptr_to_int v21 i256; + v23.*@__fe_TransferEvent_12 = bitcast v21 *@__fe_TransferEvent_12; + v24.*@__fe_Address_0 = gep v23 0.i256 0.i256; + mstore v24 v19 i256; + v25.*@__fe_TransferEvent_12 = bitcast v21 *@__fe_TransferEvent_12; + v27.*@__fe_Address_0 = gep v25 0.i256 1.i256; + mstore v27 v0 i256; + v29.*@__fe_TransferEvent_12 = bitcast v21 *@__fe_TransferEvent_12; + v31.*i256 = gep v29 0.i256 2.i256; + mstore v31 v1 i256; + call %emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63 v3 v22; return; } func private %transfer__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256) { block0: - v6.i256 = call %address_h257056268eac7027_zero; - v7.i256 = call %ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v0 v6; - call %assert v7; - v8.i256 = call %address_h257056268eac7027_zero; - v9.i256 = call %ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v1 v8; - call %assert v9; - v10.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0; - v11.i1 = lt v10 v2; - v12.i1 = is_zero v11; - v13.i256 = zext v12 i256; - call %assert v13; - v14.i256 = sub v10 v2; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0 v14; - v15.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v1; - v16.i256 = add v15 v2; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v1 v16; - v18.*i8 = evm_malloc 96.i256; - v19.i256 = ptr_to_int v18 i256; - v20.*@__fe_TransferEvent_12 = bitcast v18 *@__fe_TransferEvent_12; - v21.*@__fe_Address_0 = gep v20 0.i256 0.i256; - mstore v21 v0 i256; - v22.*@__fe_TransferEvent_12 = bitcast v18 *@__fe_TransferEvent_12; - v24.*@__fe_Address_0 = gep v22 0.i256 1.i256; - mstore v24 v1 i256; - v25.*@__fe_TransferEvent_12 = bitcast v18 *@__fe_TransferEvent_12; - v27.*i256 = gep v25 0.i256 2.i256; - mstore v27 v2 i256; - call %emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63 v4 v19; + v5.i256 = call %address_h257056268eac7027_zero; + v6.i1 = call %ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v0 v5; + call %assert v6; + v7.i256 = call %address_h257056268eac7027_zero; + v8.i1 = call %ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v1 v7; + call %assert v8; + v11.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0; + v12.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_ge v11 v2; + call %assert v12; + (v13.i256, v14.i1) = usubo v11 v2; + br v14 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0 v13; + v20.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v1; + (v22.i256, v23.i1) = uaddo v20 v2; + br v23 block1 block3; + + block3: + call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v1 v22; + v27.*i8 = evm_malloc 96.i256; + v28.i256 = ptr_to_int v27 i256; + v30.*@__fe_TransferEvent_12 = bitcast v27 *@__fe_TransferEvent_12; + v31.*@__fe_Address_0 = gep v30 0.i256 0.i256; + mstore v31 v0 i256; + v32.*@__fe_TransferEvent_12 = bitcast v27 *@__fe_TransferEvent_12; + v34.*@__fe_Address_0 = gep v32 0.i256 1.i256; + mstore v34 v1 i256; + v36.*@__fe_TransferEvent_12 = bitcast v27 *@__fe_TransferEvent_12; + v38.*i256 = gep v36 0.i256 2.i256; + mstore v38 v2 i256; + call %emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63 v4 v28; return; } func private %approve__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256) { block0: - v6.i256 = call %address_h257056268eac7027_zero; - v7.i256 = call %ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v0 v6; - call %assert v7; - v8.i256 = call %address_h257056268eac7027_zero; - v9.i256 = call %ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v1 v8; - call %assert v9; - v11.*i8 = evm_malloc 64.i256; - v12.i256 = ptr_to_int v11 i256; - v13.*@__fe_tuple_5 = bitcast v11 *@__fe_tuple_5; - v14.*@__fe_Address_0 = gep v13 0.i256 0.i256; + v5.i256 = call %address_h257056268eac7027_zero; + v6.i1 = call %ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v0 v5; + call %assert v6; + v7.i256 = call %address_h257056268eac7027_zero; + v8.i1 = call %ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v1 v7; + call %assert v8; + v10.*i8 = evm_malloc 64.i256; + v11.i256 = ptr_to_int v10 i256; + v12.*@__fe_tuple_5 = bitcast v10 *@__fe_tuple_5; + v14.*@__fe_Address_0 = gep v12 0.i256 0.i256; mstore v14 v0 i256; - v15.*@__fe_tuple_5 = bitcast v11 *@__fe_tuple_5; + v15.*@__fe_tuple_5 = bitcast v10 *@__fe_tuple_5; v17.*@__fe_Address_0 = gep v15 0.i256 1.i256; mstore v17 v1 i256; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v12 v2; - v19.*i8 = evm_malloc 96.i256; - v20.i256 = ptr_to_int v19 i256; - v21.*@__fe_ApprovalEvent_13 = bitcast v19 *@__fe_ApprovalEvent_13; - v22.*@__fe_Address_0 = gep v21 0.i256 0.i256; - mstore v22 v0 i256; - v23.*@__fe_ApprovalEvent_13 = bitcast v19 *@__fe_ApprovalEvent_13; - v24.*@__fe_Address_0 = gep v23 0.i256 1.i256; - mstore v24 v1 i256; - v25.*@__fe_ApprovalEvent_13 = bitcast v19 *@__fe_ApprovalEvent_13; - v27.*i256 = gep v25 0.i256 2.i256; - mstore v27 v2 i256; - call %emit_stor_arg0_root_stor__Evm_hef0af3106e109414_ApprovalEvent_h313d94630b6580e5__2946163026d92694 v4 v20; + call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v11 v2; + v20.*i8 = evm_malloc 96.i256; + v21.i256 = ptr_to_int v20 i256; + v22.*@__fe_ApprovalEvent_13 = bitcast v20 *@__fe_ApprovalEvent_13; + v23.*@__fe_Address_0 = gep v22 0.i256 0.i256; + mstore v23 v0 i256; + v24.*@__fe_ApprovalEvent_13 = bitcast v20 *@__fe_ApprovalEvent_13; + v25.*@__fe_Address_0 = gep v24 0.i256 1.i256; + mstore v25 v1 i256; + v26.*@__fe_ApprovalEvent_13 = bitcast v20 *@__fe_ApprovalEvent_13; + v28.*i256 = gep v26 0.i256 2.i256; + mstore v28 v2 i256; + call %emit_stor_arg0_root_stor__Evm_hef0af3106e109414_ApprovalEvent_h313d94630b6580e5__2946163026d92694 v4 v21; return; } func private %spend_allowance__0_1_StorPtr_TokenStore_0__1____d3adca980e228028(v0.i256, v1.i256, v2.i256, v3.i256) { block0: - v6.*i8 = evm_malloc 64.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_tuple_5 = bitcast v6 *@__fe_tuple_5; - v9.*@__fe_Address_0 = gep v8 0.i256 0.i256; + v5.*i8 = evm_malloc 64.i256; + v6.i256 = ptr_to_int v5 i256; + v7.*@__fe_tuple_5 = bitcast v5 *@__fe_tuple_5; + v9.*@__fe_Address_0 = gep v7 0.i256 0.i256; mstore v9 v0 i256; - v10.*@__fe_tuple_5 = bitcast v6 *@__fe_tuple_5; + v10.*@__fe_tuple_5 = bitcast v5 *@__fe_tuple_5; v12.*@__fe_Address_0 = gep v10 0.i256 1.i256; mstore v12 v1 i256; - v13.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v7; - v14.i1 = lt v13 v2; - v15.i1 = is_zero v14; - v16.i256 = zext v15 i256; - call %assert v16; - v17.*i8 = evm_malloc 64.i256; - v18.i256 = ptr_to_int v17 i256; - v19.*@__fe_tuple_5 = bitcast v17 *@__fe_tuple_5; - v20.*@__fe_Address_0 = gep v19 0.i256 0.i256; - mstore v20 v0 i256; - v21.*@__fe_tuple_5 = bitcast v17 *@__fe_tuple_5; - v22.*@__fe_Address_0 = gep v21 0.i256 1.i256; - mstore v22 v1 i256; - v23.i256 = sub v13 v2; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v18 v23; + v14.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v6; + v15.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_ge v14 v2; + call %assert v15; + v16.*i8 = evm_malloc 64.i256; + v17.i256 = ptr_to_int v16 i256; + v18.*@__fe_tuple_5 = bitcast v16 *@__fe_tuple_5; + v19.*@__fe_Address_0 = gep v18 0.i256 0.i256; + mstore v19 v0 i256; + v20.*@__fe_tuple_5 = bitcast v16 *@__fe_tuple_5; + v21.*@__fe_Address_0 = gep v20 0.i256 1.i256; + mstore v21 v1 i256; + (v22.i256, v23.i1) = usubo v14 v2; + br v23 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v17 v22; return; } @@ -500,66 +531,77 @@ func private %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0 func private %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(v0.i256, v1.i256) -> i256 { block0: - v4.i256 = call %storagemap_get_word_with_salt___Address__Address___c32d499da259c78e v1 1.i256; - v5.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word v4; - return v5; + v3.i256 = call %storagemap_get_word_with_salt___Address__Address___c32d499da259c78e v1 1.i256; + v4.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word v3; + return v4; } func private %accesscontrol____h4c85da5bbb505ade_require_stor_arg0_root_stor__3_Evm_hef0af3106e109414__5baaa260f0d18873(v0.i256, v1.i256, v2.i256) { block0: - v4.i256 = evm_caller; - v6.*i8 = evm_malloc 64.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_tuple_11 = bitcast v6 *@__fe_tuple_11; - v9.*i256 = gep v8 0.i256 0.i256; + v3.i256 = evm_caller; + v5.*i8 = evm_malloc 64.i256; + v6.i256 = ptr_to_int v5 i256; + v7.*@__fe_tuple_11 = bitcast v5 *@__fe_tuple_11; + v9.*i256 = gep v7 0.i256 0.i256; mstore v9 v1 i256; - v10.*@__fe_tuple_11 = bitcast v6 *@__fe_tuple_11; + v10.*@__fe_tuple_11 = bitcast v5 *@__fe_tuple_11; v12.*@__fe_Address_0 = gep v10 0.i256 1.i256; - mstore v12 v4 i256; - v13.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___u256__Address__bool_3__5e1c6d4e3f4fb7e8 0.i256 v7; - v14.i1 = eq v13 1.i256; - v15.i256 = zext v14 i256; - call %assert v15; + mstore v12 v3 i256; + v14.i1 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___u256__Address__bool_3__5e1c6d4e3f4fb7e8 0.i256 v6; + v16.i1 = call %bool_h947c0c03c59c6f07_eq_he50383edd273619f_eq v14 1.i1; + call %assert v16; return; } func private %burn__0_1_StorPtr_TokenStore_0__1___Evm_hef0af3106e109414__4094b60766812ceb(v0.i256, v1.i256, v2.i256, v3.i256) { block0: - v5.i256 = call %address_h257056268eac7027_zero; - v6.i256 = call %ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v0 v5; - call %assert v6; - v7.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0; - v8.i1 = lt v7 v1; - v9.i1 = is_zero v8; - v10.i256 = zext v9 i256; - call %assert v10; - v11.i256 = sub v7 v1; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0 v11; - v12.i256 = evm_sload v2; - v13.i256 = sub v12 v1; - evm_sstore v2 v13; - v14.i256 = call %address_h257056268eac7027_zero; - v16.*i8 = evm_malloc 96.i256; - v17.i256 = ptr_to_int v16 i256; - v18.*@__fe_TransferEvent_12 = bitcast v16 *@__fe_TransferEvent_12; - v19.*@__fe_Address_0 = gep v18 0.i256 0.i256; - mstore v19 v0 i256; - v20.*@__fe_TransferEvent_12 = bitcast v16 *@__fe_TransferEvent_12; - v22.*@__fe_Address_0 = gep v20 0.i256 1.i256; - mstore v22 v14 i256; - v23.*@__fe_TransferEvent_12 = bitcast v16 *@__fe_TransferEvent_12; - v25.*i256 = gep v23 0.i256 2.i256; - mstore v25 v1 i256; - call %emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63 v3 v17; + v4.i256 = call %address_h257056268eac7027_zero; + v5.i1 = call %ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v0 v4; + call %assert v5; + v8.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0; + v9.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_ge v8 v1; + call %assert v9; + (v10.i256, v11.i1) = usubo v8 v1; + br v11 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0 v10; + v15.i256 = evm_sload v2; + (v17.i256, v18.i1) = usubo v15 v1; + br v18 block1 block3; + + block3: + evm_sstore v2 v17; + v20.i256 = call %address_h257056268eac7027_zero; + v22.*i8 = evm_malloc 96.i256; + v23.i256 = ptr_to_int v22 i256; + v25.*@__fe_TransferEvent_12 = bitcast v22 *@__fe_TransferEvent_12; + v26.*@__fe_Address_0 = gep v25 0.i256 0.i256; + mstore v26 v0 i256; + v27.*@__fe_TransferEvent_12 = bitcast v22 *@__fe_TransferEvent_12; + v29.*@__fe_Address_0 = gep v27 0.i256 1.i256; + mstore v29 v20 i256; + v31.*@__fe_TransferEvent_12 = bitcast v22 *@__fe_TransferEvent_12; + v33.*i256 = gep v31 0.i256 2.i256; + mstore v33 v1 i256; + call %emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9ba82714a4a1f0__6ee531292f5eff63 v3 v23; return; } -func private %assert(v0.i256) { +func private %u256_h3271ca15373d4483_ord_h264f6d6d75097a_ge(v0.i256, v1.i256) -> i1 { block0: - v2.i1 = is_zero v0; - v3.i256 = zext v2 i256; - v4.i1 = ne v3 0.i256; - br v4 block1 block2; + v2.i1 = lt v0 v1; + v3.i1 = is_zero v2; + return v3; +} + +func private %assert(v0.i1) { + block0: + v1.i1 = is_zero v0; + br v1 block1 block2; block1: evm_revert 0.i256 0.i256; @@ -570,14 +612,14 @@ func private %assert(v0.i256) { func private %init_field__Evm_hef0af3106e109414_TokenStore_0__1___db7d7c067dc14cc5(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__TokenStore_0__1___175215aa56127bde v0 v1; - return v3; + v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__TokenStore_0__1___175215aa56127bde v0 v1; + return v2; } func private %init_field__Evm_hef0af3106e109414_AccessControl_3___1911f7c438797961(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__AccessControl_3___3633e113b859df5f v0 v1; - return v3; + v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__AccessControl_3___3633e113b859df5f v0 v1; + return v2; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(v0.i256) { @@ -587,85 +629,83 @@ func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(v0.i256 func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; + v1.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; + return v1; } func private %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6(v0.i256) -> i256 { block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; + v1.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; + return v1; } func private %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6(v0.i256) -> i256 { block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; + v1.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; + return v1; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__TokenStore_0__1___175215aa56127bde(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %stor_ptr__Evm_hef0af3106e109414_TokenStore_0__1___db7d7c067dc14cc5 0.i256 v1; - return v3; + v4.i256 = call %stor_ptr__Evm_hef0af3106e109414_TokenStore_0__1___db7d7c067dc14cc5 0.i256 v1; + return v4; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__AccessControl_3___3633e113b859df5f(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %stor_ptr__Evm_hef0af3106e109414_AccessControl_3___1911f7c438797961 0.i256 v1; - return v3; + v4.i256 = call %stor_ptr__Evm_hef0af3106e109414_AccessControl_3___1911f7c438797961 0.i256 v1; + return v4; } -func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { +func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i32 { block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; - v3.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v2; - v5.i1 = lt v3 4.i256; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; + v1.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; + v2.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v1; + v4.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt v2 4.i256; + br v4 block1 block2; block1: call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort v0; evm_invalid; block2: - v10.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v2 0.i256; - v11.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v10; - return v11; + v8.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v1 0.i256; + v9.i32 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v8; + return v9; } func private %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; - v4.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 4.i256; - return v4; + v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; + v5.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 4.i256; + return v5; } func private %transfer_h13f5ec5985ebba60_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { block0: - v2.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v3.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_Transfer_1 = bitcast v5 *@__fe_Transfer_1; - v8.*@__fe_Address_0 = gep v7 0.i256 0.i256; - mstore v8 v2 i256; - v9.*@__fe_Transfer_1 = bitcast v5 *@__fe_Transfer_1; + v1.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; + v2.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; + v4.*i8 = evm_malloc 64.i256; + v5.i256 = ptr_to_int v4 i256; + v6.*@__fe_Transfer_1 = bitcast v4 *@__fe_Transfer_1; + v8.*@__fe_Address_0 = gep v6 0.i256 0.i256; + mstore v8 v1 i256; + v9.*@__fe_Transfer_1 = bitcast v4 *@__fe_Transfer_1; v11.*i256 = gep v9 0.i256 1.i256; - mstore v11 v3 i256; - return v6; + mstore v11 v2 i256; + return v5; } -func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a(v0.i256, v1.i256) { +func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a(v0.i256, v1.i1) { block0: - v3.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - call %bool_h947c0c03c59c6f07_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v3; - v6.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v7.*@__fe_tuple_14 = int_to_ptr v6 *@__fe_tuple_14; - v8.*i256 = gep v7 0.i256 0.i256; + v2.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; + v4.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v2 32.i256; + call %bool_h947c0c03c59c6f07_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v2; + v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v2; + v6.*@__fe_tuple_14 = int_to_ptr v5 *@__fe_tuple_14; + v8.*i256 = gep v6 0.i256 0.i256; v9.i256 = mload v8 i256; - v10.*@__fe_tuple_14 = int_to_ptr v6 *@__fe_tuple_14; + v10.*@__fe_tuple_14 = int_to_ptr v5 *@__fe_tuple_14; v12.*i256 = gep v10 0.i256 1.i256; v13.i256 = mload v12 i256; call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes 0.i256 v9 v13; @@ -674,54 +714,54 @@ func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__39 func private %approve_h90175fc19dafde67_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { block0: - v2.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v3.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_Approve_2 = bitcast v5 *@__fe_Approve_2; - v8.*@__fe_Address_0 = gep v7 0.i256 0.i256; - mstore v8 v2 i256; - v9.*@__fe_Approve_2 = bitcast v5 *@__fe_Approve_2; + v1.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; + v2.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; + v4.*i8 = evm_malloc 64.i256; + v5.i256 = ptr_to_int v4 i256; + v6.*@__fe_Approve_2 = bitcast v4 *@__fe_Approve_2; + v8.*@__fe_Address_0 = gep v6 0.i256 0.i256; + mstore v8 v1 i256; + v9.*@__fe_Approve_2 = bitcast v4 *@__fe_Approve_2; v11.*i256 = gep v9 0.i256 1.i256; - mstore v11 v3 i256; - return v6; + mstore v11 v2 i256; + return v5; } func private %transferfrom_h939549e4bad999e8_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { block0: + v1.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; v2.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v3.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v4.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_TransferFrom_3 = bitcast v6 *@__fe_TransferFrom_3; - v9.*@__fe_Address_0 = gep v8 0.i256 0.i256; - mstore v9 v2 i256; - v10.*@__fe_TransferFrom_3 = bitcast v6 *@__fe_TransferFrom_3; + v3.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; + v5.*i8 = evm_malloc 96.i256; + v6.i256 = ptr_to_int v5 i256; + v7.*@__fe_TransferFrom_3 = bitcast v5 *@__fe_TransferFrom_3; + v9.*@__fe_Address_0 = gep v7 0.i256 0.i256; + mstore v9 v1 i256; + v10.*@__fe_TransferFrom_3 = bitcast v5 *@__fe_TransferFrom_3; v12.*@__fe_Address_0 = gep v10 0.i256 1.i256; - mstore v12 v3 i256; - v13.*@__fe_TransferFrom_3 = bitcast v6 *@__fe_TransferFrom_3; + mstore v12 v2 i256; + v13.*@__fe_TransferFrom_3 = bitcast v5 *@__fe_TransferFrom_3; v15.*i256 = gep v13 0.i256 2.i256; - mstore v15 v4 i256; - return v7; + mstore v15 v3 i256; + return v6; } func private %balanceof_hf830ebedc81244a7_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { block0: - v2.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - return v2; + v1.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; + return v1; } func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f(v0.i256, v1.i256) { block0: - v3.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v3; - v6.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v7.*@__fe_tuple_14 = int_to_ptr v6 *@__fe_tuple_14; - v8.*i256 = gep v7 0.i256 0.i256; + v2.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; + v4.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v2 32.i256; + call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v2; + v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v2; + v6.*@__fe_tuple_14 = int_to_ptr v5 *@__fe_tuple_14; + v8.*i256 = gep v6 0.i256 0.i256; v9.i256 = mload v8 i256; - v10.*@__fe_tuple_14 = int_to_ptr v6 *@__fe_tuple_14; + v10.*@__fe_tuple_14 = int_to_ptr v5 *@__fe_tuple_14; v12.*i256 = gep v10 0.i256 1.i256; v13.i256 = mload v12 i256; call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes 0.i256 v9 v13; @@ -730,17 +770,17 @@ func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4 func private %allowance_h4bb1267f662bd2a8_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { block0: + v1.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; v2.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v3.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_Allowance_4 = bitcast v5 *@__fe_Allowance_4; - v8.*@__fe_Address_0 = gep v7 0.i256 0.i256; - mstore v8 v2 i256; - v9.*@__fe_Allowance_4 = bitcast v5 *@__fe_Allowance_4; + v4.*i8 = evm_malloc 64.i256; + v5.i256 = ptr_to_int v4 i256; + v6.*@__fe_Allowance_4 = bitcast v4 *@__fe_Allowance_4; + v8.*@__fe_Address_0 = gep v6 0.i256 0.i256; + mstore v8 v1 i256; + v9.*@__fe_Allowance_4 = bitcast v4 *@__fe_Allowance_4; v11.*@__fe_Address_0 = gep v9 0.i256 1.i256; - mstore v11 v3 i256; - return v6; + mstore v11 v2 i256; + return v5; } func private %totalsupply_h6bf4f2c3498c901c_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) { @@ -755,14 +795,14 @@ func private %name_h327e3db4a53b027e_decode_h624c3cd8c996d995_decode__SolDecoder func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_String_32___7798a45a8b22b7ed(v0.i256, v1.i256) { block0: - v3.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - call %string_const_n__usize__h78b9b185054e88a2_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_32_SolEncoder_h1b9228b90dad6928__562228df2278c1ed v1 v3; - v6.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v7.*@__fe_tuple_14 = int_to_ptr v6 *@__fe_tuple_14; - v8.*i256 = gep v7 0.i256 0.i256; + v2.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; + v4.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v2 32.i256; + call %string_const_n__usize__h78b9b185054e88a2_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_32_SolEncoder_h1b9228b90dad6928__562228df2278c1ed v1 v2; + v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v2; + v6.*@__fe_tuple_14 = int_to_ptr v5 *@__fe_tuple_14; + v8.*i256 = gep v6 0.i256 0.i256; v9.i256 = mload v8 i256; - v10.*@__fe_tuple_14 = int_to_ptr v6 *@__fe_tuple_14; + v10.*@__fe_tuple_14 = int_to_ptr v5 *@__fe_tuple_14; v12.*i256 = gep v10 0.i256 1.i256; v13.i256 = mload v12 i256; call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes 0.i256 v9 v13; @@ -776,14 +816,14 @@ func private %symbol_h6dabcb627bde53b9_decode_h624c3cd8c996d995_decode__SolDecod func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_String_8___99627a2b067a3b64(v0.i256, v1.i256) { block0: - v3.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - call %string_const_n__usize__h78b9b185054e88a2_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_32_SolEncoder_h1b9228b90dad6928__562228df2278c1ed v1 v3; - v6.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v7.*@__fe_tuple_14 = int_to_ptr v6 *@__fe_tuple_14; - v8.*i256 = gep v7 0.i256 0.i256; + v2.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; + v4.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v2 32.i256; + call %string_const_n__usize__h78b9b185054e88a2_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_8_SolEncoder_h1b9228b90dad6928__1811d65564ab2650 v1 v2; + v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v2; + v6.*@__fe_tuple_14 = int_to_ptr v5 *@__fe_tuple_14; + v8.*i256 = gep v6 0.i256 0.i256; v9.i256 = mload v8 i256; - v10.*@__fe_tuple_14 = int_to_ptr v6 *@__fe_tuple_14; + v10.*@__fe_tuple_14 = int_to_ptr v5 *@__fe_tuple_14; v12.*i256 = gep v10 0.i256 1.i256; v13.i256 = mload v12 i256; call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes 0.i256 v9 v13; @@ -795,16 +835,16 @@ func private %decimals_h247e095089bd9dcb_decode_h624c3cd8c996d995_decode__SolDec return; } -func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u8__5f40d25b4a1c5efd(v0.i256, v1.i256) { +func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u8__5f40d25b4a1c5efd(v0.i256, v1.i8) { block0: - v3.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - call %u8_hbc9d6eeaea22ffb5_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v3; - v6.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v7.*@__fe_tuple_14 = int_to_ptr v6 *@__fe_tuple_14; - v8.*i256 = gep v7 0.i256 0.i256; + v2.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; + v4.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v2 32.i256; + call %u8_hbc9d6eeaea22ffb5_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v2; + v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v2; + v6.*@__fe_tuple_14 = int_to_ptr v5 *@__fe_tuple_14; + v8.*i256 = gep v6 0.i256 0.i256; v9.i256 = mload v8 i256; - v10.*@__fe_tuple_14 = int_to_ptr v6 *@__fe_tuple_14; + v10.*@__fe_tuple_14 = int_to_ptr v5 *@__fe_tuple_14; v12.*i256 = gep v10 0.i256 1.i256; v13.i256 = mload v12 i256; call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes 0.i256 v9 v13; @@ -813,74 +853,74 @@ func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u8__5f40 func private %mint_ha2f94817be433a2e_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { block0: - v2.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v3.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_Mint_6 = bitcast v5 *@__fe_Mint_6; - v8.*@__fe_Address_0 = gep v7 0.i256 0.i256; - mstore v8 v2 i256; - v9.*@__fe_Mint_6 = bitcast v5 *@__fe_Mint_6; + v1.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; + v2.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; + v4.*i8 = evm_malloc 64.i256; + v5.i256 = ptr_to_int v4 i256; + v6.*@__fe_Mint_6 = bitcast v4 *@__fe_Mint_6; + v8.*@__fe_Address_0 = gep v6 0.i256 0.i256; + mstore v8 v1 i256; + v9.*@__fe_Mint_6 = bitcast v4 *@__fe_Mint_6; v11.*i256 = gep v9 0.i256 1.i256; - mstore v11 v3 i256; - return v6; + mstore v11 v2 i256; + return v5; } func private %burn_h25a61f4466d20eed_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { block0: - v2.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - return v2; + v1.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; + return v1; } func private %burnfrom_ha9fb0972f143e40c_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { block0: - v2.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v3.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_BurnFrom_7 = bitcast v5 *@__fe_BurnFrom_7; - v8.*@__fe_Address_0 = gep v7 0.i256 0.i256; - mstore v8 v2 i256; - v9.*@__fe_BurnFrom_7 = bitcast v5 *@__fe_BurnFrom_7; + v1.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; + v2.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; + v4.*i8 = evm_malloc 64.i256; + v5.i256 = ptr_to_int v4 i256; + v6.*@__fe_BurnFrom_7 = bitcast v4 *@__fe_BurnFrom_7; + v8.*@__fe_Address_0 = gep v6 0.i256 0.i256; + mstore v8 v1 i256; + v9.*@__fe_BurnFrom_7 = bitcast v4 *@__fe_BurnFrom_7; v11.*i256 = gep v9 0.i256 1.i256; - mstore v11 v3 i256; - return v6; + mstore v11 v2 i256; + return v5; } func private %increaseallowance_h9840135eaea36633_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { block0: - v2.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v3.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_IncreaseAllowance_8 = bitcast v5 *@__fe_IncreaseAllowance_8; - v8.*@__fe_Address_0 = gep v7 0.i256 0.i256; - mstore v8 v2 i256; - v9.*@__fe_IncreaseAllowance_8 = bitcast v5 *@__fe_IncreaseAllowance_8; + v1.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; + v2.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; + v4.*i8 = evm_malloc 64.i256; + v5.i256 = ptr_to_int v4 i256; + v6.*@__fe_IncreaseAllowance_8 = bitcast v4 *@__fe_IncreaseAllowance_8; + v8.*@__fe_Address_0 = gep v6 0.i256 0.i256; + mstore v8 v1 i256; + v9.*@__fe_IncreaseAllowance_8 = bitcast v4 *@__fe_IncreaseAllowance_8; v11.*i256 = gep v9 0.i256 1.i256; - mstore v11 v3 i256; - return v6; + mstore v11 v2 i256; + return v5; } func private %decreaseallowance_h635474f45639c83d_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { block0: - v2.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v3.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_DecreaseAllowance_9 = bitcast v5 *@__fe_DecreaseAllowance_9; - v8.*@__fe_Address_0 = gep v7 0.i256 0.i256; - mstore v8 v2 i256; - v9.*@__fe_DecreaseAllowance_9 = bitcast v5 *@__fe_DecreaseAllowance_9; + v1.i256 = call %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; + v2.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; + v4.*i8 = evm_malloc 64.i256; + v5.i256 = ptr_to_int v4 i256; + v6.*@__fe_DecreaseAllowance_9 = bitcast v4 *@__fe_DecreaseAllowance_9; + v8.*@__fe_Address_0 = gep v6 0.i256 0.i256; + mstore v8 v1 i256; + v9.*@__fe_DecreaseAllowance_9 = bitcast v4 *@__fe_DecreaseAllowance_9; v11.*i256 = gep v9 0.i256 1.i256; - mstore v11 v3 i256; - return v6; + mstore v11 v2 i256; + return v5; } -func private %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___u256__Address__bool_3__5e1c6d4e3f4fb7e8(v0.i256, v1.i256, v2.i256) { +func private %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___u256__Address__bool_3__5e1c6d4e3f4fb7e8(v0.i256, v1.i256, v2.i1) { block0: - v4.i256 = call %bool_h947c0c03c59c6f07_wordrepr_h7483d41ac8178d88_to_word v2; - call %storagemap_set_word_with_salt___u256__Address___c7c570db20cdd393 v1 3.i256 v4; + v3.i256 = call %bool_h947c0c03c59c6f07_wordrepr_h7483d41ac8178d88_to_word v2; + call %storagemap_set_word_with_salt___u256__Address___c7c570db20cdd393 v1 3.i256 v3; return; } @@ -889,18 +929,17 @@ func private %address_h257056268eac7027_zero() -> i256 { return 0.i256; } -func private %ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2(v0.i256, v1.i256) -> i256 { +func private %ne__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2(v0.i256, v1.i256) -> i1 { block0: - v3.i256 = call %address_h257056268eac7027_eq_h14b330e44530c410_eq v0 v1; - v4.i1 = is_zero v3; - v5.i256 = zext v4 i256; - return v5; + v2.i1 = call %address_h257056268eac7027_eq_h14b330e44530c410_eq v0 v1; + v3.i1 = is_zero v2; + return v3; } func private %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(v0.i256, v1.i256, v2.i256) { block0: - v4.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word v2; - call %storagemap_set_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29 v1 0.i256 v4; + v3.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word v2; + call %storagemap_set_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29 v1 0.i256 v3; return; } @@ -912,8 +951,8 @@ func private %emit_stor_arg0_root_stor__Evm_hef0af3106e109414_TransferEvent_h1c9 func private %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(v0.i256, v1.i256, v2.i256) { block0: - v4.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word v2; - call %storagemap_set_word_with_salt___Address__Address___c32d499da259c78e v1 1.i256 v4; + v3.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word v2; + call %storagemap_set_word_with_salt___Address__Address___c32d499da259c78e v1 1.i256 v3; return; } @@ -925,9 +964,9 @@ func private %emit_stor_arg0_root_stor__Evm_hef0af3106e109414_ApprovalEvent_h313 func private %storagemap_get_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29 v0 v1; - v4.i256 = evm_sload v3; - return v4; + v2.i256 = call %storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29 v0 v1; + v3.i256 = evm_sload v2; + return v3; } func private %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word(v0.i256) -> i256 { @@ -937,51 +976,57 @@ func private %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word(v0.i25 func private %storagemap_get_word_with_salt___Address__Address___c32d499da259c78e(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e v0 v1; - v4.i256 = evm_sload v3; + v2.i256 = call %storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e v0 v1; + v3.i256 = evm_sload v2; + return v3; +} + +func private %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___u256__Address__bool_3__5e1c6d4e3f4fb7e8(v0.i256, v1.i256) -> i1 { + block0: + v3.i256 = call %storagemap_get_word_with_salt___u256__Address___c7c570db20cdd393 v1 3.i256; + v4.i1 = call %bool_h947c0c03c59c6f07_wordrepr_h7483d41ac8178d88_from_word v3; return v4; } -func private %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___u256__Address__bool_3__5e1c6d4e3f4fb7e8(v0.i256, v1.i256) -> i256 { +func private %bool_h947c0c03c59c6f07_eq_he50383edd273619f_eq(v0.i1, v1.i1) -> i1 { block0: - v4.i256 = call %storagemap_get_word_with_salt___u256__Address___c7c570db20cdd393 v1 3.i256; - v5.i256 = call %bool_h947c0c03c59c6f07_wordrepr_h7483d41ac8178d88_from_word v4; - return v5; + v2.i1 = eq v0 v1; + return v2; } func private %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v2.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - v4.*i8 = evm_malloc 128.i256; - v5.i256 = ptr_to_int v4 i256; - v6.*@__fe_Cursor_15 = int_to_ptr v2 *@__fe_Cursor_15; - v7.*i256 = gep v6 0.i256 0.i256 0.i256; + v1.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; + v3.*i8 = evm_malloc 128.i256; + v4.i256 = ptr_to_int v3 i256; + v5.*@__fe_Cursor_15 = int_to_ptr v1 *@__fe_Cursor_15; + v7.*i256 = gep v5 0.i256 0.i256 0.i256; v8.i256 = mload v7 i256; - v9.*@__fe_SolDecoder_16 = bitcast v4 *@__fe_SolDecoder_16; + v9.*@__fe_SolDecoder_16 = bitcast v3 *@__fe_SolDecoder_16; v10.*i256 = gep v9 0.i256 0.i256 0.i256 0.i256; mstore v10 v8 i256; - v11.*@__fe_Cursor_15 = int_to_ptr v2 *@__fe_Cursor_15; + v11.*@__fe_Cursor_15 = int_to_ptr v1 *@__fe_Cursor_15; v13.*i256 = gep v11 0.i256 0.i256 1.i256; v14.i256 = mload v13 i256; - v15.*@__fe_SolDecoder_16 = bitcast v4 *@__fe_SolDecoder_16; + v15.*@__fe_SolDecoder_16 = bitcast v3 *@__fe_SolDecoder_16; v16.*i256 = gep v15 0.i256 0.i256 0.i256 1.i256; mstore v16 v14 i256; - v17.*@__fe_Cursor_15 = int_to_ptr v2 *@__fe_Cursor_15; + v17.*@__fe_Cursor_15 = int_to_ptr v1 *@__fe_Cursor_15; v18.*i256 = gep v17 0.i256 1.i256; v19.i256 = mload v18 i256; - v20.*@__fe_SolDecoder_16 = bitcast v4 *@__fe_SolDecoder_16; + v20.*@__fe_SolDecoder_16 = bitcast v3 *@__fe_SolDecoder_16; v21.*i256 = gep v20 0.i256 0.i256 1.i256; mstore v21 v19 i256; - v22.*@__fe_SolDecoder_16 = bitcast v4 *@__fe_SolDecoder_16; + v22.*@__fe_SolDecoder_16 = bitcast v3 *@__fe_SolDecoder_16; v23.*i256 = gep v22 0.i256 1.i256; mstore v23 0.i256 i256; - return v5; + return v4; } func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v2.*@__fe_SolDecoder_16 = int_to_ptr v0 *@__fe_SolDecoder_16; - v3.*@__fe_Cursor_15 = gep v2 0.i256 0.i256; + v1.*@__fe_SolDecoder_16 = int_to_ptr v0 *@__fe_SolDecoder_16; + v3.*@__fe_Cursor_15 = gep v1 0.i256 0.i256; v4.i256 = ptr_to_int v3 i256; v5.*@__fe_MemoryBytes_10 = gep v3 0.i256 0.i256; v6.i256 = ptr_to_int v5 i256; @@ -991,16 +1036,8 @@ func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_ v10.i256 = ptr_to_int v9 i256; v12.*i256 = gep v9 0.i256 1.i256; v13.i256 = mload v12 i256; - v15.i256 = add v13 32.i256; - v16.*@__fe_SolDecoder_16 = int_to_ptr v0 *@__fe_SolDecoder_16; - v17.*@__fe_Cursor_15 = gep v16 0.i256 0.i256; - v18.i256 = ptr_to_int v17 i256; - v19.*i256 = gep v17 0.i256 1.i256; - v20.i256 = mload v19 i256; - v21.i1 = lt v15 v20; - v22.i256 = zext v21 i256; - v23.i1 = ne v22 0.i256; - br v23 block1 block3; + (v15.i256, v16.i1) = uaddo v13 32.i256; + br v16 block4 block5; block1: evm_revert 0.i256 0.i256; @@ -1025,22 +1062,32 @@ func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_ return v35; block3: - v43.i1 = gt v15 v7; - v44.i256 = zext v43 i256; - v45.i1 = ne v44 0.i256; - br v45 block1 block2; + v43.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt v15 v7; + br v43 block1 block2; + + block4: + evm_revert 0.i256 0.i256; + + block5: + v18.*@__fe_SolDecoder_16 = int_to_ptr v0 *@__fe_SolDecoder_16; + v19.*@__fe_Cursor_15 = gep v18 0.i256 0.i256; + v20.i256 = ptr_to_int v19 i256; + v21.*i256 = gep v19 0.i256 1.i256; + v22.i256 = mload v21 i256; + v23.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt v15 v22; + br v23 block1 block3; } func private %stor_ptr__Evm_hef0af3106e109414_TokenStore_0__1___db7d7c067dc14cc5(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__TokenStore_0__1___175215aa56127bde v1; - return v3; + v2.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__TokenStore_0__1___175215aa56127bde v1; + return v2; } func private %stor_ptr__Evm_hef0af3106e109414_AccessControl_3___1911f7c438797961(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__TokenStore_0__1___175215aa56127bde v1; - return v3; + v2.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__AccessControl_3___3633e113b859df5f v1; + return v2; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256) -> i256 { @@ -1050,86 +1097,106 @@ func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256 func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { block0: - v2.i256 = evm_calldata_size; - v3.i256 = sub v2 v0; - return v3; + v1.i256 = evm_calldata_size; + (v2.i256, v3.i1) = usubo v1 v0; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; +} + +func private %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = lt v0 v1; + return v2; } func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = add v0 v1; - v4.i256 = add v0 v1; - v5.i256 = evm_calldata_load v4; + (v2.i256, v3.i1) = uaddo v0 v1; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v5.i256 = evm_calldata_load v2; return v5; } -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i256 { +func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i32 { block0: - v3.i256 = shr 224.i256 v0; - v4.i256 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v3; - return v4; + v2.i256 = shr 224.i256 v0; + v3.i32 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v2; + return v3; } func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; - return v3; + v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; + return v2; } func private %address_h257056268eac7027_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98(v0.i256) -> i256 { block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - return v2; + v1.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; + return v1; } func private %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98(v0.i256) -> i256 { block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - return v2; + v1.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; + return v1; } func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() -> i256 { block0: - v1.i256 = call %solencoder_h1b9228b90dad6928_new; - return v1; + v0.i256 = call %solencoder_h1b9228b90dad6928_new; + return v0; } func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; - v4.*i256 = gep v3 0.i256 0.i256; + v2.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; + v4.*i256 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; - v6.i1 = eq v5 0.i256; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block1 block2; + v6.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq v5 0.i256; + br v6 block1 block2; block1: - v10.*i8 = evm_malloc v1; - v11.i256 = ptr_to_int v10 i256; + v8.*i8 = evm_malloc v1; + v9.i256 = ptr_to_int v8 i256; + v11.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; + v12.*i256 = gep v11 0.i256 0.i256; + mstore v12 v9 i256; v13.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; - v14.*i256 = gep v13 0.i256 0.i256; - mstore v14 v11 i256; - v15.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; - v17.*i256 = gep v15 0.i256 1.i256; - mstore v17 v11 i256; - v18.i256 = add v11 v1; - v19.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; - v21.*i256 = gep v19 0.i256 2.i256; - mstore v21 v18 i256; - jump block2; + v15.*i256 = gep v13 0.i256 1.i256; + mstore v15 v9 i256; + (v16.i256, v17.i1) = uaddo v9 v1; + br v17 block3 block4; block2: v23.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; v24.*i256 = gep v23 0.i256 0.i256; v25.i256 = mload v24 i256; return v25; + + block3: + evm_revert 0.i256 0.i256; + + block4: + v19.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; + v21.*i256 = gep v19 0.i256 2.i256; + mstore v21 v16 i256; + jump block2; } -func private %bool_h947c0c03c59c6f07_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { +func private %bool_h947c0c03c59c6f07_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i1, v1.i256) { block0: - v3.i1 = ne v0 0.i256; - br v3 block1 block3; + br v0 block1 block3; block1: call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word v1 1.i256; @@ -1145,22 +1212,28 @@ func private %bool_h947c0c03c59c6f07_encode_hab7243eccf2714fb_encode__Sol_hfd482 func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0.i256) -> i256 { block0: - v2.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; - v3.*i256 = gep v2 0.i256 0.i256; + v1.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; + v3.*i256 = gep v1 0.i256 0.i256; v4.i256 = mload v3 i256; v5.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; v7.*i256 = gep v5 0.i256 2.i256; v8.i256 = mload v7 i256; - v10.*i8 = evm_malloc 64.i256; - v11.i256 = ptr_to_int v10 i256; - v12.*@__fe_tuple_14 = bitcast v10 *@__fe_tuple_14; - v13.*i256 = gep v12 0.i256 0.i256; - mstore v13 v4 i256; - v14.i256 = sub v8 v4; - v15.*@__fe_tuple_14 = bitcast v10 *@__fe_tuple_14; - v17.*i256 = gep v15 0.i256 1.i256; - mstore v17 v14 i256; - return v11; + (v9.i256, v10.i1) = usubo v8 v4; + br v10 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v12.*i8 = evm_malloc 64.i256; + v13.i256 = ptr_to_int v12 i256; + v15.*@__fe_tuple_14 = bitcast v12 *@__fe_tuple_14; + v16.*i256 = gep v15 0.i256 0.i256; + mstore v16 v4 i256; + v17.*@__fe_tuple_14 = bitcast v12 *@__fe_tuple_14; + v19.*i256 = gep v17 0.i256 1.i256; + mstore v19 v9 i256; + return v13; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(v0.i256, v1.i256, v2.i256) { @@ -1180,16 +1253,22 @@ func private %string_const_n__usize__h78b9b185054e88a2_encode_hab7243eccf2714fb_ return; } -func private %u8_hbc9d6eeaea22ffb5_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { +func private %string_const_n__usize__h78b9b185054e88a2_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_8_SolEncoder_h1b9228b90dad6928__1811d65564ab2650(v0.i256, v1.i256) { block0: call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word v1 v0; return; } -func private %bool_h947c0c03c59c6f07_wordrepr_h7483d41ac8178d88_to_word(v0.i256) -> i256 { +func private %u8_hbc9d6eeaea22ffb5_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i8, v1.i256) { block0: - v2.i1 = ne v0 0.i256; - br v2 block1 block2; + v2.i256 = zext v0 i256; + call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word v1 v2; + return; +} + +func private %bool_h947c0c03c59c6f07_wordrepr_h7483d41ac8178d88_to_word(v0.i1) -> i256 { + block0: + br v0 block1 block2; block1: jump block3; @@ -1198,22 +1277,21 @@ func private %bool_h947c0c03c59c6f07_wordrepr_h7483d41ac8178d88_to_word(v0.i256) jump block3; block3: - v4.i256 = phi (1.i256 block1) (0.i256 block2); - return v4; + v3.i256 = phi (1.i256 block1) (0.i256 block2); + return v3; } func private %storagemap_set_word_with_salt___u256__Address___c7c570db20cdd393(v0.i256, v1.i256, v2.i256) { block0: - v4.i256 = call %storagemap_storage_slot_with_salt___u256__Address___c7c570db20cdd393 v0 v1; - evm_sstore v4 v2; + v3.i256 = call %storagemap_storage_slot_with_salt___u256__Address___c7c570db20cdd393 v0 v1; + evm_sstore v3 v2; return; } -func private %address_h257056268eac7027_eq_h14b330e44530c410_eq(v0.i256, v1.i256) -> i256 { +func private %address_h257056268eac7027_eq_h14b330e44530c410_eq(v0.i256, v1.i256) -> i1 { block0: - v3.i1 = eq v0 v1; - v4.i256 = zext v3 i256; - return v4; + v2.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq v0 v1; + return v2; } func private %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word(v0.i256) -> i256 { @@ -1223,20 +1301,20 @@ func private %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word(v0.i256) func private %storagemap_set_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29(v0.i256, v1.i256, v2.i256) { block0: - v4.i256 = call %storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29 v0 v1; - evm_sstore v4 v2; + v3.i256 = call %storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29 v0 v1; + evm_sstore v3 v2; return; } func private %transferevent_h1c9ba82714a4a1f0_event_hd33e4481d4a34b05_emit_arg1_root_stor__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) { block0: - v3.i256 = call %solencoder_h1b9228b90dad6928_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - v6.*@__fe_TransferEvent_12 = int_to_ptr v0 *@__fe_TransferEvent_12; - v8.*i256 = gep v6 0.i256 2.i256; + v2.i256 = call %solencoder_h1b9228b90dad6928_new; + v4.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v2 32.i256; + v5.*@__fe_TransferEvent_12 = int_to_ptr v0 *@__fe_TransferEvent_12; + v8.*i256 = gep v5 0.i256 2.i256; v9.i256 = mload v8 i256; - call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v9 v3; - v10.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; + call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v9 v2; + v10.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v2; v11.*@__fe_tuple_14 = int_to_ptr v10 *@__fe_tuple_14; v12.*i256 = gep v11 0.i256 0.i256; v13.i256 = mload v12 i256; @@ -1257,20 +1335,20 @@ func private %transferevent_h1c9ba82714a4a1f0_event_hd33e4481d4a34b05_emit_arg1_ func private %storagemap_set_word_with_salt___Address__Address___c32d499da259c78e(v0.i256, v1.i256, v2.i256) { block0: - v4.i256 = call %storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e v0 v1; - evm_sstore v4 v2; + v3.i256 = call %storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e v0 v1; + evm_sstore v3 v2; return; } func private %approvalevent_h313d94630b6580e5_event_hd33e4481d4a34b05_emit_arg1_root_stor__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) { block0: - v3.i256 = call %solencoder_h1b9228b90dad6928_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - v6.*@__fe_ApprovalEvent_13 = int_to_ptr v0 *@__fe_ApprovalEvent_13; - v8.*i256 = gep v6 0.i256 2.i256; + v2.i256 = call %solencoder_h1b9228b90dad6928_new; + v4.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v2 32.i256; + v5.*@__fe_ApprovalEvent_13 = int_to_ptr v0 *@__fe_ApprovalEvent_13; + v8.*i256 = gep v5 0.i256 2.i256; v9.i256 = mload v8 i256; - call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v9 v3; - v10.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; + call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v9 v2; + v10.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v2; v11.*@__fe_tuple_14 = int_to_ptr v10 *@__fe_tuple_14; v12.*i256 = gep v11 0.i256 0.i256; v13.i256 = mload v12 i256; @@ -1294,12 +1372,20 @@ func private %storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab9 v3.*i8 = evm_malloc 0.i256; v4.i256 = ptr_to_int v3 i256; v5.i256 = call %address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key v4 v0; - v6.i256 = add v4 v5; + (v6.i256, v7.i1) = uaddo v4 v5; + br v7 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: mstore v6 v1 i256; - v8.i256 = add v5 32.i256; - v9.i256 = add v5 32.i256; - v10.i256 = evm_keccak256 v4 v9; - return v10; + (v11.i256, v12.i1) = uaddo v5 32.i256; + br v12 block1 block3; + + block3: + v14.i256 = evm_keccak256 v4 v11; + return v14; } func private %storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e(v0.i256, v1.i256) -> i256 { @@ -1307,67 +1393,78 @@ func private %storagemap_storage_slot_with_salt___Address__Address___c32d499da25 v3.*i8 = evm_malloc 0.i256; v4.i256 = ptr_to_int v3 i256; v5.i256 = call %_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v4 v0; - v6.i256 = add v4 v5; + (v6.i256, v7.i1) = uaddo v4 v5; + br v7 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: mstore v6 v1 i256; - v8.i256 = add v5 32.i256; - v9.i256 = add v5 32.i256; - v10.i256 = evm_keccak256 v4 v9; - return v10; + (v11.i256, v12.i1) = uaddo v5 32.i256; + br v12 block1 block3; + + block3: + v14.i256 = evm_keccak256 v4 v11; + return v14; } func private %storagemap_get_word_with_salt___u256__Address___c7c570db20cdd393(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storagemap_storage_slot_with_salt___u256__Address___c7c570db20cdd393 v0 v1; - v4.i256 = evm_sload v3; - return v4; + v2.i256 = call %storagemap_storage_slot_with_salt___u256__Address___c7c570db20cdd393 v0 v1; + v3.i256 = evm_sload v2; + return v3; } -func private %bool_h947c0c03c59c6f07_wordrepr_h7483d41ac8178d88_from_word(v0.i256) -> i256 { +func private %bool_h947c0c03c59c6f07_wordrepr_h7483d41ac8178d88_from_word(v0.i256) -> i1 { block0: - v2.i1 = eq v0 0.i256; - v3.i1 = is_zero v2; - v4.i256 = zext v3 i256; - return v4; + v2.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_ne v0 0.i256; + return v2; } func private %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v3.*i8 = evm_malloc 96.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_MemoryBytes_10 = int_to_ptr v0 *@__fe_MemoryBytes_10; - v6.*i256 = gep v5 0.i256 0.i256; + v2.*i8 = evm_malloc 96.i256; + v3.i256 = ptr_to_int v2 i256; + v4.*@__fe_MemoryBytes_10 = int_to_ptr v0 *@__fe_MemoryBytes_10; + v6.*i256 = gep v4 0.i256 0.i256; v7.i256 = mload v6 i256; - v8.*@__fe_Cursor_15 = bitcast v3 *@__fe_Cursor_15; + v8.*@__fe_Cursor_15 = bitcast v2 *@__fe_Cursor_15; v9.*i256 = gep v8 0.i256 0.i256 0.i256; mstore v9 v7 i256; v10.*@__fe_MemoryBytes_10 = int_to_ptr v0 *@__fe_MemoryBytes_10; v12.*i256 = gep v10 0.i256 1.i256; v13.i256 = mload v12 i256; - v14.*@__fe_Cursor_15 = bitcast v3 *@__fe_Cursor_15; + v14.*@__fe_Cursor_15 = bitcast v2 *@__fe_Cursor_15; v15.*i256 = gep v14 0.i256 0.i256 1.i256; mstore v15 v13 i256; - v16.*@__fe_Cursor_15 = bitcast v3 *@__fe_Cursor_15; + v16.*@__fe_Cursor_15 = bitcast v2 *@__fe_Cursor_15; v17.*i256 = gep v16 0.i256 1.i256; mstore v17 0.i256 i256; - return v4; + return v3; } func private %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { block0: - v2.*@__fe_MemoryBytes_10 = int_to_ptr v0 *@__fe_MemoryBytes_10; - v4.*i256 = gep v2 0.i256 1.i256; + v1.*@__fe_MemoryBytes_10 = int_to_ptr v0 *@__fe_MemoryBytes_10; + v4.*i256 = gep v1 0.i256 1.i256; v5.i256 = mload v4 i256; return v5; } func private %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_MemoryBytes_10 = int_to_ptr v0 *@__fe_MemoryBytes_10; - v4.*i256 = gep v3 0.i256 0.i256; + v2.*@__fe_MemoryBytes_10 = int_to_ptr v0 *@__fe_MemoryBytes_10; + v4.*i256 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; - v6.i256 = add v5 v1; - v7.i256 = add v5 v1; - v8.i256 = mload v7 i256; + (v6.i256, v7.i1) = uaddo v5 v1; + br v7 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v8.i256 = mload v6 i256; return v8; } @@ -1376,41 +1473,46 @@ func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_r return v0; } -func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i256 { +func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__AccessControl_3___3633e113b859df5f(v0.i256) -> i256 { block0: - v2.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; - v3.i256 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v2; - return v3; + return v0; +} + +func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i32 { + block0: + v1.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; + v2.i32 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v1; + return v2; } func private %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - v4.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 v1; - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_Cursor_19 = int_to_ptr v4 *@__fe_Cursor_19; - v9.*i256 = gep v8 0.i256 0.i256 0.i256; + v2.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; + v3.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 v1; + v5.*i8 = evm_malloc 96.i256; + v6.i256 = ptr_to_int v5 i256; + v7.*@__fe_Cursor_19 = int_to_ptr v3 *@__fe_Cursor_19; + v9.*i256 = gep v7 0.i256 0.i256 0.i256; v10.i256 = mload v9 i256; - v11.*@__fe_SolDecoder_20 = bitcast v6 *@__fe_SolDecoder_20; + v11.*@__fe_SolDecoder_20 = bitcast v5 *@__fe_SolDecoder_20; v12.*i256 = gep v11 0.i256 0.i256 0.i256 0.i256; mstore v12 v10 i256; - v13.*@__fe_Cursor_19 = int_to_ptr v4 *@__fe_Cursor_19; + v13.*@__fe_Cursor_19 = int_to_ptr v3 *@__fe_Cursor_19; v15.*i256 = gep v13 0.i256 1.i256; v16.i256 = mload v15 i256; - v17.*@__fe_SolDecoder_20 = bitcast v6 *@__fe_SolDecoder_20; + v17.*@__fe_SolDecoder_20 = bitcast v5 *@__fe_SolDecoder_20; v18.*i256 = gep v17 0.i256 0.i256 1.i256; mstore v18 v16 i256; - v19.*@__fe_SolDecoder_20 = bitcast v6 *@__fe_SolDecoder_20; + v19.*@__fe_SolDecoder_20 = bitcast v5 *@__fe_SolDecoder_20; v20.*i256 = gep v19 0.i256 1.i256; mstore v20 v1 i256; - return v7; + return v6; } func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256) -> i256 { block0: - v2.*@__fe_SolDecoder_20 = int_to_ptr v0 *@__fe_SolDecoder_20; - v3.*@__fe_Cursor_19 = gep v2 0.i256 0.i256; + v1.*@__fe_SolDecoder_20 = int_to_ptr v0 *@__fe_SolDecoder_20; + v3.*@__fe_Cursor_19 = gep v1 0.i256 0.i256; v4.i256 = ptr_to_int v3 i256; v5.*@__fe_CallData_18 = gep v3 0.i256 0.i256; v6.i256 = mload v5 i256; @@ -1420,16 +1522,8 @@ func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_ v10.i256 = ptr_to_int v9 i256; v12.*i256 = gep v9 0.i256 1.i256; v13.i256 = mload v12 i256; - v15.i256 = add v13 32.i256; - v16.*@__fe_SolDecoder_20 = int_to_ptr v0 *@__fe_SolDecoder_20; - v17.*@__fe_Cursor_19 = gep v16 0.i256 0.i256; - v18.i256 = ptr_to_int v17 i256; - v19.*i256 = gep v17 0.i256 1.i256; - v20.i256 = mload v19 i256; - v21.i1 = lt v15 v20; - v22.i256 = zext v21 i256; - v23.i1 = ne v22 0.i256; - br v23 block1 block3; + (v15.i256, v16.i1) = uaddo v13 32.i256; + br v16 block4 block5; block1: evm_revert 0.i256 0.i256; @@ -1454,38 +1548,60 @@ func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_ return v35; block3: - v43.i1 = gt v15 v7; - v44.i256 = zext v43 i256; - v45.i1 = ne v44 0.i256; - br v45 block1 block2; + v43.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt v15 v7; + br v43 block1 block2; + + block4: + evm_revert 0.i256 0.i256; + + block5: + v18.*@__fe_SolDecoder_20 = int_to_ptr v0 *@__fe_SolDecoder_20; + v19.*@__fe_Cursor_19 = gep v18 0.i256 0.i256; + v20.i256 = ptr_to_int v19 i256; + v21.*i256 = gep v19 0.i256 1.i256; + v22.i256 = mload v21 i256; + v23.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt v15 v22; + br v23 block1 block3; } func private %solencoder_h1b9228b90dad6928_new() -> i256 { block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v4.*@__fe_SolEncoder_17 = bitcast v2 *@__fe_SolEncoder_17; + v1.*i8 = evm_malloc 96.i256; + v2.i256 = ptr_to_int v1 i256; + v4.*@__fe_SolEncoder_17 = bitcast v1 *@__fe_SolEncoder_17; v5.*i256 = gep v4 0.i256 0.i256; mstore v5 0.i256 i256; - v6.*@__fe_SolEncoder_17 = bitcast v2 *@__fe_SolEncoder_17; + v6.*@__fe_SolEncoder_17 = bitcast v1 *@__fe_SolEncoder_17; v8.*i256 = gep v6 0.i256 1.i256; mstore v8 0.i256 i256; - v9.*@__fe_SolEncoder_17 = bitcast v2 *@__fe_SolEncoder_17; + v9.*@__fe_SolEncoder_17 = bitcast v1 *@__fe_SolEncoder_17; v11.*i256 = gep v9 0.i256 2.i256; mstore v11 0.i256 i256; - return v3; + return v2; +} + +func private %u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; + return v2; } func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word(v0.i256, v1.i256) { block0: - v3.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; - v5.*i256 = gep v3 0.i256 1.i256; + v2.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; + v5.*i256 = gep v2 0.i256 1.i256; v6.i256 = mload v5 i256; mstore v6 v1 i256; - v8.i256 = add v6 32.i256; - v9.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; - v10.*i256 = gep v9 0.i256 1.i256; - mstore v10 v8 i256; + (v8.i256, v9.i1) = uaddo v6 32.i256; + br v9 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v11.*@__fe_SolEncoder_17 = int_to_ptr v0 *@__fe_SolEncoder_17; + v12.*i256 = gep v11 0.i256 1.i256; + mstore v12 v8 i256; return; } @@ -1494,12 +1610,20 @@ func private %storagemap_storage_slot_with_salt___u256__Address___c7c570db20cdd3 v3.*i8 = evm_malloc 0.i256; v4.i256 = ptr_to_int v3 i256; v5.i256 = call %_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__u256_Address_h257056268eac7027__802280feae02d9df v4 v0; - v6.i256 = add v4 v5; + (v6.i256, v7.i1) = uaddo v4 v5; + br v7 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: mstore v6 v1 i256; - v8.i256 = add v5 32.i256; - v9.i256 = add v5 32.i256; - v10.i256 = evm_keccak256 v4 v9; - return v10; + (v11.i256, v12.i1) = uaddo v5 32.i256; + br v12 block1 block3; + + block3: + v14.i256 = evm_keccak256 v4 v11; + return v14; } func private %address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic(v0.i256) -> i256 { @@ -1515,23 +1639,39 @@ func private %evm_hef0af3106e109414_log_h22d1a10952034bae_log3_arg0_root_stor(v0 func private %address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key v0 v1; - return v3; + v2.i256 = call %u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key v0 v1; + return v2; } func private %_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_tuple_5 = int_to_ptr v1 *@__fe_tuple_5; - v4.*@__fe_Address_0 = gep v3 0.i256 0.i256; + v2.*@__fe_tuple_5 = int_to_ptr v1 *@__fe_tuple_5; + v4.*@__fe_Address_0 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; v6.i256 = call %address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key v0 v5; - v7.*@__fe_tuple_5 = int_to_ptr v1 *@__fe_tuple_5; - v9.*@__fe_Address_0 = gep v7 0.i256 1.i256; - v10.i256 = mload v9 i256; - v11.i256 = add v0 v6; - v12.i256 = call %address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key v11 v10; - v13.i256 = add v6 v12; - return v13; + (v7.i256, v8.i1) = uaddo v0 v6; + br v8 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v10.*@__fe_tuple_5 = int_to_ptr v1 *@__fe_tuple_5; + v12.*@__fe_Address_0 = gep v10 0.i256 1.i256; + v13.i256 = mload v12 i256; + v14.i256 = call %address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key v7 v13; + (v16.i256, v17.i1) = uaddo v6 v14; + br v17 block1 block3; + + block3: + return v16; +} + +func private %u256_h3271ca15373d4483_eq_he50383edd273619f_ne(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; + v3.i1 = is_zero v2; + return v3; } func private %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0.i256) -> i256 { @@ -1539,28 +1679,29 @@ func private %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0.i256) return v0; } -func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i256 { +func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i32 { block0: - return v0; + v1.i32 = trunc v0 i32; + return v1; } func private %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256) -> i256 { block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_19 = bitcast v3 *@__fe_Cursor_19; - v6.*@__fe_CallData_18 = gep v5 0.i256 0.i256; + v2.*i8 = evm_malloc 64.i256; + v3.i256 = ptr_to_int v2 i256; + v4.*@__fe_Cursor_19 = bitcast v2 *@__fe_Cursor_19; + v6.*@__fe_CallData_18 = gep v4 0.i256 0.i256; mstore v6 v0 i256; - v7.*@__fe_Cursor_19 = bitcast v3 *@__fe_Cursor_19; + v7.*@__fe_Cursor_19 = bitcast v2 *@__fe_Cursor_19; v9.*i256 = gep v7 0.i256 1.i256; mstore v9 0.i256 i256; - return v4; + return v3; } func private %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_Cursor_19 = int_to_ptr v0 *@__fe_Cursor_19; - v4.*@__fe_CallData_18 = gep v3 0.i256 0.i256; + v2.*@__fe_Cursor_19 = int_to_ptr v0 *@__fe_Cursor_19; + v4.*@__fe_CallData_18 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; v7.*i8 = evm_malloc 64.i256; v8.i256 = ptr_to_int v7 i256; @@ -1575,17 +1716,26 @@ func private %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5 func private %_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__u256_Address_h257056268eac7027__802280feae02d9df(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_tuple_11 = int_to_ptr v1 *@__fe_tuple_11; - v4.*i256 = gep v3 0.i256 0.i256; + v2.*@__fe_tuple_11 = int_to_ptr v1 *@__fe_tuple_11; + v4.*i256 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; v6.i256 = call %u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key v0 v5; - v7.*@__fe_tuple_11 = int_to_ptr v1 *@__fe_tuple_11; - v9.*@__fe_Address_0 = gep v7 0.i256 1.i256; - v10.i256 = mload v9 i256; - v11.i256 = add v0 v6; - v12.i256 = call %address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key v11 v10; - v13.i256 = add v6 v12; - return v13; + (v7.i256, v8.i1) = uaddo v0 v6; + br v8 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v10.*@__fe_tuple_11 = int_to_ptr v1 *@__fe_tuple_11; + v12.*@__fe_Address_0 = gep v10 0.i256 1.i256; + v13.i256 = mload v12 i256; + v14.i256 = call %address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key v7 v13; + (v16.i256, v17.i1) = uaddo v6 v14; + br v17 block1 block3; + + block3: + return v16; } func private %u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key(v0.i256, v1.i256) -> i256 { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/erc20_low_level.snap b/crates/codegen/tests/fixtures/sonatina_ir/erc20_low_level.snap index a2c18915a3..34f58168bb 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/erc20_low_level.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/erc20_low_level.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 expression: output input_file: crates/codegen/tests/fixtures/erc20_low_level.fe --- @@ -25,32 +24,32 @@ func private %abi_encode_string__Evm_hef0af3106e109414__3af54274b2985741(v0.i256 func private %init__StorPtr_Evm___207f35a85ac4062e() { block0: - v1.i256 = call %stor_ptr_stor__Evm_hef0af3106e109414_Erc20_0__1___536307fd4fe270cd 0.i256 0.i256; - call %do_init__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb v1 0.i256 0.i256; - v2.i256 = sym_size &runtime__StorPtr_Evm___207f35a85ac4062e; - v3.i256 = sym_addr &runtime__StorPtr_Evm___207f35a85ac4062e; - evm_code_copy 0.i256 v3 v2; - evm_return 0.i256 v2; + v2.i256 = call %stor_ptr_stor__Evm_hef0af3106e109414_Erc20_0__1___536307fd4fe270cd 0.i256 0.i256; + call %do_init__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb v2 0.i256 0.i256; + v5.i256 = sym_size &runtime__StorPtr_Evm___207f35a85ac4062e; + v6.i256 = sym_addr &runtime__StorPtr_Evm___207f35a85ac4062e; + evm_code_copy 0.i256 v6 v5; + evm_return 0.i256 v5; } func private %runtime__StorPtr_Evm___207f35a85ac4062e() { block0: - v1.i256 = call %stor_ptr_stor__Evm_hef0af3106e109414_Erc20_0__1___536307fd4fe270cd 0.i256 0.i256; - v2.i256 = evm_calldata_load 0.i256; - v4.i256 = shr 224.i256 v2; + v2.i256 = call %stor_ptr_stor__Evm_hef0af3106e109414_Erc20_0__1___536307fd4fe270cd 0.i256 0.i256; + v3.i256 = evm_calldata_load 0.i256; + v5.i256 = shr 224.i256 v3; jump block11; block1: - v6.i256 = evm_calldata_load 4.i256; - v8.i256 = call %balance_of__0_1_StorPtr_Erc20_0__1____896784bc09903ba1 v6 v1; - call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v8 0.i256; + v7.i256 = evm_calldata_load 4.i256; + v9.i256 = call %balance_of__0_1_StorPtr_Erc20_0__1____896784bc09903ba1 v7 v2; + call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v9 0.i256; evm_invalid; block2: - v9.i256 = evm_calldata_load 4.i256; - v11.i256 = evm_calldata_load 36.i256; - v13.i256 = call %allowance__0_1_StorPtr_Erc20_0__1____896784bc09903ba1 v9 v11 v1; - call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v13 0.i256; + v11.i256 = evm_calldata_load 4.i256; + v13.i256 = evm_calldata_load 36.i256; + v15.i256 = call %allowance__0_1_StorPtr_Erc20_0__1____896784bc09903ba1 v11 v13 v2; + call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v15 0.i256; evm_invalid; block3: @@ -66,85 +65,85 @@ func private %runtime__StorPtr_Evm___207f35a85ac4062e() { evm_invalid; block6: - v19.i256 = evm_calldata_load 4.i256; - v20.i256 = evm_calldata_load 36.i256; - v22.i256 = call %transfer__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb v19 v20 v1 0.i256 0.i256; - call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v22 0.i256; + v25.i256 = evm_calldata_load 4.i256; + v26.i256 = evm_calldata_load 36.i256; + v30.i256 = call %transfer__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb v25 v26 v2 0.i256 0.i256; + call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v30 0.i256; evm_invalid; block7: - v23.i256 = evm_calldata_load 4.i256; - v24.i256 = evm_calldata_load 36.i256; - v26.i256 = call %approve__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414__68ea22e02fe2444b v23 v24 v1 0.i256; - call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v26 0.i256; + v32.i256 = evm_calldata_load 4.i256; + v33.i256 = evm_calldata_load 36.i256; + v36.i256 = call %approve__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414__68ea22e02fe2444b v32 v33 v2 0.i256; + call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v36 0.i256; evm_invalid; block8: - v27.i256 = evm_calldata_load 4.i256; - v28.i256 = evm_calldata_load 36.i256; - v30.i256 = evm_calldata_load 68.i256; - v32.i256 = call %transfer_from__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb v27 v28 v30 v1 0.i256 0.i256; - call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v32 0.i256; + v38.i256 = evm_calldata_load 4.i256; + v39.i256 = evm_calldata_load 36.i256; + v41.i256 = evm_calldata_load 68.i256; + v45.i256 = call %transfer_from__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb v38 v39 v41 v2 0.i256 0.i256; + call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v45 0.i256; evm_invalid; block9: - v33.i256 = evm_calldata_load 4.i256; - v34.i256 = evm_calldata_load 36.i256; - v36.i256 = call %mint__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb v33 v34 v1 0.i256 0.i256; - call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v36 0.i256; + v47.i256 = evm_calldata_load 4.i256; + v48.i256 = evm_calldata_load 36.i256; + v52.i256 = call %mint__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb v47 v48 v2 0.i256 0.i256; + call %abi_encode_u256__Evm_hef0af3106e109414__3af54274b2985741 v52 0.i256; evm_invalid; block10: evm_revert 0.i256 0.i256; block11: - br_table v4 block10 (1889567281.i256 block1) (3714247998.i256 block2) (117300739.i256 block3) (2514000705.i256 block4) (826074471.i256 block5) (2835717307.i256 block6) (157198259.i256 block7) (599290589.i256 block8) (1086394137.i256 block9); + br_table v5 block10 (1889567281.i256 block1) (3714247998.i256 block2) (117300739.i256 block3) (2514000705.i256 block4) (826074471.i256 block5) (2835717307.i256 block6) (157198259.i256 block7) (599290589.i256 block8) (1086394137.i256 block9); } func private %stor_ptr_stor__Evm_hef0af3106e109414_Erc20_0__1___536307fd4fe270cd(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Erc20_0__1___b48e7ab92637d703 v1; - return v3; + v2.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Erc20_0__1___b48e7ab92637d703 v1; + return v2; } func private %do_init__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb(v0.i256, v1.i256, v2.i256) { block0: - v4.i256 = evm_caller; - call %erc20_______h94f6fe6e679122ca_set_owner_once_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2 v0 v4 v2; + v3.i256 = evm_caller; + call %erc20_______h94f6fe6e679122ca_set_owner_once_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2 v0 v3 v2; return; } func private %balance_of__0_1_StorPtr_Erc20_0__1____896784bc09903ba1(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0; - return v3; + v4.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v0; + return v4; } func private %allowance__0_1_StorPtr_Erc20_0__1____896784bc09903ba1(v0.i256, v1.i256, v2.i256) -> i256 { block0: - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_tuple_1 = bitcast v5 *@__fe_tuple_1; - v8.*@__fe_Address_0 = gep v7 0.i256 0.i256; + v4.*i8 = evm_malloc 64.i256; + v5.i256 = ptr_to_int v4 i256; + v6.*@__fe_tuple_1 = bitcast v4 *@__fe_tuple_1; + v8.*@__fe_Address_0 = gep v6 0.i256 0.i256; mstore v8 v0 i256; - v9.*@__fe_tuple_1 = bitcast v5 *@__fe_tuple_1; + v9.*@__fe_tuple_1 = bitcast v4 *@__fe_tuple_1; v11.*@__fe_Address_0 = gep v9 0.i256 1.i256; mstore v11 v1 i256; - v12.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v6; - return v12; + v13.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v5; + return v13; } func private %transfer__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414_Evm_hef0af3106e109414__d36080519ce8fddb(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256) -> i256 { block0: - v6.i256 = evm_caller; - call %erc20_______h94f6fe6e679122ca_transfer_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2 v2 v6 v0 v1 v4; + v5.i256 = evm_caller; + call %erc20_______h94f6fe6e679122ca_transfer_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2 v2 v5 v0 v1 v4; return 1.i256; } func private %approve__0_1_StorPtr_Erc20_0__1___Evm_hef0af3106e109414__68ea22e02fe2444b(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { block0: - v5.i256 = evm_caller; - call %erc20_______h94f6fe6e679122ca_approve_stor_arg0_root_stor__0_1__e4c8be10cab939c2 v2 v5 v0 v1; + v4.i256 = evm_caller; + call %erc20_______h94f6fe6e679122ca_approve_stor_arg0_root_stor__0_1__e4c8be10cab939c2 v2 v4 v0 v1; return 1.i256; } @@ -167,19 +166,18 @@ func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_r func private %erc20_______h94f6fe6e679122ca_set_owner_once_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2(v0.i256, v1.i256, v2.i256) { block0: - v5.i256 = add v0 1.i256; - v6.i256 = evm_sload v5; - v7.i256 = call %address_h257056268eac7027_zero; - v8.i256 = call %ne_stor_arg0_root_stor__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v6 v7; - v9.i1 = ne v8 0.i256; - br v9 block1 block2; + v4.i256 = add v0 1.i256; + v5.i256 = evm_sload v4; + v6.i256 = call %address_h257056268eac7027_zero; + v7.i1 = call %ne_stor_arg0_root_stor__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v5 v6; + br v7 block1 block2; block1: evm_revert 0.i256 0.i256; block2: - v12.i256 = add v0 1.i256; - evm_sstore v12 v1; + v11.i256 = add v0 1.i256; + evm_sstore v11 v1; return; } @@ -192,91 +190,110 @@ func private %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0 func private %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(v0.i256, v1.i256) -> i256 { block0: - v4.i256 = call %storagemap_get_word_with_salt___Address__Address___c32d499da259c78e v1 1.i256; - v5.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word v4; - return v5; + v3.i256 = call %storagemap_get_word_with_salt___Address__Address___c32d499da259c78e v1 1.i256; + v4.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word v3; + return v4; } func private %erc20_______h94f6fe6e679122ca_transfer_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256) { block0: - v6.i256 = call %erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2 v0 v1; - v7.i1 = lt v6 v3; - v8.i256 = zext v7 i256; - v9.i1 = ne v8 0.i256; - br v9 block1 block2; + v5.i256 = call %erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2 v0 v1; + v6.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt v5 v3; + br v6 block1 block2; block1: evm_revert 0.i256 0.i256; block2: - v12.i256 = call %erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2 v0 v2; - v16.i256 = sub v6 v3; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v1 v16; - v17.i256 = add v12 v3; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v2 v17; + v10.i256 = call %erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2 v0 v2; + (v13.i256, v14.i1) = usubo v5 v3; + br v14 block3 block4; + + block3: + evm_revert 0.i256 0.i256; + + block4: + call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v1 v13; + (v20.i256, v21.i1) = uaddo v10 v3; + br v21 block3 block5; + + block5: + call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v2 v20; return; } func private %erc20_______h94f6fe6e679122ca_approve_stor_arg0_root_stor__0_1__e4c8be10cab939c2(v0.i256, v1.i256, v2.i256, v3.i256) { block0: - v6.*i8 = evm_malloc 64.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_tuple_1 = bitcast v6 *@__fe_tuple_1; - v9.*@__fe_Address_0 = gep v8 0.i256 0.i256; + v5.*i8 = evm_malloc 64.i256; + v6.i256 = ptr_to_int v5 i256; + v7.*@__fe_tuple_1 = bitcast v5 *@__fe_tuple_1; + v9.*@__fe_Address_0 = gep v7 0.i256 0.i256; mstore v9 v1 i256; - v10.*@__fe_tuple_1 = bitcast v6 *@__fe_tuple_1; + v10.*@__fe_tuple_1 = bitcast v5 *@__fe_tuple_1; v12.*@__fe_Address_0 = gep v10 0.i256 1.i256; mstore v12 v2 i256; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v7 v3; + call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v6 v3; return; } func private %erc20_______h94f6fe6e679122ca_transfer_from_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414_Evm_hef0af3106e109414__ca7def21e0c734ee(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256, v5.i256) { block0: - v7.i256 = evm_caller; - v8.i256 = call %erc20_______h94f6fe6e679122ca_allowance_stor_arg0_root_stor__0_1__e4c8be10cab939c2 v0 v1 v7; - v9.i1 = lt v8 v3; - v10.i256 = zext v9 i256; - v11.i1 = ne v10 0.i256; - br v11 block1 block2; + v6.i256 = evm_caller; + v7.i256 = call %erc20_______h94f6fe6e679122ca_allowance_stor_arg0_root_stor__0_1__e4c8be10cab939c2 v0 v1 v6; + v8.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt v7 v3; + br v8 block1 block2; block1: evm_revert 0.i256 0.i256; block2: call %erc20_______h94f6fe6e679122ca_transfer_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414__2bfe0780cafbc4d2 v0 v1 v2 v3 v5; - v18.*i8 = evm_malloc 64.i256; - v19.i256 = ptr_to_int v18 i256; - v20.*@__fe_tuple_1 = bitcast v18 *@__fe_tuple_1; - v21.*@__fe_Address_0 = gep v20 0.i256 0.i256; - mstore v21 v1 i256; - v23.*@__fe_tuple_1 = bitcast v18 *@__fe_tuple_1; - v25.*@__fe_Address_0 = gep v23 0.i256 1.i256; - mstore v25 v7 i256; - v27.i256 = sub v8 v3; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v19 v27; + v16.*i8 = evm_malloc 64.i256; + v17.i256 = ptr_to_int v16 i256; + v18.*@__fe_tuple_1 = bitcast v16 *@__fe_tuple_1; + v19.*@__fe_Address_0 = gep v18 0.i256 0.i256; + mstore v19 v1 i256; + v21.*@__fe_tuple_1 = bitcast v16 *@__fe_tuple_1; + v23.*@__fe_Address_0 = gep v21 0.i256 1.i256; + mstore v23 v6 i256; + (v25.i256, v26.i1) = usubo v7 v3; + br v26 block3 block4; + + block3: + evm_revert 0.i256 0.i256; + + block4: + call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v17 v25; return; } func private %erc20_______h94f6fe6e679122ca_mint_stor_arg0_root_stor__0_1_Evm_hef0af3106e109414_Evm_hef0af3106e109414__ca7def21e0c734ee(v0.i256, v1.i256, v2.i256, v3.i256, v4.i256) { block0: - v6.i256 = evm_caller; - v8.i256 = add v0 1.i256; - v9.i256 = evm_sload v8; - v10.i256 = call %ne_arg1_root_stor__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v6 v9; - v11.i1 = ne v10 0.i256; - br v11 block1 block2; + v5.i256 = evm_caller; + v7.i256 = add v0 1.i256; + v8.i256 = evm_sload v7; + v9.i1 = call %ne_arg1_root_stor__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v5 v8; + br v9 block1 block2; block1: evm_revert 0.i256 0.i256; block2: - v14.i256 = call %erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2 v0 v1; - v16.i256 = add v14 v2; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v1 v16; - v17.i256 = evm_sload v0; - v18.i256 = add v17 v2; - evm_sstore v0 v18; + v13.i256 = call %erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2 v0 v1; + (v15.i256, v16.i1) = uaddo v13 v2; + br v16 block3 block4; + + block3: + evm_revert 0.i256 0.i256; + + block4: + call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v1 v15; + v20.i256 = evm_sload v0; + (v22.i256, v23.i1) = uaddo v20 v2; + br v23 block3 block5; + + block5: + evm_sstore v0 v22; return; } @@ -285,19 +302,18 @@ func private %address_h257056268eac7027_zero() -> i256 { return 0.i256; } -func private %ne_stor_arg0_root_stor__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2(v0.i256, v1.i256) -> i256 { +func private %ne_stor_arg0_root_stor__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2(v0.i256, v1.i256) -> i1 { block0: - v3.i256 = call %address_h257056268eac7027_eq_h14b330e44530c410_eq_stor_arg0_root_stor v0 v1; - v4.i1 = is_zero v3; - v5.i256 = zext v4 i256; - return v5; + v2.i1 = call %address_h257056268eac7027_eq_h14b330e44530c410_eq_stor_arg0_root_stor v0 v1; + v3.i1 = is_zero v2; + return v3; } func private %storagemap_get_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29 v0 v1; - v4.i256 = evm_sload v3; - return v4; + v2.i256 = call %storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29 v0 v1; + v3.i256 = evm_sload v2; + return v3; } func private %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word(v0.i256) -> i256 { @@ -307,58 +323,62 @@ func private %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word(v0.i25 func private %storagemap_get_word_with_salt___Address__Address___c32d499da259c78e(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e v0 v1; - v4.i256 = evm_sload v3; - return v4; + v2.i256 = call %storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e v0 v1; + v3.i256 = evm_sload v2; + return v3; } func private %erc20_______h94f6fe6e679122ca_balance_of_stor_arg0_root_stor__0_1__e4c8be10cab939c2(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v1; - return v3; + v4.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3 0.i256 v1; + return v4; +} + +func private %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = lt v0 v1; + return v2; } func private %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor__Address_h257056268eac7027_u256_0__6e989e4cb63e64c3(v0.i256, v1.i256, v2.i256) { block0: - v4.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word v2; - call %storagemap_set_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29 v1 0.i256 v4; + v3.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word v2; + call %storagemap_set_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29 v1 0.i256 v3; return; } func private %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f(v0.i256, v1.i256, v2.i256) { block0: - v4.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word v2; - call %storagemap_set_word_with_salt___Address__Address___c32d499da259c78e v1 1.i256 v4; + v3.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word v2; + call %storagemap_set_word_with_salt___Address__Address___c32d499da259c78e v1 1.i256 v3; return; } func private %erc20_______h94f6fe6e679122ca_allowance_stor_arg0_root_stor__0_1__e4c8be10cab939c2(v0.i256, v1.i256, v2.i256) -> i256 { block0: - v5.*i8 = evm_malloc 64.i256; - v6.i256 = ptr_to_int v5 i256; - v7.*@__fe_tuple_1 = bitcast v5 *@__fe_tuple_1; - v8.*@__fe_Address_0 = gep v7 0.i256 0.i256; + v4.*i8 = evm_malloc 64.i256; + v5.i256 = ptr_to_int v4 i256; + v6.*@__fe_tuple_1 = bitcast v4 *@__fe_tuple_1; + v8.*@__fe_Address_0 = gep v6 0.i256 0.i256; mstore v8 v1 i256; - v9.*@__fe_tuple_1 = bitcast v5 *@__fe_tuple_1; + v9.*@__fe_tuple_1 = bitcast v4 *@__fe_tuple_1; v11.*@__fe_Address_0 = gep v9 0.i256 1.i256; mstore v11 v2 i256; - v12.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v6; - return v12; + v13.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get_stor_arg0_root_stor___Address__Address__u256_1__12414c27d5bfff1f 0.i256 v5; + return v13; } -func private %ne_arg1_root_stor__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2(v0.i256, v1.i256) -> i256 { +func private %ne_arg1_root_stor__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2(v0.i256, v1.i256) -> i1 { block0: - v3.i256 = call %address_h257056268eac7027_eq_h14b330e44530c410_eq_arg1_root_stor v0 v1; - v4.i1 = is_zero v3; - v5.i256 = zext v4 i256; - return v5; + v2.i1 = call %address_h257056268eac7027_eq_h14b330e44530c410_eq_arg1_root_stor v0 v1; + v3.i1 = is_zero v2; + return v3; } -func private %address_h257056268eac7027_eq_h14b330e44530c410_eq_stor_arg0_root_stor(v0.i256, v1.i256) -> i256 { +func private %address_h257056268eac7027_eq_h14b330e44530c410_eq_stor_arg0_root_stor(v0.i256, v1.i256) -> i1 { block0: - v3.i1 = eq v0 v1; - v4.i256 = zext v3 i256; - return v4; + v2.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq_stor_arg0_root_stor v0 v1; + return v2; } func private %storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29(v0.i256, v1.i256) -> i256 { @@ -366,12 +386,20 @@ func private %storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab9 v3.*i8 = evm_malloc 0.i256; v4.i256 = ptr_to_int v3 i256; v5.i256 = call %address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key v4 v0; - v6.i256 = add v4 v5; + (v6.i256, v7.i1) = uaddo v4 v5; + br v7 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: mstore v6 v1 i256; - v8.i256 = add v5 32.i256; - v9.i256 = add v5 32.i256; - v10.i256 = evm_keccak256 v4 v9; - return v10; + (v11.i256, v12.i1) = uaddo v5 32.i256; + br v12 block1 block3; + + block3: + v14.i256 = evm_keccak256 v4 v11; + return v14; } func private %storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e(v0.i256, v1.i256) -> i256 { @@ -379,12 +407,20 @@ func private %storagemap_storage_slot_with_salt___Address__Address___c32d499da25 v3.*i8 = evm_malloc 0.i256; v4.i256 = ptr_to_int v3 i256; v5.i256 = call %_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2 v4 v0; - v6.i256 = add v4 v5; + (v6.i256, v7.i1) = uaddo v4 v5; + br v7 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: mstore v6 v1 i256; - v8.i256 = add v5 32.i256; - v9.i256 = add v5 32.i256; - v10.i256 = evm_keccak256 v4 v9; - return v10; + (v11.i256, v12.i1) = uaddo v5 32.i256; + br v12 block1 block3; + + block3: + v14.i256 = evm_keccak256 v4 v11; + return v14; } func private %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word(v0.i256) -> i256 { @@ -394,44 +430,64 @@ func private %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word(v0.i256) func private %storagemap_set_word_with_salt__Address_h257056268eac7027__5ab99f7153cdba29(v0.i256, v1.i256, v2.i256) { block0: - v4.i256 = call %storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29 v0 v1; - evm_sstore v4 v2; + v3.i256 = call %storagemap_storage_slot_with_salt__Address_h257056268eac7027__5ab99f7153cdba29 v0 v1; + evm_sstore v3 v2; return; } func private %storagemap_set_word_with_salt___Address__Address___c32d499da259c78e(v0.i256, v1.i256, v2.i256) { block0: - v4.i256 = call %storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e v0 v1; - evm_sstore v4 v2; + v3.i256 = call %storagemap_storage_slot_with_salt___Address__Address___c32d499da259c78e v0 v1; + evm_sstore v3 v2; return; } -func private %address_h257056268eac7027_eq_h14b330e44530c410_eq_arg1_root_stor(v0.i256, v1.i256) -> i256 { +func private %address_h257056268eac7027_eq_h14b330e44530c410_eq_arg1_root_stor(v0.i256, v1.i256) -> i1 { block0: - v3.i1 = eq v0 v1; - v4.i256 = zext v3 i256; - return v4; + v2.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq_arg1_root_stor v0 v1; + return v2; +} + +func private %u256_h3271ca15373d4483_eq_he50383edd273619f_eq_stor_arg0_root_stor(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; + return v2; } func private %address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key v0 v1; - return v3; + v2.i256 = call %u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key v0 v1; + return v2; } func private %_a__b__h47f120de72304a2d_storagekey_hf9e3d38a13ff4409_write_key__Address_h257056268eac7027_Address_h257056268eac7027__af929e62fa4c68f2(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_tuple_1 = int_to_ptr v1 *@__fe_tuple_1; - v4.*@__fe_Address_0 = gep v3 0.i256 0.i256; + v2.*@__fe_tuple_1 = int_to_ptr v1 *@__fe_tuple_1; + v4.*@__fe_Address_0 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; v6.i256 = call %address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key v0 v5; - v7.*@__fe_tuple_1 = int_to_ptr v1 *@__fe_tuple_1; - v9.*@__fe_Address_0 = gep v7 0.i256 1.i256; - v10.i256 = mload v9 i256; - v11.i256 = add v0 v6; - v12.i256 = call %address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key v11 v10; - v13.i256 = add v6 v12; - return v13; + (v7.i256, v8.i1) = uaddo v0 v6; + br v8 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v10.*@__fe_tuple_1 = int_to_ptr v1 *@__fe_tuple_1; + v12.*@__fe_Address_0 = gep v10 0.i256 1.i256; + v13.i256 = mload v12 i256; + v14.i256 = call %address_h257056268eac7027_storagekey_hf9e3d38a13ff4409_write_key v7 v13; + (v16.i256, v17.i1) = uaddo v6 v14; + br v17 block1 block3; + + block3: + return v16; +} + +func private %u256_h3271ca15373d4483_eq_he50383edd273619f_eq_arg1_root_stor(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; + return v2; } func private %u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key(v0.i256, v1.i256) -> i256 { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/event_logging.snap b/crates/codegen/tests/fixtures/sonatina_ir/event_logging.snap index 7104ca028d..212caa2908 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/event_logging.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/event_logging.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 expression: output input_file: crates/codegen/tests/fixtures/event_logging.fe --- @@ -13,30 +12,30 @@ type @__fe_SolEncoder_3 = {i256, i256, i256}; func private %emit_transfer(v0.i256, v1.i256, v2.i256, v3.i256) { block0: - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_Transfer_1 = bitcast v6 *@__fe_Transfer_1; - v9.*@__fe_Address_0 = gep v8 0.i256 0.i256; + v5.*i8 = evm_malloc 96.i256; + v6.i256 = ptr_to_int v5 i256; + v7.*@__fe_Transfer_1 = bitcast v5 *@__fe_Transfer_1; + v9.*@__fe_Address_0 = gep v7 0.i256 0.i256; mstore v9 v1 i256; - v10.*@__fe_Transfer_1 = bitcast v6 *@__fe_Transfer_1; + v10.*@__fe_Transfer_1 = bitcast v5 *@__fe_Transfer_1; v12.*@__fe_Address_0 = gep v10 0.i256 1.i256; mstore v12 v2 i256; - v13.*@__fe_Transfer_1 = bitcast v6 *@__fe_Transfer_1; + v13.*@__fe_Transfer_1 = bitcast v5 *@__fe_Transfer_1; v15.*i256 = gep v13 0.i256 2.i256; mstore v15 v3 i256; - call %transfer_h628c212e2bb5f76f_event_hd33e4481d4a34b05_emit__Evm_hef0af3106e109414__3af54274b2985741 v7 v0; + call %transfer_h628c212e2bb5f76f_event_hd33e4481d4a34b05_emit__Evm_hef0af3106e109414__3af54274b2985741 v6 v0; return; } func private %transfer_h628c212e2bb5f76f_event_hd33e4481d4a34b05_emit__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) { block0: - v3.i256 = call %solencoder_h1b9228b90dad6928_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - v6.*@__fe_Transfer_1 = int_to_ptr v0 *@__fe_Transfer_1; - v8.*i256 = gep v6 0.i256 2.i256; + v2.i256 = call %solencoder_h1b9228b90dad6928_new; + v4.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v2 32.i256; + v5.*@__fe_Transfer_1 = int_to_ptr v0 *@__fe_Transfer_1; + v8.*i256 = gep v5 0.i256 2.i256; v9.i256 = mload v8 i256; - call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v9 v3; - v10.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; + call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v9 v2; + v10.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v2; v11.*@__fe_tuple_2 = int_to_ptr v10 *@__fe_tuple_2; v12.*i256 = gep v11 0.i256 0.i256; v13.i256 = mload v12 i256; @@ -57,50 +56,54 @@ func private %transfer_h628c212e2bb5f76f_event_hd33e4481d4a34b05_emit__Evm_hef0a func private %solencoder_h1b9228b90dad6928_new() -> i256 { block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v4.*@__fe_SolEncoder_3 = bitcast v2 *@__fe_SolEncoder_3; + v1.*i8 = evm_malloc 96.i256; + v2.i256 = ptr_to_int v1 i256; + v4.*@__fe_SolEncoder_3 = bitcast v1 *@__fe_SolEncoder_3; v5.*i256 = gep v4 0.i256 0.i256; mstore v5 0.i256 i256; - v6.*@__fe_SolEncoder_3 = bitcast v2 *@__fe_SolEncoder_3; + v6.*@__fe_SolEncoder_3 = bitcast v1 *@__fe_SolEncoder_3; v8.*i256 = gep v6 0.i256 1.i256; mstore v8 0.i256 i256; - v9.*@__fe_SolEncoder_3 = bitcast v2 *@__fe_SolEncoder_3; + v9.*@__fe_SolEncoder_3 = bitcast v1 *@__fe_SolEncoder_3; v11.*i256 = gep v9 0.i256 2.i256; mstore v11 0.i256 i256; - return v3; + return v2; } func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v4.*i256 = gep v3 0.i256 0.i256; + v2.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; + v4.*i256 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; - v6.i1 = eq v5 0.i256; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block1 block2; + v6.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq v5 0.i256; + br v6 block1 block2; block1: - v10.*i8 = evm_malloc v1; - v11.i256 = ptr_to_int v10 i256; + v8.*i8 = evm_malloc v1; + v9.i256 = ptr_to_int v8 i256; + v11.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; + v12.*i256 = gep v11 0.i256 0.i256; + mstore v12 v9 i256; v13.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v14.*i256 = gep v13 0.i256 0.i256; - mstore v14 v11 i256; - v15.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v17.*i256 = gep v15 0.i256 1.i256; - mstore v17 v11 i256; - v18.i256 = add v11 v1; - v19.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v21.*i256 = gep v19 0.i256 2.i256; - mstore v21 v18 i256; - jump block2; + v15.*i256 = gep v13 0.i256 1.i256; + mstore v15 v9 i256; + (v16.i256, v17.i1) = uaddo v9 v1; + br v17 block3 block4; block2: v23.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; v24.*i256 = gep v23 0.i256 0.i256; v25.i256 = mload v24 i256; return v25; + + block3: + evm_revert 0.i256 0.i256; + + block4: + v19.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; + v21.*i256 = gep v19 0.i256 2.i256; + mstore v21 v16 i256; + jump block2; } func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { @@ -111,22 +114,28 @@ func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482 func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0.i256) -> i256 { block0: - v2.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v3.*i256 = gep v2 0.i256 0.i256; + v1.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; + v3.*i256 = gep v1 0.i256 0.i256; v4.i256 = mload v3 i256; v5.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; v7.*i256 = gep v5 0.i256 2.i256; v8.i256 = mload v7 i256; - v10.*i8 = evm_malloc 64.i256; - v11.i256 = ptr_to_int v10 i256; - v12.*@__fe_tuple_2 = bitcast v10 *@__fe_tuple_2; - v13.*i256 = gep v12 0.i256 0.i256; - mstore v13 v4 i256; - v14.i256 = sub v8 v4; - v15.*@__fe_tuple_2 = bitcast v10 *@__fe_tuple_2; - v17.*i256 = gep v15 0.i256 1.i256; - mstore v17 v14 i256; - return v11; + (v9.i256, v10.i1) = usubo v8 v4; + br v10 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v12.*i8 = evm_malloc 64.i256; + v13.i256 = ptr_to_int v12 i256; + v15.*@__fe_tuple_2 = bitcast v12 *@__fe_tuple_2; + v16.*i256 = gep v15 0.i256 0.i256; + mstore v16 v4 i256; + v17.*@__fe_tuple_2 = bitcast v12 *@__fe_tuple_2; + v19.*i256 = gep v17 0.i256 1.i256; + mstore v19 v9 i256; + return v13; } func private %address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic(v0.i256) -> i256 { @@ -140,16 +149,28 @@ func private %evm_hef0af3106e109414_log_h22d1a10952034bae_log3(v0.i256, v1.i256, return; } +func private %u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; + return v2; +} + func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word(v0.i256, v1.i256) { block0: - v3.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v5.*i256 = gep v3 0.i256 1.i256; + v2.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; + v5.*i256 = gep v2 0.i256 1.i256; v6.i256 = mload v5 i256; mstore v6 v1 i256; - v8.i256 = add v6 32.i256; - v9.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v10.*i256 = gep v9 0.i256 1.i256; - mstore v10 v8 i256; + (v8.i256, v9.i1) = uaddo v6 32.i256; + br v9 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v11.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; + v12.*i256 = gep v11 0.i256 1.i256; + mstore v12 v8 i256; return; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/event_logging_via_log.snap b/crates/codegen/tests/fixtures/sonatina_ir/event_logging_via_log.snap index bc85a38da7..7672e00f4c 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/event_logging_via_log.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/event_logging_via_log.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 expression: output input_file: crates/codegen/tests/fixtures/event_logging_via_log.fe --- @@ -13,18 +12,18 @@ type @__fe_SolEncoder_3 = {i256, i256, i256}; func private %emit_transfer(v0.i256, v1.i256, v2.i256, v3.i256) { block0: - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_Transfer_1 = bitcast v6 *@__fe_Transfer_1; - v9.*@__fe_Address_0 = gep v8 0.i256 0.i256; + v5.*i8 = evm_malloc 96.i256; + v6.i256 = ptr_to_int v5 i256; + v7.*@__fe_Transfer_1 = bitcast v5 *@__fe_Transfer_1; + v9.*@__fe_Address_0 = gep v7 0.i256 0.i256; mstore v9 v1 i256; - v10.*@__fe_Transfer_1 = bitcast v6 *@__fe_Transfer_1; + v10.*@__fe_Transfer_1 = bitcast v5 *@__fe_Transfer_1; v12.*@__fe_Address_0 = gep v10 0.i256 1.i256; mstore v12 v2 i256; - v13.*@__fe_Transfer_1 = bitcast v6 *@__fe_Transfer_1; + v13.*@__fe_Transfer_1 = bitcast v5 *@__fe_Transfer_1; v15.*i256 = gep v13 0.i256 2.i256; mstore v15 v3 i256; - call %emit__Evm_hef0af3106e109414_Transfer_h628c212e2bb5f76f__243b05efdcd63652 v0 v7; + call %emit__Evm_hef0af3106e109414_Transfer_h628c212e2bb5f76f__243b05efdcd63652 v0 v6; return; } @@ -36,13 +35,13 @@ func private %emit__Evm_hef0af3106e109414_Transfer_h628c212e2bb5f76f__243b05efdc func private %transfer_h628c212e2bb5f76f_event_hd33e4481d4a34b05_emit__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) { block0: - v3.i256 = call %solencoder_h1b9228b90dad6928_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - v6.*@__fe_Transfer_1 = int_to_ptr v0 *@__fe_Transfer_1; - v8.*i256 = gep v6 0.i256 2.i256; + v2.i256 = call %solencoder_h1b9228b90dad6928_new; + v4.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v2 32.i256; + v5.*@__fe_Transfer_1 = int_to_ptr v0 *@__fe_Transfer_1; + v8.*i256 = gep v5 0.i256 2.i256; v9.i256 = mload v8 i256; - call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v9 v3; - v10.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; + call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v9 v2; + v10.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v2; v11.*@__fe_tuple_2 = int_to_ptr v10 *@__fe_tuple_2; v12.*i256 = gep v11 0.i256 0.i256; v13.i256 = mload v12 i256; @@ -63,50 +62,54 @@ func private %transfer_h628c212e2bb5f76f_event_hd33e4481d4a34b05_emit__Evm_hef0a func private %solencoder_h1b9228b90dad6928_new() -> i256 { block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v4.*@__fe_SolEncoder_3 = bitcast v2 *@__fe_SolEncoder_3; + v1.*i8 = evm_malloc 96.i256; + v2.i256 = ptr_to_int v1 i256; + v4.*@__fe_SolEncoder_3 = bitcast v1 *@__fe_SolEncoder_3; v5.*i256 = gep v4 0.i256 0.i256; mstore v5 0.i256 i256; - v6.*@__fe_SolEncoder_3 = bitcast v2 *@__fe_SolEncoder_3; + v6.*@__fe_SolEncoder_3 = bitcast v1 *@__fe_SolEncoder_3; v8.*i256 = gep v6 0.i256 1.i256; mstore v8 0.i256 i256; - v9.*@__fe_SolEncoder_3 = bitcast v2 *@__fe_SolEncoder_3; + v9.*@__fe_SolEncoder_3 = bitcast v1 *@__fe_SolEncoder_3; v11.*i256 = gep v9 0.i256 2.i256; mstore v11 0.i256 i256; - return v3; + return v2; } func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v4.*i256 = gep v3 0.i256 0.i256; + v2.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; + v4.*i256 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; - v6.i1 = eq v5 0.i256; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block1 block2; + v6.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq v5 0.i256; + br v6 block1 block2; block1: - v10.*i8 = evm_malloc v1; - v11.i256 = ptr_to_int v10 i256; + v8.*i8 = evm_malloc v1; + v9.i256 = ptr_to_int v8 i256; + v11.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; + v12.*i256 = gep v11 0.i256 0.i256; + mstore v12 v9 i256; v13.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v14.*i256 = gep v13 0.i256 0.i256; - mstore v14 v11 i256; - v15.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v17.*i256 = gep v15 0.i256 1.i256; - mstore v17 v11 i256; - v18.i256 = add v11 v1; - v19.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v21.*i256 = gep v19 0.i256 2.i256; - mstore v21 v18 i256; - jump block2; + v15.*i256 = gep v13 0.i256 1.i256; + mstore v15 v9 i256; + (v16.i256, v17.i1) = uaddo v9 v1; + br v17 block3 block4; block2: v23.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; v24.*i256 = gep v23 0.i256 0.i256; v25.i256 = mload v24 i256; return v25; + + block3: + evm_revert 0.i256 0.i256; + + block4: + v19.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; + v21.*i256 = gep v19 0.i256 2.i256; + mstore v21 v16 i256; + jump block2; } func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { @@ -117,22 +120,28 @@ func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482 func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0.i256) -> i256 { block0: - v2.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v3.*i256 = gep v2 0.i256 0.i256; + v1.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; + v3.*i256 = gep v1 0.i256 0.i256; v4.i256 = mload v3 i256; v5.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; v7.*i256 = gep v5 0.i256 2.i256; v8.i256 = mload v7 i256; - v10.*i8 = evm_malloc 64.i256; - v11.i256 = ptr_to_int v10 i256; - v12.*@__fe_tuple_2 = bitcast v10 *@__fe_tuple_2; - v13.*i256 = gep v12 0.i256 0.i256; - mstore v13 v4 i256; - v14.i256 = sub v8 v4; - v15.*@__fe_tuple_2 = bitcast v10 *@__fe_tuple_2; - v17.*i256 = gep v15 0.i256 1.i256; - mstore v17 v14 i256; - return v11; + (v9.i256, v10.i1) = usubo v8 v4; + br v10 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v12.*i8 = evm_malloc 64.i256; + v13.i256 = ptr_to_int v12 i256; + v15.*@__fe_tuple_2 = bitcast v12 *@__fe_tuple_2; + v16.*i256 = gep v15 0.i256 0.i256; + mstore v16 v4 i256; + v17.*@__fe_tuple_2 = bitcast v12 *@__fe_tuple_2; + v19.*i256 = gep v17 0.i256 1.i256; + mstore v19 v9 i256; + return v13; } func private %address_h257056268eac7027_topicvalue_hc8981c1d4c24e77d_as_topic(v0.i256) -> i256 { @@ -146,16 +155,28 @@ func private %evm_hef0af3106e109414_log_h22d1a10952034bae_log3(v0.i256, v1.i256, return; } +func private %u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; + return v2; +} + func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word(v0.i256, v1.i256) { block0: - v3.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v5.*i256 = gep v3 0.i256 1.i256; + v2.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; + v5.*i256 = gep v2 0.i256 1.i256; v6.i256 = mload v5 i256; mstore v6 v1 i256; - v8.i256 = add v6 32.i256; - v9.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; - v10.*i256 = gep v9 0.i256 1.i256; - mstore v10 v8 i256; + (v8.i256, v9.i1) = uaddo v6 32.i256; + br v9 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v11.*@__fe_SolEncoder_3 = int_to_ptr v0 *@__fe_SolEncoder_3; + v12.*i256 = gep v11 0.i256 1.i256; + mstore v12 v8 i256; return; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/for_array.snap b/crates/codegen/tests/fixtures/sonatina_ir/for_array.snap index 59e66e3c51..77dc57294d 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/for_array.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/for_array.snap @@ -7,35 +7,39 @@ target = "evm-ethereum-osaka" global private const [i8; 800] $__fe_const_data_0 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25]; -func private %for_array_sum() -> i256 { +func private %for_array_sum() -> i64 { block0: - v2.*i8 = evm_malloc 800.i256; - v3.i256 = ptr_to_int v2 i256; - v4.i256 = sym_addr $__fe_const_data_0; - v5.i256 = sym_size $__fe_const_data_0; - evm_code_copy v3 v4 v5; - v6.i256 = call %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_len__u64_25__540b817a073b29f5 v3; + v1.*i8 = evm_malloc 800.i256; + v2.i256 = ptr_to_int v1 i256; + v3.i256 = sym_addr $__fe_const_data_0; + v4.i256 = sym_size $__fe_const_data_0; + evm_code_copy v2 v3 v4; + v7.i256 = call %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_len__u64_25__540b817a073b29f5 v2; jump block1; block1: - v24.i256 = phi (0.i256 block0) (v16 block3); - v7.i256 = phi (0.i256 block0) (v19 block3); - v9.i1 = lt v7 v6; - v10.i256 = zext v9 i256; - v11.i1 = ne v10 0.i256; - br v11 block2 block4; + v24.i64 = phi (0.i64 block0) (v15 block3); + v8.i256 = phi (0.i256 block0) (v19 block3); + v10.i1 = lt v8 v7; + br v10 block2 block4; block2: - v14.i256 = call %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_get__u64_25__540b817a073b29f5 v3 v7; - v16.i256 = add v24 v14; - jump block3; + v13.i64 = call %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_get__u64_25__540b817a073b29f5 v2 v8; + (v15.i64, v16.i1) = uaddo v24 v13; + br v16 block5 block6; block3: - v19.i256 = add v7 1.i256; + v19.i256 = add v8 1.i256; jump block1; block4: return v24; + + block5: + evm_revert 0.i256 0.i256; + + block6: + jump block3; } func private %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_len__u64_25__540b817a073b29f5(v0.i256) -> i256 { @@ -43,19 +47,18 @@ func private %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_len__u return 25.i256; } -func private %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_get__u64_25__540b817a073b29f5(v0.i256, v1.i256) -> i256 { +func private %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_get__u64_25__540b817a073b29f5(v0.i256, v1.i256) -> i64 { block0: - v3.*[i256; 25] = int_to_ptr v0 *[i256; 25]; - v4.*i256 = gep v3 0.i256 v1; + v2.*[i64; 25] = int_to_ptr v0 *[i64; 25]; + v4.*i64 = gep v2 0.i256 v1; v5.i256 = mload v4 i256; v6.i64 = trunc v5 i64; - v7.i256 = zext v6 i256; - return v7; + return v6; } func private %__fe_sonatina_entry() { block0: - v0.i256 = call %for_array_sum; + v0.i64 = call %for_array_sum; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/for_array_large.snap b/crates/codegen/tests/fixtures/sonatina_ir/for_array_large.snap index 7227305f1f..cdb29c6834 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/for_array_large.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/for_array_large.snap @@ -7,35 +7,39 @@ target = "evm-ethereum-osaka" global private const [i8; 320] $__fe_const_data_0 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10]; -func private %for_array_large_sum() -> i256 { +func private %for_array_large_sum() -> i64 { block0: - v2.*i8 = evm_malloc 320.i256; - v3.i256 = ptr_to_int v2 i256; - v4.i256 = sym_addr $__fe_const_data_0; - v5.i256 = sym_size $__fe_const_data_0; - evm_code_copy v3 v4 v5; - v6.i256 = call %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_len__u64_10__2b47acd750beacf4 v3; + v1.*i8 = evm_malloc 320.i256; + v2.i256 = ptr_to_int v1 i256; + v3.i256 = sym_addr $__fe_const_data_0; + v4.i256 = sym_size $__fe_const_data_0; + evm_code_copy v2 v3 v4; + v7.i256 = call %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_len__u64_10__2b47acd750beacf4 v2; jump block1; block1: - v24.i256 = phi (0.i256 block0) (v16 block3); - v7.i256 = phi (0.i256 block0) (v19 block3); - v9.i1 = lt v7 v6; - v10.i256 = zext v9 i256; - v11.i1 = ne v10 0.i256; - br v11 block2 block4; + v24.i64 = phi (0.i64 block0) (v15 block3); + v8.i256 = phi (0.i256 block0) (v19 block3); + v10.i1 = lt v8 v7; + br v10 block2 block4; block2: - v14.i256 = call %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_get__u64_10__2b47acd750beacf4 v3 v7; - v16.i256 = add v24 v14; - jump block3; + v13.i64 = call %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_get__u64_10__2b47acd750beacf4 v2 v8; + (v15.i64, v16.i1) = uaddo v24 v13; + br v16 block5 block6; block3: - v19.i256 = add v7 1.i256; + v19.i256 = add v8 1.i256; jump block1; block4: return v24; + + block5: + evm_revert 0.i256 0.i256; + + block6: + jump block3; } func private %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_len__u64_10__2b47acd750beacf4(v0.i256) -> i256 { @@ -43,19 +47,18 @@ func private %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_len__u return 10.i256; } -func private %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_get__u64_10__2b47acd750beacf4(v0.i256, v1.i256) -> i256 { +func private %_t__const_n__usize__h8b63f3f6d3df6413_seq_ha637d2df505bccf2_get__u64_10__2b47acd750beacf4(v0.i256, v1.i256) -> i64 { block0: - v3.*[i256; 10] = int_to_ptr v0 *[i256; 10]; - v4.*i256 = gep v3 0.i256 v1; + v2.*[i64; 10] = int_to_ptr v0 *[i64; 10]; + v4.*i64 = gep v2 0.i256 v1; v5.i256 = mload v4 i256; v6.i64 = trunc v5 i64; - v7.i256 = zext v6 i256; - return v7; + return v6; } func private %__fe_sonatina_entry() { block0: - v0.i256 = call %for_array_large_sum; + v0.i64 = call %for_array_large_sum; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/for_range.snap b/crates/codegen/tests/fixtures/sonatina_ir/for_range.snap index c7eb59e1be..e8e06b45b5 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/for_range.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/for_range.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 expression: output input_file: crates/codegen/tests/fixtures/for_range.fe --- @@ -19,24 +18,28 @@ func private %for_range_sum() -> i256 { jump block1; block1: - v27.i256 = phi (0.i256 block0) (v19 block3); - v10.i256 = phi (0.i256 block0) (v22 block3); + v26.i256 = phi (0.i256 block0) (v17 block3); + v10.i256 = phi (0.i256 block0) (v21 block3); v12.i1 = lt v10 v9; - v13.i256 = zext v12 i256; - v14.i1 = ne v13 0.i256; - br v14 block2 block4; + br v12 block2 block4; block2: - v17.i256 = call %range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_get v4 v10; - v19.i256 = add v27 v17; - jump block3; + v15.i256 = call %range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_get v4 v10; + (v17.i256, v18.i1) = uaddo v26 v15; + br v18 block5 block6; block3: - v22.i256 = add v10 1.i256; + v21.i256 = add v10 1.i256; jump block1; block4: - return v27; + return v26; + + block5: + evm_revert 0.i256 0.i256; + + block6: + jump block3; } func private %range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_len(v0.i256) -> i256 { @@ -46,34 +49,50 @@ func private %range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_le v5.i256 = mload v4 i256; v6.*i256 = int_to_ptr v0 *i256; v7.i256 = mload v6 i256; - v8.i1 = lt v5 v7; - v9.i256 = zext v8 i256; - v10.i1 = ne v9 0.i256; - br v10 block1 block2; + v8.i1 = call %usize_ha12462c6d36e68b0_ord_h264f6d6d75097a_lt v5 v7; + br v8 block1 block2; block1: jump block3; block2: - v12.i256 = add v0 32.i256; - v13.*i256 = int_to_ptr v12 *i256; + v10.i256 = add v0 32.i256; + v11.*i256 = int_to_ptr v10 *i256; + v12.i256 = mload v11 i256; + v13.*i256 = int_to_ptr v0 *i256; v14.i256 = mload v13 i256; - v15.*i256 = int_to_ptr v0 *i256; - v16.i256 = mload v15 i256; - v17.i256 = sub v14 v16; - jump block3; + (v15.i256, v16.i1) = usubo v12 v14; + br v16 block4 block5; block3: - v18.i256 = phi (0.i256 block1) (v17 block2); - return v18; + v17.i256 = phi (0.i256 block1) (v15 block5); + return v17; + + block4: + evm_revert 0.i256 0.i256; + + block5: + jump block3; } func private %range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_get(v0.i256, v1.i256) -> i256 { block0: - v3.*i256 = int_to_ptr v0 *i256; - v4.i256 = mload v3 i256; - v5.i256 = add v4 v1; - return v5; + v2.*i256 = int_to_ptr v0 *i256; + v3.i256 = mload v2 i256; + (v4.i256, v5.i1) = uaddo v3 v1; + br v5 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v4; +} + +func private %usize_ha12462c6d36e68b0_ord_h264f6d6d75097a_lt(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = lt v0 v1; + return v2; } func private %__fe_sonatina_entry() { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/full_contract.snap b/crates/codegen/tests/fixtures/sonatina_ir/full_contract.snap index 3ee4b4259b..60a0627076 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/full_contract.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/full_contract.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 expression: output input_file: crates/codegen/tests/fixtures/full_contract.fe --- @@ -26,72 +25,98 @@ func private %dispatch__StorPtr_Evm___207f35a85ac4062e() { block0: v1.i256 = evm_calldata_load 0.i256; v3.i256 = shr 224.i256 v1; - v5.i1 = eq v3 151146943.i256; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; + v5.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq v3 151146943.i256; + br v5 block1 block2; block1: - v9.i256 = evm_calldata_load 4.i256; - v11.i256 = evm_calldata_load 36.i256; - v13.*i8 = evm_malloc 64.i256; - v14.i256 = ptr_to_int v13 i256; - v15.*@__fe_Point_0 = bitcast v13 *@__fe_Point_0; - v16.*i256 = gep v15 0.i256 0.i256; - mstore v16 v9 i256; - v17.*@__fe_Point_0 = bitcast v13 *@__fe_Point_0; - v19.*i256 = gep v17 0.i256 1.i256; - mstore v19 v11 i256; - v20.*@__fe_Point_0 = bitcast v13 *@__fe_Point_0; - v21.*i256 = gep v20 0.i256 0.i256; - v22.i256 = mload v21 i256; - v23.i256 = add v22 1.i256; - v24.*@__fe_Point_0 = bitcast v13 *@__fe_Point_0; - v25.*i256 = gep v24 0.i256 0.i256; - mstore v25 v23 i256; - v26.*@__fe_Point_0 = bitcast v13 *@__fe_Point_0; - v27.*i256 = gep v26 0.i256 1.i256; - v28.i256 = mload v27 i256; - v30.i256 = add v28 2.i256; - v31.*@__fe_Point_0 = bitcast v13 *@__fe_Point_0; - v32.*i256 = gep v31 0.i256 1.i256; - mstore v32 v30 i256; - v33.i256 = call %point_hac92469562809d28_area v14; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v33 0.i256; - evm_invalid; + v7.i256 = evm_calldata_load 4.i256; + v9.i256 = evm_calldata_load 36.i256; + v11.*i8 = evm_malloc 64.i256; + v12.i256 = ptr_to_int v11 i256; + v13.*@__fe_Point_0 = bitcast v11 *@__fe_Point_0; + v14.*i256 = gep v13 0.i256 0.i256; + mstore v14 v7 i256; + v15.*@__fe_Point_0 = bitcast v11 *@__fe_Point_0; + v17.*i256 = gep v15 0.i256 1.i256; + mstore v17 v9 i256; + v18.*@__fe_Point_0 = bitcast v11 *@__fe_Point_0; + v19.*i256 = gep v18 0.i256 0.i256; + v20.i256 = mload v19 i256; + (v21.i256, v22.i1) = uaddo v20 1.i256; + br v22 block5 block6; block2: - v36.i1 = eq v3 2066295049.i256; - v37.i256 = zext v36 i256; - v38.i1 = ne v37 0.i256; - br v38 block3 block4; + v39.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq v3 2066295049.i256; + br v39 block3 block4; block3: - v39.i256 = evm_calldata_load 4.i256; - v41.i256 = add v39 3.i256; - v42.i256 = call %square_h97afaa872b6ea17e_area v41; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v42 0.i256; - evm_invalid; + v40.i256 = evm_calldata_load 4.i256; + (v42.i256, v43.i1) = uaddo v40 3.i256; + br v43 block5 block8; block4: evm_return 0.i256 0.i256; + + block5: + evm_revert 0.i256 0.i256; + + block6: + v24.*@__fe_Point_0 = int_to_ptr v12 *@__fe_Point_0; + v25.*i256 = gep v24 0.i256 0.i256; + mstore v25 v21 i256; + v26.*@__fe_Point_0 = int_to_ptr v12 *@__fe_Point_0; + v27.*i256 = gep v26 0.i256 1.i256; + v28.i256 = mload v27 i256; + (v30.i256, v31.i1) = uaddo v28 2.i256; + br v31 block5 block7; + + block7: + v33.*@__fe_Point_0 = int_to_ptr v12 *@__fe_Point_0; + v34.*i256 = gep v33 0.i256 1.i256; + mstore v34 v30 i256; + v35.i256 = call %point_hac92469562809d28_area v12; + call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v35 0.i256; + evm_invalid; + + block8: + v44.i256 = call %square_h97afaa872b6ea17e_area v42; + call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v44 0.i256; + evm_invalid; } func private %point_hac92469562809d28_area(v0.i256) -> i256 { block0: - v2.*@__fe_Point_0 = int_to_ptr v0 *@__fe_Point_0; - v3.*i256 = gep v2 0.i256 0.i256; + v1.*@__fe_Point_0 = int_to_ptr v0 *@__fe_Point_0; + v3.*i256 = gep v1 0.i256 0.i256; v4.i256 = mload v3 i256; v5.*@__fe_Point_0 = int_to_ptr v0 *@__fe_Point_0; v7.*i256 = gep v5 0.i256 1.i256; v8.i256 = mload v7 i256; - v9.i256 = mul v4 v8; + (v9.i256, v10.i1) = umulo v4 v8; + br v10 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: return v9; } func private %square_h97afaa872b6ea17e_area(v0.i256) -> i256 { block0: - v2.i256 = mul v0 v0; + (v1.i256, v2.i1) = umulo v0 v0; + br v2 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v1; +} + +func private %u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; return v2; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/function_call.snap b/crates/codegen/tests/fixtures/sonatina_ir/function_call.snap index 2ac8a53847..c79bcb992e 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/function_call.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/function_call.snap @@ -5,21 +5,27 @@ input_file: crates/codegen/tests/fixtures/function_call.fe --- target = "evm-ethereum-osaka" -func private %add_one(v0.i256) -> i256 { +func private %add_one(v0.i64) -> i64 { block0: - v3.i256 = add v0 1.i256; - return v3; + (v2.i64, v3.i1) = uaddo v0 1.i64; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; } -func private %call_add_one() -> i256 { +func private %call_add_one() -> i64 { block0: - v2.i256 = call %add_one 5.i256; - return v2; + v1.i64 = call %add_one 5.i64; + return v1; } func private %__fe_sonatina_entry() { block0: - v1.i256 = call %add_one 0.i256; + v1.i64 = call %add_one 0.i64; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/generic_identity.snap b/crates/codegen/tests/fixtures/sonatina_ir/generic_identity.snap index 173e4996ce..7a1bf5e58b 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/generic_identity.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/generic_identity.snap @@ -5,31 +5,31 @@ input_file: crates/codegen/tests/fixtures/generic_identity.fe --- target = "evm-ethereum-osaka" -func private %call_identity_u32() -> i256 { +func private %call_identity_u32() -> i32 { block0: - v2.i256 = call %identity__u32__20aa0c10687491ad 7.i256; - return v2; + v1.i32 = call %identity__u32__20aa0c10687491ad 7.i32; + return v1; } -func private %call_identity_bool() -> i256 { +func private %call_identity_bool() -> i1 { block0: - v2.i256 = call %identity__bool__947c0c03c59c6f07 1.i256; - return v2; + v1.i1 = call %identity__bool__947c0c03c59c6f07 1.i1; + return v1; } -func private %identity__u32__20aa0c10687491ad(v0.i256) -> i256 { +func private %identity__u32__20aa0c10687491ad(v0.i32) -> i32 { block0: return v0; } -func private %identity__bool__947c0c03c59c6f07(v0.i256) -> i256 { +func private %identity__bool__947c0c03c59c6f07(v0.i1) -> i1 { block0: return v0; } func private %__fe_sonatina_entry() { block0: - v0.i256 = call %call_identity_u32; + v0.i32 = call %call_identity_u32; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/high_level_contract.snap b/crates/codegen/tests/fixtures/sonatina_ir/high_level_contract.snap index 0659748fda..e0017e9d27 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/high_level_contract.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/high_level_contract.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 expression: output input_file: crates/codegen/tests/fixtures/high_level_contract.fe --- @@ -18,8 +17,8 @@ type @__fe_SolDecoder_7 = {@__fe_Cursor_6, i256}; func private %__EchoContract_init_contract(v0.i256, v1.i256, v2.i256) { block0: evm_sstore v2 v0; - v5.i256 = add v2 1.i256; - evm_sstore v5 v1; + v4.i256 = add v2 1.i256; + evm_sstore v4 v1; return; } @@ -41,78 +40,76 @@ func private %__EchoContract_recv_0_2(v0.i256) -> i256 { func private %__EchoContract_init() { block0: - v1.i256 = call %init_field__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d 0.i256 0.i256; - v2.i256 = sym_addr &__EchoContract_runtime; - v3.i256 = sym_size &__EchoContract_runtime; - v4.i256 = sym_size .; - v5.i256 = evm_code_size; - v6.i1 = lt v5 v4; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block1 block2; + v2.i256 = call %init_field__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d 0.i256 0.i256; + v3.i256 = sym_addr &__EchoContract_runtime; + v4.i256 = sym_size &__EchoContract_runtime; + v5.i256 = sym_size .; + v6.i256 = evm_code_size; + v7.i1 = lt v6 v5; + br v7 block1 block2; block1: call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; evm_invalid; block2: - v11.i256 = sub v5 v4; - v12.i256 = sub v5 v4; + v11.i256 = sub v6 v5; + v12.i256 = sub v6 v5; v13.*i8 = evm_malloc v12; v14.i256 = ptr_to_int v13 i256; - v15.i256 = sub v5 v4; - evm_code_copy v14 v4 v15; + v15.i256 = sub v6 v5; + evm_code_copy v14 v5 v15; v17.*i8 = evm_malloc 64.i256; v18.i256 = ptr_to_int v17 i256; v19.*@__fe_MemoryBytes_0 = bitcast v17 *@__fe_MemoryBytes_0; v20.*i256 = gep v19 0.i256 0.i256; mstore v20 v14 i256; - v21.i256 = sub v5 v4; + v21.i256 = sub v6 v5; v22.*@__fe_MemoryBytes_0 = bitcast v17 *@__fe_MemoryBytes_0; v24.*i256 = gep v22 0.i256 1.i256; mstore v24 v21 i256; v25.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v18; v26.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v25; v27.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v25; - call %__EchoContract_init_contract v26 v27 v1; - evm_code_copy 0.i256 v2 v3; - evm_return 0.i256 v3; + call %__EchoContract_init_contract v26 v27 v2; + evm_code_copy 0.i256 v3 v4; + evm_return 0.i256 v4; } func private %__EchoContract_runtime() { block0: - v1.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Foo_h6dbce71a6ea992b8__21493237fe9c2c26 0.i256 0.i256; - v2.i256 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v3.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - br_table v2 block1 (1.i256 block2) (2.i256 block3) (3.i256 block4); + v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Foo_h6dbce71a6ea992b8__21493237fe9c2c26 0.i256 0.i256; + v4.i32 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; + v6.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; + br_table v4 block1 (1.i32 block2) (2.i32 block3) (3.i32 block4); block1: call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; evm_invalid; block2: - call %answer_he729876072a4af6_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v3; - v8.i256 = call %__EchoContract_recv_0_0; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v8; + call %answer_he729876072a4af6_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v6; + v12.i256 = call %__EchoContract_recv_0_0; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v12; evm_invalid; block3: - v10.i256 = call %echo_h9f932a87feb06bd2_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v3; - v11.i256 = call %__EchoContract_recv_0_1 v10; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v11; + v15.i256 = call %echo_h9f932a87feb06bd2_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v6; + v16.i256 = call %__EchoContract_recv_0_1 v15; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v16; evm_invalid; block4: - call %getx_hdbb0a53a8b757989_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v3; - v14.i256 = call %__EchoContract_recv_0_2 v1; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v14; + call %getx_hdbb0a53a8b757989_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v6; + v20.i256 = call %__EchoContract_recv_0_2 v2; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v20; evm_invalid; } func private %init_field__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Foo_h6dbce71a6ea992b8__21493237fe9c2c26 v0 v1; - return v3; + v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Foo_h6dbce71a6ea992b8__21493237fe9c2c26 v0 v1; + return v2; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(v0.i256) { @@ -122,46 +119,44 @@ func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(v0.i256 func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; + v1.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; + return v1; } func private %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6(v0.i256) -> i256 { block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; + v1.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; + return v1; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Foo_h6dbce71a6ea992b8__21493237fe9c2c26(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %stor_ptr__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d 0.i256 v1; - return v3; + v4.i256 = call %stor_ptr__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d 0.i256 v1; + return v4; } -func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { +func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i32 { block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; - v3.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v2; - v5.i1 = lt v3 4.i256; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; + v1.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; + v2.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v1; + v4.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt v2 4.i256; + br v4 block1 block2; block1: call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort v0; evm_invalid; block2: - v10.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v2 0.i256; - v11.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v10; - return v11; + v8.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v1 0.i256; + v9.i32 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v8; + return v9; } func private %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; - v4.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 4.i256; - return v4; + v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; + v5.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 4.i256; + return v5; } func private %answer_he729876072a4af6_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) { @@ -171,14 +166,14 @@ func private %answer_he729876072a4af6_decode_h624c3cd8c996d995_decode__SolDecode func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f(v0.i256, v1.i256) { block0: - v3.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v3; - v6.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v7.*@__fe_tuple_1 = int_to_ptr v6 *@__fe_tuple_1; - v8.*i256 = gep v7 0.i256 0.i256; + v2.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; + v4.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v2 32.i256; + call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v2; + v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v2; + v6.*@__fe_tuple_1 = int_to_ptr v5 *@__fe_tuple_1; + v8.*i256 = gep v6 0.i256 0.i256; v9.i256 = mload v8 i256; - v10.*@__fe_tuple_1 = int_to_ptr v6 *@__fe_tuple_1; + v10.*@__fe_tuple_1 = int_to_ptr v5 *@__fe_tuple_1; v12.*i256 = gep v10 0.i256 1.i256; v13.i256 = mload v12 i256; call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes 0.i256 v9 v13; @@ -187,8 +182,8 @@ func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4 func private %echo_h9f932a87feb06bd2_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) -> i256 { block0: - v2.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; - return v2; + v1.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98 v0; + return v1; } func private %getx_hdbb0a53a8b757989_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) { @@ -198,37 +193,37 @@ func private %getx_hdbb0a53a8b757989_decode_h624c3cd8c996d995_decode__SolDecoder func private %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v2.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - v4.*i8 = evm_malloc 128.i256; - v5.i256 = ptr_to_int v4 i256; - v6.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; - v7.*i256 = gep v6 0.i256 0.i256 0.i256; + v1.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; + v3.*i8 = evm_malloc 128.i256; + v4.i256 = ptr_to_int v3 i256; + v5.*@__fe_Cursor_2 = int_to_ptr v1 *@__fe_Cursor_2; + v7.*i256 = gep v5 0.i256 0.i256 0.i256; v8.i256 = mload v7 i256; - v9.*@__fe_SolDecoder_3 = bitcast v4 *@__fe_SolDecoder_3; + v9.*@__fe_SolDecoder_3 = bitcast v3 *@__fe_SolDecoder_3; v10.*i256 = gep v9 0.i256 0.i256 0.i256 0.i256; mstore v10 v8 i256; - v11.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; + v11.*@__fe_Cursor_2 = int_to_ptr v1 *@__fe_Cursor_2; v13.*i256 = gep v11 0.i256 0.i256 1.i256; v14.i256 = mload v13 i256; - v15.*@__fe_SolDecoder_3 = bitcast v4 *@__fe_SolDecoder_3; + v15.*@__fe_SolDecoder_3 = bitcast v3 *@__fe_SolDecoder_3; v16.*i256 = gep v15 0.i256 0.i256 0.i256 1.i256; mstore v16 v14 i256; - v17.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; + v17.*@__fe_Cursor_2 = int_to_ptr v1 *@__fe_Cursor_2; v18.*i256 = gep v17 0.i256 1.i256; v19.i256 = mload v18 i256; - v20.*@__fe_SolDecoder_3 = bitcast v4 *@__fe_SolDecoder_3; + v20.*@__fe_SolDecoder_3 = bitcast v3 *@__fe_SolDecoder_3; v21.*i256 = gep v20 0.i256 0.i256 1.i256; mstore v21 v19 i256; - v22.*@__fe_SolDecoder_3 = bitcast v4 *@__fe_SolDecoder_3; + v22.*@__fe_SolDecoder_3 = bitcast v3 *@__fe_SolDecoder_3; v23.*i256 = gep v22 0.i256 1.i256; mstore v23 0.i256 i256; - return v5; + return v4; } func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v2.*@__fe_SolDecoder_3 = int_to_ptr v0 *@__fe_SolDecoder_3; - v3.*@__fe_Cursor_2 = gep v2 0.i256 0.i256; + v1.*@__fe_SolDecoder_3 = int_to_ptr v0 *@__fe_SolDecoder_3; + v3.*@__fe_Cursor_2 = gep v1 0.i256 0.i256; v4.i256 = ptr_to_int v3 i256; v5.*@__fe_MemoryBytes_0 = gep v3 0.i256 0.i256; v6.i256 = ptr_to_int v5 i256; @@ -238,16 +233,8 @@ func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_ v10.i256 = ptr_to_int v9 i256; v12.*i256 = gep v9 0.i256 1.i256; v13.i256 = mload v12 i256; - v15.i256 = add v13 32.i256; - v16.*@__fe_SolDecoder_3 = int_to_ptr v0 *@__fe_SolDecoder_3; - v17.*@__fe_Cursor_2 = gep v16 0.i256 0.i256; - v18.i256 = ptr_to_int v17 i256; - v19.*i256 = gep v17 0.i256 1.i256; - v20.i256 = mload v19 i256; - v21.i1 = lt v15 v20; - v22.i256 = zext v21 i256; - v23.i1 = ne v22 0.i256; - br v23 block1 block3; + (v15.i256, v16.i1) = uaddo v13 32.i256; + br v16 block4 block5; block1: evm_revert 0.i256 0.i256; @@ -272,16 +259,26 @@ func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_ return v35; block3: - v43.i1 = gt v15 v7; - v44.i256 = zext v43 i256; - v45.i1 = ne v44 0.i256; - br v45 block1 block2; + v43.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt v15 v7; + br v43 block1 block2; + + block4: + evm_revert 0.i256 0.i256; + + block5: + v18.*@__fe_SolDecoder_3 = int_to_ptr v0 *@__fe_SolDecoder_3; + v19.*@__fe_Cursor_2 = gep v18 0.i256 0.i256; + v20.i256 = ptr_to_int v19 i256; + v21.*i256 = gep v19 0.i256 1.i256; + v22.i256 = mload v21 i256; + v23.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt v15 v22; + br v23 block1 block3; } func private %stor_ptr__Evm_hef0af3106e109414_Foo_h6dbce71a6ea992b8__c09e6c6fc5a7b23d(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Foo_h6dbce71a6ea992b8__21493237fe9c2c26 v1; - return v3; + v2.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Foo_h6dbce71a6ea992b8__21493237fe9c2c26 v1; + return v2; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256) -> i256 { @@ -291,68 +288,89 @@ func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256 func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { block0: - v2.i256 = evm_calldata_size; - v3.i256 = sub v2 v0; - return v3; + v1.i256 = evm_calldata_size; + (v2.i256, v3.i1) = usubo v1 v0; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; +} + +func private %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = lt v0 v1; + return v2; } func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = add v0 v1; - v4.i256 = add v0 v1; - v5.i256 = evm_calldata_load v4; + (v2.i256, v3.i1) = uaddo v0 v1; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v5.i256 = evm_calldata_load v2; return v5; } -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i256 { +func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i32 { block0: - v3.i256 = shr 224.i256 v0; - v4.i256 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v3; - return v4; + v2.i256 = shr 224.i256 v0; + v3.i32 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v2; + return v3; } func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; - return v3; + v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; + return v2; } func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() -> i256 { block0: - v1.i256 = call %solencoder_h1b9228b90dad6928_new; - return v1; + v0.i256 = call %solencoder_h1b9228b90dad6928_new; + return v0; } func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v4.*i256 = gep v3 0.i256 0.i256; + v2.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v4.*i256 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; - v6.i1 = eq v5 0.i256; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block1 block2; + v6.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq v5 0.i256; + br v6 block1 block2; block1: - v10.*i8 = evm_malloc v1; - v11.i256 = ptr_to_int v10 i256; + v8.*i8 = evm_malloc v1; + v9.i256 = ptr_to_int v8 i256; + v11.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v12.*i256 = gep v11 0.i256 0.i256; + mstore v12 v9 i256; v13.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v14.*i256 = gep v13 0.i256 0.i256; - mstore v14 v11 i256; - v15.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v17.*i256 = gep v15 0.i256 1.i256; - mstore v17 v11 i256; - v18.i256 = add v11 v1; - v19.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v21.*i256 = gep v19 0.i256 2.i256; - mstore v21 v18 i256; - jump block2; + v15.*i256 = gep v13 0.i256 1.i256; + mstore v15 v9 i256; + (v16.i256, v17.i1) = uaddo v9 v1; + br v17 block3 block4; block2: v23.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; v24.*i256 = gep v23 0.i256 0.i256; v25.i256 = mload v24 i256; return v25; + + block3: + evm_revert 0.i256 0.i256; + + block4: + v19.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v21.*i256 = gep v19 0.i256 2.i256; + mstore v21 v16 i256; + jump block2; } func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { @@ -363,22 +381,28 @@ func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482 func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0.i256) -> i256 { block0: - v2.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v3.*i256 = gep v2 0.i256 0.i256; + v1.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v3.*i256 = gep v1 0.i256 0.i256; v4.i256 = mload v3 i256; v5.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; v7.*i256 = gep v5 0.i256 2.i256; v8.i256 = mload v7 i256; - v10.*i8 = evm_malloc 64.i256; - v11.i256 = ptr_to_int v10 i256; - v12.*@__fe_tuple_1 = bitcast v10 *@__fe_tuple_1; - v13.*i256 = gep v12 0.i256 0.i256; - mstore v13 v4 i256; - v14.i256 = sub v8 v4; - v15.*@__fe_tuple_1 = bitcast v10 *@__fe_tuple_1; - v17.*i256 = gep v15 0.i256 1.i256; - mstore v17 v14 i256; - return v11; + (v9.i256, v10.i1) = usubo v8 v4; + br v10 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v12.*i8 = evm_malloc 64.i256; + v13.i256 = ptr_to_int v12 i256; + v15.*@__fe_tuple_1 = bitcast v12 *@__fe_tuple_1; + v16.*i256 = gep v15 0.i256 0.i256; + mstore v16 v4 i256; + v17.*@__fe_tuple_1 = bitcast v12 *@__fe_tuple_1; + v19.*i256 = gep v17 0.i256 1.i256; + mstore v19 v9 i256; + return v13; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(v0.i256, v1.i256, v2.i256) { @@ -388,120 +412,143 @@ func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes( func private %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_CallData___fe17857f71623b98(v0.i256) -> i256 { block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - return v2; + v1.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; + return v1; } func private %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v3.*i8 = evm_malloc 96.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v6.*i256 = gep v5 0.i256 0.i256; + v2.*i8 = evm_malloc 96.i256; + v3.i256 = ptr_to_int v2 i256; + v4.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; + v6.*i256 = gep v4 0.i256 0.i256; v7.i256 = mload v6 i256; - v8.*@__fe_Cursor_2 = bitcast v3 *@__fe_Cursor_2; + v8.*@__fe_Cursor_2 = bitcast v2 *@__fe_Cursor_2; v9.*i256 = gep v8 0.i256 0.i256 0.i256; mstore v9 v7 i256; v10.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; v12.*i256 = gep v10 0.i256 1.i256; v13.i256 = mload v12 i256; - v14.*@__fe_Cursor_2 = bitcast v3 *@__fe_Cursor_2; + v14.*@__fe_Cursor_2 = bitcast v2 *@__fe_Cursor_2; v15.*i256 = gep v14 0.i256 0.i256 1.i256; mstore v15 v13 i256; - v16.*@__fe_Cursor_2 = bitcast v3 *@__fe_Cursor_2; + v16.*@__fe_Cursor_2 = bitcast v2 *@__fe_Cursor_2; v17.*i256 = gep v16 0.i256 1.i256; mstore v17 0.i256 i256; - return v4; + return v3; } func private %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { block0: - v2.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v4.*i256 = gep v2 0.i256 1.i256; + v1.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; + v4.*i256 = gep v1 0.i256 1.i256; v5.i256 = mload v4 i256; return v5; } func private %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v4.*i256 = gep v3 0.i256 0.i256; + v2.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; + v4.*i256 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; - v6.i256 = add v5 v1; - v7.i256 = add v5 v1; - v8.i256 = mload v7 i256; + (v6.i256, v7.i1) = uaddo v5 v1; + br v7 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v8.i256 = mload v6 i256; return v8; } +func private %u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = gt v0 v1; + return v2; +} + func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Foo_h6dbce71a6ea992b8__21493237fe9c2c26(v0.i256) -> i256 { block0: return v0; } -func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i256 { +func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i32 { block0: - v2.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; - v3.i256 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v2; - return v3; + v1.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; + v2.i32 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v1; + return v2; } func private %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - v4.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 v1; - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v9.*i256 = gep v8 0.i256 0.i256 0.i256; + v2.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; + v3.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 v1; + v5.*i8 = evm_malloc 96.i256; + v6.i256 = ptr_to_int v5 i256; + v7.*@__fe_Cursor_6 = int_to_ptr v3 *@__fe_Cursor_6; + v9.*i256 = gep v7 0.i256 0.i256 0.i256; v10.i256 = mload v9 i256; - v11.*@__fe_SolDecoder_7 = bitcast v6 *@__fe_SolDecoder_7; + v11.*@__fe_SolDecoder_7 = bitcast v5 *@__fe_SolDecoder_7; v12.*i256 = gep v11 0.i256 0.i256 0.i256 0.i256; mstore v12 v10 i256; - v13.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; + v13.*@__fe_Cursor_6 = int_to_ptr v3 *@__fe_Cursor_6; v15.*i256 = gep v13 0.i256 1.i256; v16.i256 = mload v15 i256; - v17.*@__fe_SolDecoder_7 = bitcast v6 *@__fe_SolDecoder_7; + v17.*@__fe_SolDecoder_7 = bitcast v5 *@__fe_SolDecoder_7; v18.*i256 = gep v17 0.i256 0.i256 1.i256; mstore v18 v16 i256; - v19.*@__fe_SolDecoder_7 = bitcast v6 *@__fe_SolDecoder_7; + v19.*@__fe_SolDecoder_7 = bitcast v5 *@__fe_SolDecoder_7; v20.*i256 = gep v19 0.i256 1.i256; mstore v20 v1 i256; - return v7; + return v6; } func private %solencoder_h1b9228b90dad6928_new() -> i256 { block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v4.*@__fe_SolEncoder_4 = bitcast v2 *@__fe_SolEncoder_4; + v1.*i8 = evm_malloc 96.i256; + v2.i256 = ptr_to_int v1 i256; + v4.*@__fe_SolEncoder_4 = bitcast v1 *@__fe_SolEncoder_4; v5.*i256 = gep v4 0.i256 0.i256; mstore v5 0.i256 i256; - v6.*@__fe_SolEncoder_4 = bitcast v2 *@__fe_SolEncoder_4; + v6.*@__fe_SolEncoder_4 = bitcast v1 *@__fe_SolEncoder_4; v8.*i256 = gep v6 0.i256 1.i256; mstore v8 0.i256 i256; - v9.*@__fe_SolEncoder_4 = bitcast v2 *@__fe_SolEncoder_4; + v9.*@__fe_SolEncoder_4 = bitcast v1 *@__fe_SolEncoder_4; v11.*i256 = gep v9 0.i256 2.i256; mstore v11 0.i256 i256; - return v3; + return v2; +} + +func private %u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; + return v2; } func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word(v0.i256, v1.i256) { block0: - v3.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v5.*i256 = gep v3 0.i256 1.i256; + v2.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v5.*i256 = gep v2 0.i256 1.i256; v6.i256 = mload v5 i256; mstore v6 v1 i256; - v8.i256 = add v6 32.i256; - v9.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v10.*i256 = gep v9 0.i256 1.i256; - mstore v10 v8 i256; + (v8.i256, v9.i1) = uaddo v6 32.i256; + br v9 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v11.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v12.*i256 = gep v11 0.i256 1.i256; + mstore v12 v8 i256; return; } func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256) -> i256 { block0: - v2.*@__fe_SolDecoder_7 = int_to_ptr v0 *@__fe_SolDecoder_7; - v3.*@__fe_Cursor_6 = gep v2 0.i256 0.i256; + v1.*@__fe_SolDecoder_7 = int_to_ptr v0 *@__fe_SolDecoder_7; + v3.*@__fe_Cursor_6 = gep v1 0.i256 0.i256; v4.i256 = ptr_to_int v3 i256; v5.*@__fe_CallData_5 = gep v3 0.i256 0.i256; v6.i256 = mload v5 i256; @@ -511,16 +558,8 @@ func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_ v10.i256 = ptr_to_int v9 i256; v12.*i256 = gep v9 0.i256 1.i256; v13.i256 = mload v12 i256; - v15.i256 = add v13 32.i256; - v16.*@__fe_SolDecoder_7 = int_to_ptr v0 *@__fe_SolDecoder_7; - v17.*@__fe_Cursor_6 = gep v16 0.i256 0.i256; - v18.i256 = ptr_to_int v17 i256; - v19.*i256 = gep v17 0.i256 1.i256; - v20.i256 = mload v19 i256; - v21.i1 = lt v15 v20; - v22.i256 = zext v21 i256; - v23.i1 = ne v22 0.i256; - br v23 block1 block3; + (v15.i256, v16.i1) = uaddo v13 32.i256; + br v16 block4 block5; block1: evm_revert 0.i256 0.i256; @@ -545,10 +584,20 @@ func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_ return v35; block3: - v43.i1 = gt v15 v7; - v44.i256 = zext v43 i256; - v45.i1 = ne v44 0.i256; - br v45 block1 block2; + v43.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt v15 v7; + br v43 block1 block2; + + block4: + evm_revert 0.i256 0.i256; + + block5: + v18.*@__fe_SolDecoder_7 = int_to_ptr v0 *@__fe_SolDecoder_7; + v19.*@__fe_Cursor_6 = gep v18 0.i256 0.i256; + v20.i256 = ptr_to_int v19 i256; + v21.*i256 = gep v19 0.i256 1.i256; + v22.i256 = mload v21 i256; + v23.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt v15 v22; + br v23 block1 block3; } func private %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0.i256) -> i256 { @@ -556,28 +605,29 @@ func private %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0.i256) return v0; } -func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i256 { +func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i32 { block0: - return v0; + v1.i32 = trunc v0 i32; + return v1; } func private %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256) -> i256 { block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_6 = bitcast v3 *@__fe_Cursor_6; - v6.*@__fe_CallData_5 = gep v5 0.i256 0.i256; + v2.*i8 = evm_malloc 64.i256; + v3.i256 = ptr_to_int v2 i256; + v4.*@__fe_Cursor_6 = bitcast v2 *@__fe_Cursor_6; + v6.*@__fe_CallData_5 = gep v4 0.i256 0.i256; mstore v6 v0 i256; - v7.*@__fe_Cursor_6 = bitcast v3 *@__fe_Cursor_6; + v7.*@__fe_Cursor_6 = bitcast v2 *@__fe_Cursor_6; v9.*i256 = gep v7 0.i256 1.i256; mstore v9 0.i256 i256; - return v4; + return v3; } func private %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_Cursor_6 = int_to_ptr v0 *@__fe_Cursor_6; - v4.*@__fe_CallData_5 = gep v3 0.i256 0.i256; + v2.*@__fe_Cursor_6 = int_to_ptr v0 *@__fe_Cursor_6; + v4.*@__fe_CallData_5 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; v7.*i8 = evm_malloc 64.i256; v8.i256 = ptr_to_int v7 i256; diff --git a/crates/codegen/tests/fixtures/sonatina_ir/if_else.snap b/crates/codegen/tests/fixtures/sonatina_ir/if_else.snap index b5e991d479..41c7f73eb6 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/if_else.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/if_else.snap @@ -5,33 +5,38 @@ input_file: crates/codegen/tests/fixtures/if_else.fe --- target = "evm-ethereum-osaka" -func private %if_else(v0.i256) -> i256 { +func private %if_else(v0.i1) -> i64 { block0: - v2.i1 = ne v0 0.i256; - br v2 block1 block2; + br v0 block1 block2; block1: - v4.i256 = call %helper 1.i256; + v3.i64 = call %helper 1.i64; jump block3; block2: - v6.i256 = call %helper 2.i256; + v5.i64 = call %helper 2.i64; jump block3; block3: - v7.i256 = phi (v4 block1) (v6 block2); - return v7; + v6.i64 = phi (v3 block1) (v5 block2); + return v6; } -func private %helper(v0.i256) -> i256 { +func private %helper(v0.i64) -> i64 { block0: - v3.i256 = add v0 1.i256; - return v3; + (v2.i64, v3.i1) = uaddo v0 1.i64; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; } func private %__fe_sonatina_entry() { block0: - v1.i256 = call %if_else 0.i256; + v1.i64 = call %if_else 0.i1; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/init_args_with_child_dep.snap b/crates/codegen/tests/fixtures/sonatina_ir/init_args_with_child_dep.snap index 69c4366cbc..bc891a329d 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/init_args_with_child_dep.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/init_args_with_child_dep.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 expression: output input_file: crates/codegen/tests/fixtures/init_args_with_child_dep.fe --- @@ -27,42 +26,40 @@ func private %__Child_init() { v2.i256 = sym_size .; v3.i256 = evm_code_size; v4.i1 = lt v3 v2; - v5.i256 = zext v4 i256; - v7.i1 = ne v5 0.i256; - br v7 block1 block2; + br v4 block1 block2; block1: call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; evm_invalid; block2: + v9.i256 = sub v3 v2; v10.i256 = sub v3 v2; - v11.i256 = sub v3 v2; - v12.*i8 = evm_malloc v11; - v13.i256 = ptr_to_int v12 i256; - v14.i256 = sub v3 v2; - evm_code_copy v13 v2 v14; - v16.*i8 = evm_malloc 64.i256; - v17.i256 = ptr_to_int v16 i256; - v18.*@__fe_MemoryBytes_0 = bitcast v16 *@__fe_MemoryBytes_0; - v19.*i256 = gep v18 0.i256 0.i256; - mstore v19 v13 i256; - v20.i256 = sub v3 v2; - v21.*@__fe_MemoryBytes_0 = bitcast v16 *@__fe_MemoryBytes_0; - v23.*i256 = gep v21 0.i256 1.i256; - mstore v23 v20 i256; - v24.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v17; - v25.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v24; - v26.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v24; - call %__Child_init_contract v25 v26; + v11.*i8 = evm_malloc v10; + v12.i256 = ptr_to_int v11 i256; + v13.i256 = sub v3 v2; + evm_code_copy v12 v2 v13; + v15.*i8 = evm_malloc 64.i256; + v16.i256 = ptr_to_int v15 i256; + v17.*@__fe_MemoryBytes_0 = bitcast v15 *@__fe_MemoryBytes_0; + v18.*i256 = gep v17 0.i256 0.i256; + mstore v18 v12 i256; + v19.i256 = sub v3 v2; + v20.*@__fe_MemoryBytes_0 = bitcast v15 *@__fe_MemoryBytes_0; + v22.*i256 = gep v20 0.i256 1.i256; + mstore v22 v19 i256; + v23.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v16; + v24.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v23; + v25.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v23; + call %__Child_init_contract v24 v25; evm_code_copy 0.i256 v0 v1; evm_return 0.i256 v1; } func private %__Child_runtime() { block0: - v1.i256 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v2.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; + v2.i32 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; + v4.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; jump block1; block1: @@ -72,15 +69,15 @@ func private %__Child_runtime() { func private %__Parent_init_contract(v0.i256, v1.i256) { block0: - v4.*i8 = evm_malloc 64.i256; - v5.i256 = ptr_to_int v4 i256; - v6.*@__fe_tuple_1 = bitcast v4 *@__fe_tuple_1; - v7.*i256 = gep v6 0.i256 0.i256; + v3.*i8 = evm_malloc 64.i256; + v4.i256 = ptr_to_int v3 i256; + v5.*@__fe_tuple_1 = bitcast v3 *@__fe_tuple_1; + v7.*i256 = gep v5 0.i256 0.i256; mstore v7 v0 i256; - v8.*@__fe_tuple_1 = bitcast v4 *@__fe_tuple_1; + v8.*@__fe_tuple_1 = bitcast v3 *@__fe_tuple_1; v10.*i256 = gep v8 0.i256 1.i256; mstore v10 v0 i256; - v11.i256 = call %create_stor_arg0_root_stor__Evm_hef0af3106e109414_Child_hdfa2e9d62e9c9ad3__8303e18f50f8d8ed v1 0.i256 v5; + v11.i256 = call %create_stor_arg0_root_stor__Evm_hef0af3106e109414_Child_hdfa2e9d62e9c9ad3__8303e18f50f8d8ed v1 0.i256 v4; return; } @@ -91,41 +88,39 @@ func private %__Parent_init() { v2.i256 = sym_size .; v3.i256 = evm_code_size; v4.i1 = lt v3 v2; - v5.i256 = zext v4 i256; - v7.i1 = ne v5 0.i256; - br v7 block1 block2; + br v4 block1 block2; block1: call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; evm_invalid; block2: + v9.i256 = sub v3 v2; v10.i256 = sub v3 v2; - v11.i256 = sub v3 v2; - v12.*i8 = evm_malloc v11; - v13.i256 = ptr_to_int v12 i256; - v14.i256 = sub v3 v2; - evm_code_copy v13 v2 v14; - v16.*i8 = evm_malloc 64.i256; - v17.i256 = ptr_to_int v16 i256; - v18.*@__fe_MemoryBytes_0 = bitcast v16 *@__fe_MemoryBytes_0; - v19.*i256 = gep v18 0.i256 0.i256; - mstore v19 v13 i256; - v20.i256 = sub v3 v2; - v21.*@__fe_MemoryBytes_0 = bitcast v16 *@__fe_MemoryBytes_0; - v23.*i256 = gep v21 0.i256 1.i256; - mstore v23 v20 i256; - v24.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v17; - v25.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v24; - call %__Parent_init_contract v25 0.i256; + v11.*i8 = evm_malloc v10; + v12.i256 = ptr_to_int v11 i256; + v13.i256 = sub v3 v2; + evm_code_copy v12 v2 v13; + v15.*i8 = evm_malloc 64.i256; + v16.i256 = ptr_to_int v15 i256; + v17.*@__fe_MemoryBytes_0 = bitcast v15 *@__fe_MemoryBytes_0; + v18.*i256 = gep v17 0.i256 0.i256; + mstore v18 v12 i256; + v19.i256 = sub v3 v2; + v20.*@__fe_MemoryBytes_0 = bitcast v15 *@__fe_MemoryBytes_0; + v22.*i256 = gep v20 0.i256 1.i256; + mstore v22 v19 i256; + v23.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v16; + v24.i256 = call %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6 v23; + call %__Parent_init_contract v24 0.i256; evm_code_copy 0.i256 v0 v1; evm_return 0.i256 v1; } func private %__Parent_runtime() { block0: - v1.i256 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v2.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; + v2.i32 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; + v4.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; jump block1; block1: @@ -140,114 +135,122 @@ func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(v0.i256 func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; + v1.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; + return v1; } func private %u256_h3271ca15373d4483_decode_hb2fe2bf528775e55_decode__Sol_hfd482bb803ad8c5f_SolDecoder_MemoryBytes___a53dbc6192a658d6(v0.i256) -> i256 { block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; + v1.i256 = call %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; + return v1; } -func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { +func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i32 { block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; - v3.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v2; - v5.i1 = lt v3 4.i256; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; + v1.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; + v2.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v1; + v4.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt v2 4.i256; + br v4 block1 block2; block1: call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort v0; evm_invalid; block2: - v10.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v2 0.i256; - v11.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v10; - return v11; + v8.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v1 0.i256; + v9.i32 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v8; + return v9; } func private %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; - v4.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 4.i256; - return v4; + v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; + v5.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 4.i256; + return v5; } func private %create_stor_arg0_root_stor__Evm_hef0af3106e109414_Child_hdfa2e9d62e9c9ad3__8303e18f50f8d8ed(v0.i256, v1.i256, v2.i256) -> i256 { block0: - v4.i256 = call %__Child_init_code_len; - v5.i256 = call %__Child_init_code_offset; - v7.i256 = add v4 64.i256; - v8.*i8 = evm_malloc v7; - v9.i256 = ptr_to_int v8 i256; - evm_code_copy v9 v5 v4; - v10.i256 = add v9 v4; - v12.*i8 = evm_malloc 96.i256; - v13.i256 = ptr_to_int v12 i256; - v14.*@__fe_SolEncoder_2 = bitcast v12 *@__fe_SolEncoder_2; - v15.*i256 = gep v14 0.i256 0.i256; - mstore v15 v10 i256; - v16.*@__fe_SolEncoder_2 = bitcast v12 *@__fe_SolEncoder_2; - v18.*i256 = gep v16 0.i256 1.i256; - mstore v18 v10 i256; - v19.i256 = add v10 64.i256; - v20.*@__fe_SolEncoder_2 = bitcast v12 *@__fe_SolEncoder_2; - v22.*i256 = gep v20 0.i256 2.i256; - mstore v22 v19 i256; - call %_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64 v2 v13; - v23.i256 = call %evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create_raw_stor_arg0_root_stor v0 v1 v9 v7; - v24.i1 = eq v23 0.i256; - v25.i256 = zext v24 i256; - v26.i1 = ne v25 0.i256; - br v26 block1 block2; + v3.i256 = call %__Child_init_code_len; + v4.i256 = call %__Child_init_code_offset; + (v6.i256, v7.i1) = uaddo v3 64.i256; + br v7 block3 block4; block1: - v27.i256 = evm_return_data_size; - v28.*i8 = evm_malloc v27; - v29.i256 = ptr_to_int v28 i256; - evm_return_data_copy v29 0.i256 v27; - evm_revert v29 v27; + v37.i256 = evm_return_data_size; + v38.*i8 = evm_malloc v37; + v39.i256 = ptr_to_int v38 i256; + evm_return_data_copy v39 0.i256 v37; + evm_revert v39 v37; block2: - return v23; + return v35; + + block3: + evm_revert 0.i256 0.i256; + + block4: + v9.*i8 = evm_malloc v6; + v10.i256 = ptr_to_int v9 i256; + evm_code_copy v10 v4 v3; + (v13.i256, v14.i1) = uaddo v10 v3; + br v14 block3 block5; + + block5: + (v16.i256, v17.i1) = uaddo v13 64.i256; + br v17 block3 block6; + + block6: + v19.*i8 = evm_malloc 96.i256; + v20.i256 = ptr_to_int v19 i256; + v22.*@__fe_SolEncoder_2 = bitcast v19 *@__fe_SolEncoder_2; + v23.*i256 = gep v22 0.i256 0.i256; + mstore v23 v13 i256; + v24.*@__fe_SolEncoder_2 = bitcast v19 *@__fe_SolEncoder_2; + v26.*i256 = gep v24 0.i256 1.i256; + mstore v26 v13 i256; + v27.*@__fe_SolEncoder_2 = bitcast v19 *@__fe_SolEncoder_2; + v29.*i256 = gep v27 0.i256 2.i256; + mstore v29 v16 i256; + call %_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64 v2 v20; + v35.i256 = call %evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create_raw_stor_arg0_root_stor v0 v1 v10 v6; + v36.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq v35 0.i256; + br v36 block1 block2; } func private %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v2.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - v4.*i8 = evm_malloc 128.i256; - v5.i256 = ptr_to_int v4 i256; - v6.*@__fe_Cursor_3 = int_to_ptr v2 *@__fe_Cursor_3; - v7.*i256 = gep v6 0.i256 0.i256 0.i256; + v1.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; + v3.*i8 = evm_malloc 128.i256; + v4.i256 = ptr_to_int v3 i256; + v5.*@__fe_Cursor_3 = int_to_ptr v1 *@__fe_Cursor_3; + v7.*i256 = gep v5 0.i256 0.i256 0.i256; v8.i256 = mload v7 i256; - v9.*@__fe_SolDecoder_4 = bitcast v4 *@__fe_SolDecoder_4; + v9.*@__fe_SolDecoder_4 = bitcast v3 *@__fe_SolDecoder_4; v10.*i256 = gep v9 0.i256 0.i256 0.i256 0.i256; mstore v10 v8 i256; - v11.*@__fe_Cursor_3 = int_to_ptr v2 *@__fe_Cursor_3; + v11.*@__fe_Cursor_3 = int_to_ptr v1 *@__fe_Cursor_3; v13.*i256 = gep v11 0.i256 0.i256 1.i256; v14.i256 = mload v13 i256; - v15.*@__fe_SolDecoder_4 = bitcast v4 *@__fe_SolDecoder_4; + v15.*@__fe_SolDecoder_4 = bitcast v3 *@__fe_SolDecoder_4; v16.*i256 = gep v15 0.i256 0.i256 0.i256 1.i256; mstore v16 v14 i256; - v17.*@__fe_Cursor_3 = int_to_ptr v2 *@__fe_Cursor_3; + v17.*@__fe_Cursor_3 = int_to_ptr v1 *@__fe_Cursor_3; v18.*i256 = gep v17 0.i256 1.i256; v19.i256 = mload v18 i256; - v20.*@__fe_SolDecoder_4 = bitcast v4 *@__fe_SolDecoder_4; + v20.*@__fe_SolDecoder_4 = bitcast v3 *@__fe_SolDecoder_4; v21.*i256 = gep v20 0.i256 0.i256 1.i256; mstore v21 v19 i256; - v22.*@__fe_SolDecoder_4 = bitcast v4 *@__fe_SolDecoder_4; + v22.*@__fe_SolDecoder_4 = bitcast v3 *@__fe_SolDecoder_4; v23.*i256 = gep v22 0.i256 1.i256; mstore v23 0.i256 i256; - return v5; + return v4; } func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_word__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v2.*@__fe_SolDecoder_4 = int_to_ptr v0 *@__fe_SolDecoder_4; - v3.*@__fe_Cursor_3 = gep v2 0.i256 0.i256; + v1.*@__fe_SolDecoder_4 = int_to_ptr v0 *@__fe_SolDecoder_4; + v3.*@__fe_Cursor_3 = gep v1 0.i256 0.i256; v4.i256 = ptr_to_int v3 i256; v5.*@__fe_MemoryBytes_0 = gep v3 0.i256 0.i256; v6.i256 = ptr_to_int v5 i256; @@ -257,16 +260,8 @@ func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_ v10.i256 = ptr_to_int v9 i256; v12.*i256 = gep v9 0.i256 1.i256; v13.i256 = mload v12 i256; - v15.i256 = add v13 32.i256; - v16.*@__fe_SolDecoder_4 = int_to_ptr v0 *@__fe_SolDecoder_4; - v17.*@__fe_Cursor_3 = gep v16 0.i256 0.i256; - v18.i256 = ptr_to_int v17 i256; - v19.*i256 = gep v17 0.i256 1.i256; - v20.i256 = mload v19 i256; - v21.i1 = lt v15 v20; - v22.i256 = zext v21 i256; - v23.i1 = ne v22 0.i256; - br v23 block1 block3; + (v15.i256, v16.i1) = uaddo v13 32.i256; + br v16 block4 block5; block1: evm_revert 0.i256 0.i256; @@ -291,10 +286,20 @@ func private %soldecoder_i__ha12a03fcb5ba844b_abidecoder_h638151350e80a086_read_ return v35; block3: - v43.i1 = gt v15 v7; - v44.i256 = zext v43 i256; - v45.i1 = ne v44 0.i256; - br v45 block1 block2; + v43.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt v15 v7; + br v43 block1 block2; + + block4: + evm_revert 0.i256 0.i256; + + block5: + v18.*@__fe_SolDecoder_4 = int_to_ptr v0 *@__fe_SolDecoder_4; + v19.*@__fe_Cursor_3 = gep v18 0.i256 0.i256; + v20.i256 = ptr_to_int v19 i256; + v21.*i256 = gep v19 0.i256 1.i256; + v22.i256 = mload v21 i256; + v23.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt v15 v22; + br v23 block1 block3; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256) -> i256 { @@ -304,48 +309,65 @@ func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256 func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { block0: - v2.i256 = evm_calldata_size; - v3.i256 = sub v2 v0; - return v3; + v1.i256 = evm_calldata_size; + (v2.i256, v3.i1) = usubo v1 v0; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; +} + +func private %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = lt v0 v1; + return v2; } func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = add v0 v1; - v4.i256 = add v0 v1; - v5.i256 = evm_calldata_load v4; + (v2.i256, v3.i1) = uaddo v0 v1; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v5.i256 = evm_calldata_load v2; return v5; } -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i256 { +func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i32 { block0: - v3.i256 = shr 224.i256 v0; - v4.i256 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v3; - return v4; + v2.i256 = shr 224.i256 v0; + v3.i32 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v2; + return v3; } func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; - return v3; + v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; + return v2; } func private %__Child_init_code_len() -> i256 { block0: - v1.i256 = sym_size &__Child_init; - return v1; + v0.i256 = sym_size &__Child_init; + return v0; } func private %__Child_init_code_offset() -> i256 { block0: - v1.i256 = sym_addr &__Child_init; - return v1; + v0.i256 = sym_addr &__Child_init; + return v0; } func private %_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_u256_u256_SolEncoder_h1b9228b90dad6928__9e0831f7c11d9f64(v0.i256, v1.i256) { block0: - v3.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v4.*i256 = gep v3 0.i256 0.i256; + v2.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; + v4.*i256 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v5 v1; v6.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; @@ -357,80 +379,97 @@ func private %_t0__t1__h61373471174c18a_encode_hab7243eccf2714fb_encode__Sol_hfd func private %evm_hef0af3106e109414_create_h3f3c4b410ec53b45_create_raw_stor_arg0_root_stor(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { block0: - v5.i256 = evm_create v1 v2 v3; - return v5; + v4.i256 = evm_create v1 v2 v3; + return v4; +} + +func private %u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; + return v2; } func private %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v3.*i8 = evm_malloc 96.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v6.*i256 = gep v5 0.i256 0.i256; + v2.*i8 = evm_malloc 96.i256; + v3.i256 = ptr_to_int v2 i256; + v4.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; + v6.*i256 = gep v4 0.i256 0.i256; v7.i256 = mload v6 i256; - v8.*@__fe_Cursor_3 = bitcast v3 *@__fe_Cursor_3; + v8.*@__fe_Cursor_3 = bitcast v2 *@__fe_Cursor_3; v9.*i256 = gep v8 0.i256 0.i256 0.i256; mstore v9 v7 i256; v10.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; v12.*i256 = gep v10 0.i256 1.i256; v13.i256 = mload v12 i256; - v14.*@__fe_Cursor_3 = bitcast v3 *@__fe_Cursor_3; + v14.*@__fe_Cursor_3 = bitcast v2 *@__fe_Cursor_3; v15.*i256 = gep v14 0.i256 0.i256 1.i256; mstore v15 v13 i256; - v16.*@__fe_Cursor_3 = bitcast v3 *@__fe_Cursor_3; + v16.*@__fe_Cursor_3 = bitcast v2 *@__fe_Cursor_3; v17.*i256 = gep v16 0.i256 1.i256; mstore v17 0.i256 i256; - return v4; + return v3; } func private %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { block0: - v2.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v4.*i256 = gep v2 0.i256 1.i256; + v1.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; + v4.*i256 = gep v1 0.i256 1.i256; v5.i256 = mload v4 i256; return v5; } func private %memorybytes_h1e381015a9b0111b_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v4.*i256 = gep v3 0.i256 0.i256; + v2.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; + v4.*i256 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; - v6.i256 = add v5 v1; - v7.i256 = add v5 v1; - v8.i256 = mload v7 i256; + (v6.i256, v7.i1) = uaddo v5 v1; + br v7 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v8.i256 = mload v6 i256; return v8; } -func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i256 { +func private %u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0.i256, v1.i256) -> i1 { block0: - v2.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; - v3.i256 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v2; - return v3; + v2.i1 = gt v0 v1; + return v2; +} + +func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i32 { + block0: + v1.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; + v2.i32 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v1; + return v2; } func private %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - v4.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 v1; - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v9.*i256 = gep v8 0.i256 0.i256 0.i256; + v2.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; + v3.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 v1; + v5.*i8 = evm_malloc 96.i256; + v6.i256 = ptr_to_int v5 i256; + v7.*@__fe_Cursor_6 = int_to_ptr v3 *@__fe_Cursor_6; + v9.*i256 = gep v7 0.i256 0.i256 0.i256; v10.i256 = mload v9 i256; - v11.*@__fe_SolDecoder_7 = bitcast v6 *@__fe_SolDecoder_7; + v11.*@__fe_SolDecoder_7 = bitcast v5 *@__fe_SolDecoder_7; v12.*i256 = gep v11 0.i256 0.i256 0.i256 0.i256; mstore v12 v10 i256; - v13.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; + v13.*@__fe_Cursor_6 = int_to_ptr v3 *@__fe_Cursor_6; v15.*i256 = gep v13 0.i256 1.i256; v16.i256 = mload v15 i256; - v17.*@__fe_SolDecoder_7 = bitcast v6 *@__fe_SolDecoder_7; + v17.*@__fe_SolDecoder_7 = bitcast v5 *@__fe_SolDecoder_7; v18.*i256 = gep v17 0.i256 0.i256 1.i256; mstore v18 v16 i256; - v19.*@__fe_SolDecoder_7 = bitcast v6 *@__fe_SolDecoder_7; + v19.*@__fe_SolDecoder_7 = bitcast v5 *@__fe_SolDecoder_7; v20.*i256 = gep v19 0.i256 1.i256; mstore v20 v1 i256; - return v7; + return v6; } func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { @@ -444,28 +483,29 @@ func private %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0.i256) return v0; } -func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i256 { +func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i32 { block0: - return v0; + v1.i32 = trunc v0 i32; + return v1; } func private %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256) -> i256 { block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_6 = bitcast v3 *@__fe_Cursor_6; - v6.*@__fe_CallData_5 = gep v5 0.i256 0.i256; + v2.*i8 = evm_malloc 64.i256; + v3.i256 = ptr_to_int v2 i256; + v4.*@__fe_Cursor_6 = bitcast v2 *@__fe_Cursor_6; + v6.*@__fe_CallData_5 = gep v4 0.i256 0.i256; mstore v6 v0 i256; - v7.*@__fe_Cursor_6 = bitcast v3 *@__fe_Cursor_6; + v7.*@__fe_Cursor_6 = bitcast v2 *@__fe_Cursor_6; v9.*i256 = gep v7 0.i256 1.i256; mstore v9 0.i256 i256; - return v4; + return v3; } func private %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_Cursor_6 = int_to_ptr v0 *@__fe_Cursor_6; - v4.*@__fe_CallData_5 = gep v3 0.i256 0.i256; + v2.*@__fe_Cursor_6 = int_to_ptr v0 *@__fe_Cursor_6; + v4.*@__fe_CallData_5 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; v7.*i8 = evm_malloc 64.i256; v8.i256 = ptr_to_int v7 i256; @@ -480,14 +520,20 @@ func private %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5 func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word(v0.i256, v1.i256) { block0: - v3.*@__fe_SolEncoder_2 = int_to_ptr v0 *@__fe_SolEncoder_2; - v5.*i256 = gep v3 0.i256 1.i256; + v2.*@__fe_SolEncoder_2 = int_to_ptr v0 *@__fe_SolEncoder_2; + v5.*i256 = gep v2 0.i256 1.i256; v6.i256 = mload v5 i256; mstore v6 v1 i256; - v8.i256 = add v6 32.i256; - v9.*@__fe_SolEncoder_2 = int_to_ptr v0 *@__fe_SolEncoder_2; - v10.*i256 = gep v9 0.i256 1.i256; - mstore v10 v8 i256; + (v8.i256, v9.i1) = uaddo v6 32.i256; + br v9 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v11.*@__fe_SolEncoder_2 = int_to_ptr v0 *@__fe_SolEncoder_2; + v12.*i256 = gep v11 0.i256 1.i256; + mstore v12 v8 i256; return; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/intrinsic_ops.snap b/crates/codegen/tests/fixtures/sonatina_ir/intrinsic_ops.snap index 19d8164e7f..bf0fe7811d 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/intrinsic_ops.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/intrinsic_ops.snap @@ -7,8 +7,8 @@ target = "evm-ethereum-osaka" func private %load_word__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = mload v0 i256; - return v3; + v2.i256 = mload v0 i256; + return v2; } func private %store_word__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256, v2.i256) { @@ -17,7 +17,7 @@ func private %store_word__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i2 return; } -func private %store_byte__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256, v2.i256) { +func private %store_byte__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i8, v2.i256) { block0: evm_mstore8 v0 v1; return; @@ -25,8 +25,8 @@ func private %store_byte__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i2 func private %load_slot__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = evm_sload v0; - return v3; + v2.i256 = evm_sload v0; + return v2; } func private %store_slot__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256, v2.i256) { @@ -37,8 +37,8 @@ func private %store_slot__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i2 func private %load_calldata__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = evm_calldata_load v0; - return v3; + v2.i256 = evm_calldata_load v0; + return v2; } func private %finish__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256, v2.i256) { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/keccak_intrinsic.snap b/crates/codegen/tests/fixtures/sonatina_ir/keccak_intrinsic.snap index 247e8c58d2..4305542ed8 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/keccak_intrinsic.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/keccak_intrinsic.snap @@ -7,8 +7,8 @@ target = "evm-ethereum-osaka" func private %hash__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i256, v2.i256) -> i256 { block0: - v4.i256 = evm_keccak256 v0 v1; - return v4; + v3.i256 = evm_keccak256 v0 v1; + return v3; } func private %__fe_sonatina_entry() { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/literal_add.snap b/crates/codegen/tests/fixtures/sonatina_ir/literal_add.snap index 7c3805e357..ef130f09d7 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/literal_add.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/literal_add.snap @@ -5,21 +5,27 @@ input_file: crates/codegen/tests/fixtures/literal_add.fe --- target = "evm-ethereum-osaka" -func private %main() -> i256 { +func private %main() -> i64 { block0: - v3.i256 = call %add 10.i256 20.i256; - return v3; + v2.i64 = call %add 10.i64 20.i64; + return v2; } -func private %add(v0.i256, v1.i256) -> i256 { +func private %add(v0.i64, v1.i64) -> i64 { block0: - v3.i256 = add v0 v1; - return v3; + (v2.i64, v3.i1) = uaddo v0 v1; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; } func private %__fe_sonatina_entry() { block0: - v0.i256 = call %main; + v0.i64 = call %main; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/literal_sub.snap b/crates/codegen/tests/fixtures/sonatina_ir/literal_sub.snap index 28eb11064c..ddc1a5272f 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/literal_sub.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/literal_sub.snap @@ -5,15 +5,21 @@ input_file: crates/codegen/tests/fixtures/literal_sub.fe --- target = "evm-ethereum-osaka" -func private %literal_sub() -> i256 { +func private %literal_sub() -> i64 { block0: - v3.i256 = sub 1.i256 2.i256; - return v3; + (v2.i64, v3.i1) = usubo 1.i64 2.i64; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; } func private %__fe_sonatina_entry() { block0: - v0.i256 = call %literal_sub; + v0.i64 = call %literal_sub; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/local_bindings.snap b/crates/codegen/tests/fixtures/sonatina_ir/local_bindings.snap index 193d6dbeea..d3bec2e881 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/local_bindings.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/local_bindings.snap @@ -5,15 +5,21 @@ input_file: crates/codegen/tests/fixtures/local_bindings.fe --- target = "evm-ethereum-osaka" -func private %local_bindings() -> i256 { +func private %local_bindings() -> i64 { block0: - v3.i256 = add 1.i256 2.i256; - return 3.i256; + (v2.i64, v3.i1) = uaddo 1.i64 2.i64; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return 3.i64; } func private %__fe_sonatina_entry() { block0: - v0.i256 = call %local_bindings; + v0.i64 = call %local_bindings; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/logical_ops.snap b/crates/codegen/tests/fixtures/sonatina_ir/logical_ops.snap index 6c064eb27d..ab1dc2e23b 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/logical_ops.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/logical_ops.snap @@ -5,15 +5,15 @@ input_file: crates/codegen/tests/fixtures/logical_ops.fe --- target = "evm-ethereum-osaka" -func private %logical_ops() -> i256 { +func private %logical_ops() -> i1 { block0: - v2.i256 = and 1.i256 0.i256; + v2.i1 = and 1.i1 0.i1; return v2; } func private %__fe_sonatina_entry() { block0: - v0.i256 = call %logical_ops; + v0.i1 = call %logical_ops; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_enum.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_enum.snap index ca0f74b3d0..31cb244a4e 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_enum.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/match_enum.snap @@ -5,7 +5,7 @@ input_file: crates/codegen/tests/fixtures/match_enum.fe --- target = "evm-ethereum-osaka" -func private %match_enum(v0.i256) -> i256 { +func private %match_enum(v0.i256) -> i8 { block0: jump block6; @@ -13,7 +13,7 @@ func private %match_enum(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4) (4.i256 block5); + v3.i8 = phi (1.i8 block1) (2.i8 block3) (3.i8 block4) (4.i8 block5); return v3; block3: @@ -33,7 +33,7 @@ func private %match_enum(v0.i256) -> i256 { func private %__fe_sonatina_entry() { block0: - v1.i256 = call %match_enum 0.i256; + v1.i8 = call %match_enum 0.i256; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_enum_with_data.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_enum_with_data.snap index 298dc048c0..c12933cd69 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_enum_with_data.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/match_enum_with_data.snap @@ -5,21 +5,20 @@ input_file: crates/codegen/tests/fixtures/match_enum_with_data.fe --- target = "evm-ethereum-osaka" -func private %make_some(v0.i256) -> i256 { +func private %make_some(v0.i64) -> i256 { block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v6.*i256 = bitcast v3 *i256; - mstore v6 1.i256 i256; - v7.i64 = trunc v0 i64; - v8.i256 = zext v7 i256; - v10.i256 = add v4 32.i256; - v11.*i256 = int_to_ptr v10 *i256; - mstore v11 v8 i256; - return v4; + v2.*i8 = evm_malloc 64.i256; + v3.i256 = ptr_to_int v2 i256; + v5.*i256 = bitcast v2 *i256; + mstore v5 1.i256 i256; + v6.i256 = zext v0 i256; + v8.i256 = add v3 32.i256; + v9.*i256 = int_to_ptr v8 *i256; + mstore v9 v6 i256; + return v3; } -func private %match_option(v0.i256) -> i256 { +func private %match_option(v0.i256) -> i64 { block0: jump block4; @@ -28,20 +27,19 @@ func private %match_option(v0.i256) -> i256 { v5.*i256 = int_to_ptr v4 *i256; v6.i256 = mload v5 i256; v7.i64 = trunc v6 i64; - v8.i256 = zext v7 i256; jump block2; block2: - v10.i256 = phi (v8 block1) (0.i256 block3); - return v10; + v9.i64 = phi (v7 block1) (0.i64 block3); + return v9; block3: jump block2; block4: - v12.*i256 = int_to_ptr v0 *i256; - v13.i256 = mload v12 i256; - br_table v13 block5 (1.i256 block1) (0.i256 block3); + v11.*i256 = int_to_ptr v0 *i256; + v12.i256 = mload v11 i256; + br_table v12 block5 (1.i256 block1) (0.i256 block3); block5: evm_invalid; @@ -49,7 +47,7 @@ func private %match_option(v0.i256) -> i256 { func private %__fe_sonatina_entry() { block0: - v1.i256 = call %make_some 0.i256; + v1.i256 = call %make_some 0.i64; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_fn_call.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_fn_call.snap index 7377280a0f..e6a7a203e5 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_fn_call.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/match_fn_call.snap @@ -7,7 +7,7 @@ target = "evm-ethereum-osaka" func private %example__Evm_hef0af3106e109414__3af54274b2985741(v0.i256) -> i256 { block0: - v2.i256 = call %read_selector__Evm_hef0af3106e109414__3af54274b2985741 v0; + v1.i256 = call %read_selector__Evm_hef0af3106e109414__3af54274b2985741 v0; jump block5; block1: @@ -24,7 +24,7 @@ func private %example__Evm_hef0af3106e109414__3af54274b2985741(v0.i256) -> i256 jump block2; block5: - br_table v2 block4 (305419896.i256 block1) (591751049.i256 block3); + br_table v1 block4 (305419896.i256 block1) (591751049.i256 block3); } func private %read_selector__Evm_hef0af3106e109414__3af54274b2985741(v0.i256) -> i256 { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_literal.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_literal.snap index 51e7f6aa1a..450bc3cdf8 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_literal.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/match_literal.snap @@ -5,7 +5,7 @@ input_file: crates/codegen/tests/fixtures/match_literal.fe --- target = "evm-ethereum-osaka" -func private %match_bool(v0.i256) -> i256 { +func private %match_bool(v0.i1) -> i64 { block0: jump block4; @@ -13,17 +13,17 @@ func private %match_bool(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3); + v3.i64 = phi (1.i64 block1) (2.i64 block3); return v3; block3: jump block2; block4: - br_table v0 block3 (1.i256 block1); + br_table v0 block3 (1.i1 block1); } -func private %match_u8(v0.i256) -> i256 { +func private %match_u8(v0.i8) -> i8 { block0: jump block5; @@ -31,7 +31,7 @@ func private %match_u8(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); + v3.i8 = phi (1.i8 block1) (2.i8 block3) (3.i8 block4); return v3; block3: @@ -41,10 +41,10 @@ func private %match_u8(v0.i256) -> i256 { jump block2; block5: - br_table v0 block4 (0.i256 block1) (255.i256 block3); + br_table v0 block4 (0.i8 block1) (-1.i8 block3); } -func private %match_u16(v0.i256) -> i256 { +func private %match_u16(v0.i16) -> i16 { block0: jump block5; @@ -52,7 +52,7 @@ func private %match_u16(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); + v3.i16 = phi (1.i16 block1) (2.i16 block3) (3.i16 block4); return v3; block3: @@ -62,10 +62,10 @@ func private %match_u16(v0.i256) -> i256 { jump block2; block5: - br_table v0 block4 (4660.i256 block1) (43981.i256 block3); + br_table v0 block4 (4660.i16 block1) (-21555.i16 block3); } -func private %match_u32(v0.i256) -> i256 { +func private %match_u32(v0.i32) -> i32 { block0: jump block5; @@ -73,7 +73,7 @@ func private %match_u32(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); + v3.i32 = phi (1.i32 block1) (2.i32 block3) (3.i32 block4); return v3; block3: @@ -83,10 +83,10 @@ func private %match_u32(v0.i256) -> i256 { jump block2; block5: - br_table v0 block4 (3735928559.i256 block1) (3405691582.i256 block3); + br_table v0 block4 (-559038737.i32 block1) (-889275714.i32 block3); } -func private %match_u64(v0.i256) -> i256 { +func private %match_u64(v0.i64) -> i64 { block0: jump block5; @@ -94,7 +94,7 @@ func private %match_u64(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); + v3.i64 = phi (1.i64 block1) (2.i64 block3) (3.i64 block4); return v3; block3: @@ -104,10 +104,10 @@ func private %match_u64(v0.i256) -> i256 { jump block2; block5: - br_table v0 block4 (0.i256 block1) (18446744073709551615.i256 block3); + br_table v0 block4 (0.i64 block1) (-1.i64 block3); } -func private %match_u128(v0.i256) -> i256 { +func private %match_u128(v0.i128) -> i128 { block0: jump block5; @@ -115,7 +115,7 @@ func private %match_u128(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); + v3.i128 = phi (1.i128 block1) (2.i128 block3) (3.i128 block4); return v3; block3: @@ -125,7 +125,7 @@ func private %match_u128(v0.i256) -> i256 { jump block2; block5: - br_table v0 block4 (0.i256 block1) (340282366920938463463374607431768211455.i256 block3); + br_table v0 block4 (0.i128 block1) (-1.i128 block3); } func private %match_u256(v0.i256) -> i256 { @@ -149,7 +149,7 @@ func private %match_u256(v0.i256) -> i256 { br_table v0 block4 (0.i256 block1) (-1.i256 block3); } -func private %match_i8(v0.i256) -> i256 { +func private %match_i8(v0.i8) -> i8 { block0: jump block5; @@ -157,7 +157,7 @@ func private %match_i8(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); + v3.i8 = phi (1.i8 block1) (2.i8 block3) (3.i8 block4); return v3; block3: @@ -167,10 +167,10 @@ func private %match_i8(v0.i256) -> i256 { jump block2; block5: - br_table v0 block4 (0.i256 block1) (99.i256 block3); + br_table v0 block4 (0.i8 block1) (99.i8 block3); } -func private %match_i16(v0.i256) -> i256 { +func private %match_i16(v0.i16) -> i16 { block0: jump block5; @@ -178,7 +178,7 @@ func private %match_i16(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); + v3.i16 = phi (1.i16 block1) (2.i16 block3) (3.i16 block4); return v3; block3: @@ -188,10 +188,10 @@ func private %match_i16(v0.i256) -> i256 { jump block2; block5: - br_table v0 block4 (0.i256 block1) (32000.i256 block3); + br_table v0 block4 (0.i16 block1) (32000.i16 block3); } -func private %match_i32(v0.i256) -> i256 { +func private %match_i32(v0.i32) -> i32 { block0: jump block5; @@ -199,7 +199,7 @@ func private %match_i32(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); + v3.i32 = phi (1.i32 block1) (2.i32 block3) (3.i32 block4); return v3; block3: @@ -209,10 +209,10 @@ func private %match_i32(v0.i256) -> i256 { jump block2; block5: - br_table v0 block4 (0.i256 block1) (2000000000.i256 block3); + br_table v0 block4 (0.i32 block1) (2000000000.i32 block3); } -func private %match_i64(v0.i256) -> i256 { +func private %match_i64(v0.i64) -> i64 { block0: jump block5; @@ -220,7 +220,7 @@ func private %match_i64(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); + v3.i64 = phi (1.i64 block1) (2.i64 block3) (3.i64 block4); return v3; block3: @@ -230,10 +230,10 @@ func private %match_i64(v0.i256) -> i256 { jump block2; block5: - br_table v0 block4 (0.i256 block1) (9223372036854775807.i256 block3); + br_table v0 block4 (0.i64 block1) (9223372036854775807.i64 block3); } -func private %match_i128(v0.i256) -> i256 { +func private %match_i128(v0.i128) -> i128 { block0: jump block5; @@ -241,7 +241,7 @@ func private %match_i128(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); + v3.i128 = phi (1.i128 block1) (2.i128 block3) (3.i128 block4); return v3; block3: @@ -251,7 +251,7 @@ func private %match_i128(v0.i256) -> i256 { jump block2; block5: - br_table v0 block4 (0.i256 block1) (170141183460469231731687303715884105727.i256 block3); + br_table v0 block4 (0.i128 block1) (170141183460469231731687303715884105727.i128 block3); } func private %match_i256(v0.i256) -> i256 { @@ -277,7 +277,7 @@ func private %match_i256(v0.i256) -> i256 { func private %__fe_sonatina_entry() { block0: - v1.i256 = call %match_bool 0.i256; + v1.i64 = call %match_bool 0.i1; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_mixed_return.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_mixed_return.snap index 4edbe08bbc..d12fcd0354 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_mixed_return.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/match_mixed_return.snap @@ -16,16 +16,22 @@ func private %f(v0.i256) -> i256 { jump block3; block3: - v4.i256 = add 1.i256 1.i256; - return v4; + (v4.i256, v5.i1) = uaddo 1.i256 1.i256; + br v5 block6 block7; block4: - v6.*i256 = int_to_ptr v0 *i256; - v7.i256 = mload v6 i256; - br_table v7 block5 (0.i256 block1) (1.i256 block2); + v7.*i256 = int_to_ptr v0 *i256; + v8.i256 = mload v7 i256; + br_table v8 block5 (0.i256 block1) (1.i256 block2); block5: evm_invalid; + + block6: + evm_revert 0.i256 0.i256; + + block7: + return v4; } func private %__fe_sonatina_entry() { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_nested_default.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_nested_default.snap index 49ee52ac61..be1d9b10c7 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_nested_default.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/match_nested_default.snap @@ -5,7 +5,7 @@ input_file: crates/codegen/tests/fixtures/match_nested_default.fe --- target = "evm-ethereum-osaka" -func private %nested_with_defaults(v0.i256) -> i256 { +func private %nested_with_defaults(v0.i256) -> i8 { block0: jump block5; @@ -13,7 +13,7 @@ func private %nested_with_defaults(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (0.i256 block4); + v3.i8 = phi (1.i8 block1) (2.i8 block3) (0.i8 block4); return v3; block3: @@ -28,19 +28,19 @@ func private %nested_with_defaults(v0.i256) -> i256 { br_table v7 block4 (0.i256 block6) (1.i256 block7); block6: - v10.i256 = add v0 32.i256; - v11.*i256 = int_to_ptr v10 *i256; - v12.i256 = mload v11 i256; - br_table v12 block4 (0.i256 block1); + v12.i256 = add v0 32.i256; + v13.*i256 = int_to_ptr v12 *i256; + v14.i256 = mload v13 i256; + br_table v14 block4 (0.i256 block1); block7: - v14.i256 = add v0 32.i256; - v15.*i256 = int_to_ptr v14 *i256; - v16.i256 = mload v15 i256; - br_table v16 block4 (1.i256 block3); + v16.i256 = add v0 32.i256; + v17.*i256 = int_to_ptr v16 *i256; + v18.i256 = mload v17 i256; + br_table v18 block4 (1.i256 block3); } -func private %outer_specific_inner_wildcard(v0.i256) -> i256 { +func private %outer_specific_inner_wildcard(v0.i256) -> i8 { block0: jump block5; @@ -48,7 +48,7 @@ func private %outer_specific_inner_wildcard(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); + v3.i8 = phi (1.i8 block1) (2.i8 block3) (3.i8 block4); return v3; block3: @@ -63,13 +63,13 @@ func private %outer_specific_inner_wildcard(v0.i256) -> i256 { br_table v8 block4 (0.i256 block6); block6: - v11.i256 = add v0 32.i256; - v12.*i256 = int_to_ptr v11 *i256; - v13.i256 = mload v12 i256; - br_table v13 block3 (0.i256 block1); + v12.i256 = add v0 32.i256; + v13.*i256 = int_to_ptr v12 *i256; + v14.i256 = mload v13 i256; + br_table v14 block3 (0.i256 block1); } -func private %deeply_nested_wildcard(v0.i256) -> i256 { +func private %deeply_nested_wildcard(v0.i256) -> i8 { block0: jump block4; @@ -77,7 +77,7 @@ func private %deeply_nested_wildcard(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (1.i256 block1) (0.i256 block3); + v3.i8 = phi (1.i8 block1) (0.i8 block3); return v3; block3: @@ -89,19 +89,19 @@ func private %deeply_nested_wildcard(v0.i256) -> i256 { br_table v6 block3 (0.i256 block5); block5: - v9.i256 = add v0 32.i256; - v10.*i256 = int_to_ptr v9 *i256; - v11.i256 = mload v10 i256; - br_table v11 block3 (0.i256 block6); + v10.i256 = add v0 32.i256; + v11.*i256 = int_to_ptr v10 *i256; + v12.i256 = mload v11 i256; + br_table v12 block3 (0.i256 block6); block6: - v14.i256 = add v0 64.i256; - v15.*i256 = int_to_ptr v14 *i256; - v16.i256 = mload v15 i256; - br_table v16 block3 (0.i256 block1); + v15.i256 = add v0 64.i256; + v16.*i256 = int_to_ptr v15 *i256; + v17.i256 = mload v16 i256; + br_table v17 block3 (0.i256 block1); } -func private %exhaustive_inner_outer_wildcard(v0.i256) -> i256 { +func private %exhaustive_inner_outer_wildcard(v0.i256) -> i8 { block0: jump block6; @@ -109,7 +109,7 @@ func private %exhaustive_inner_outer_wildcard(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4) (0.i256 block5); + v3.i8 = phi (1.i8 block1) (2.i8 block3) (3.i8 block4) (0.i8 block5); return v3; block3: @@ -127,15 +127,15 @@ func private %exhaustive_inner_outer_wildcard(v0.i256) -> i256 { br_table v8 block5 (0.i256 block7); block7: - v11.i256 = add v0 32.i256; - v12.*i256 = int_to_ptr v11 *i256; - v13.i256 = mload v12 i256; - br_table v13 block5 (0.i256 block1) (1.i256 block3) (2.i256 block4); + v12.i256 = add v0 32.i256; + v13.*i256 = int_to_ptr v12 *i256; + v14.i256 = mload v13 i256; + br_table v14 block5 (0.i256 block1) (1.i256 block3) (2.i256 block4); } func private %__fe_sonatina_entry() { block0: - v1.i256 = call %nested_with_defaults 0.i256; + v1.i8 = call %nested_with_defaults 0.i256; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_nested_enum.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_nested_enum.snap index 6e5b7ddcaa..8406fb5fec 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_nested_enum.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/match_nested_enum.snap @@ -5,7 +5,7 @@ input_file: crates/codegen/tests/fixtures/match_nested_enum.fe --- target = "evm-ethereum-osaka" -func private %match_nested_enum(v0.i256) -> i256 { +func private %match_nested_enum(v0.i256) -> i8 { block0: jump block5; @@ -13,7 +13,7 @@ func private %match_nested_enum(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (0.i256 block1) (v10 block3) (v17 block4); + v3.i8 = phi (0.i8 block1) (v9 block3) (v15 block4); return v3; block3: @@ -21,27 +21,25 @@ func private %match_nested_enum(v0.i256) -> i256 { v7.*i256 = int_to_ptr v6 *i256; v8.i256 = mload v7 i256; v9.i8 = trunc v8 i8; - v10.i256 = zext v9 i256; jump block2; block4: - v13.i256 = add v0 32.i256; - v14.*i256 = int_to_ptr v13 *i256; - v15.i256 = mload v14 i256; - v16.i8 = trunc v15 i8; - v17.i256 = zext v16 i256; + v12.i256 = add v0 32.i256; + v13.*i256 = int_to_ptr v12 *i256; + v14.i256 = mload v13 i256; + v15.i8 = trunc v14 i8; jump block2; block5: - v19.*i256 = int_to_ptr v0 *i256; - v20.i256 = mload v19 i256; - br_table v20 block8 (0.i256 block6) (1.i256 block4); + v17.*i256 = int_to_ptr v0 *i256; + v18.i256 = mload v17 i256; + br_table v18 block8 (0.i256 block6) (1.i256 block4); block6: - v23.i256 = add v0 32.i256; - v24.*i256 = int_to_ptr v23 *i256; - v25.i256 = mload v24 i256; - br_table v25 block7 (0.i256 block1) (1.i256 block3); + v22.i256 = add v0 32.i256; + v23.*i256 = int_to_ptr v22 *i256; + v24.i256 = mload v23 i256; + br_table v24 block7 (0.i256 block1) (1.i256 block3); block7: evm_invalid; @@ -52,7 +50,7 @@ func private %match_nested_enum(v0.i256) -> i256 { func private %__fe_sonatina_entry() { block0: - v1.i256 = call %match_nested_enum 0.i256; + v1.i8 = call %match_nested_enum 0.i256; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_newtype_nested.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_newtype_nested.snap index dbf7b4343e..922ce6e16f 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_newtype_nested.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/match_newtype_nested.snap @@ -25,8 +25,8 @@ func private %match_newtype_nested(v0.i256) -> i256 { func private %f() -> i256 { block0: - v2.i256 = call %match_newtype_nested 10.i256; - return v2; + v1.i256 = call %match_newtype_nested 10.i256; + return v1; } func private %__fe_sonatina_entry() { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_struct.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_struct.snap index df003770db..156c2036b2 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_struct.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/match_struct.snap @@ -45,7 +45,7 @@ func private %match_struct_fields(v0.i256) -> i256 { v24.i256 = mload v23 i256; v25.i8 = trunc v24 i8; v26.i256 = zext v25 i256; - v27.i256 = add v26 v21; + v27.i256 = call %u8_hbc9d6eeaea22ffb5_add_h4cebc227a0cfd3c0_add v26 v21; jump block2; block6: @@ -107,6 +107,21 @@ func private %match_struct_wildcard(v0.i256) -> i256 { br_table v17 block4 (0.i256 block3); } +func private %u8_hbc9d6eeaea22ffb5_add_h4cebc227a0cfd3c0_add(v0.i256, v1.i256) -> i256 { + block0: + v3.i8 = trunc v0 i8; + v4.i8 = trunc v1 i8; + (v5.i8, v6.i1) = uaddo v3 v4; + v7.i256 = zext v5 i256; + br v6 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v7; +} + func private %__fe_sonatina_entry() { block0: v1.i256 = call %match_struct_fields 0.i256; diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_tuple.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_tuple.snap index 10f9b2eda0..f59fef9551 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_tuple.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/match_tuple.snap @@ -5,10 +5,10 @@ input_file: crates/codegen/tests/fixtures/match_tuple.fe --- target = "evm-ethereum-osaka" -type @__fe_tuple_0 = {i256, i256}; -type @__fe_tuple_1 = {i256, i256}; +type @__fe_tuple_0 = {i1, i1}; +type @__fe_tuple_1 = {i1, i8}; -func private %match_bool_tuple(v0.i256) -> i256 { +func private %match_bool_tuple(v0.i256) -> i8 { block0: jump block6; @@ -16,7 +16,7 @@ func private %match_bool_tuple(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (3.i256 block1) (2.i256 block3) (1.i256 block4) (0.i256 block5); + v3.i8 = phi (3.i8 block1) (2.i8 block3) (1.i8 block4) (0.i8 block5); return v3; block3: @@ -30,30 +30,27 @@ func private %match_bool_tuple(v0.i256) -> i256 { block6: v7.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; - v8.*i256 = gep v7 0.i256 1.i256; - v9.i256 = mload v8 i256; - v10.i1 = ne v9 0.i256; - v11.i256 = zext v10 i256; - br_table v11 block11 (1.i256 block7) (0.i256 block9); + v10.*i1 = gep v7 0.i256 1.i256; + v11.i256 = mload v10 i256; + v12.i1 = ne v11 0.i256; + br_table v12 block11 (1.i1 block7) (0.i1 block9); block7: - v13.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; - v14.*i256 = gep v13 0.i256 0.i256; - v15.i256 = mload v14 i256; - v16.i1 = ne v15 0.i256; - v17.i256 = zext v16 i256; - br_table v17 block8 (1.i256 block1) (0.i256 block4); + v16.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; + v17.*i1 = gep v16 0.i256 0.i256; + v18.i256 = mload v17 i256; + v19.i1 = ne v18 0.i256; + br_table v19 block8 (1.i1 block1) (0.i1 block4); block8: evm_invalid; block9: - v19.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; - v20.*i256 = gep v19 0.i256 0.i256; - v21.i256 = mload v20 i256; - v22.i1 = ne v21 0.i256; - v23.i256 = zext v22 i256; - br_table v23 block10 (1.i256 block3) (0.i256 block5); + v21.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; + v22.*i1 = gep v21 0.i256 0.i256; + v23.i256 = mload v22 i256; + v24.i1 = ne v23 0.i256; + br_table v24 block10 (1.i1 block3) (0.i1 block5); block10: evm_invalid; @@ -62,7 +59,7 @@ func private %match_bool_tuple(v0.i256) -> i256 { evm_invalid; } -func private %match_tuple_with_wildcard(v0.i256) -> i256 { +func private %match_tuple_with_wildcard(v0.i256) -> i8 { block0: jump block4; @@ -70,7 +67,7 @@ func private %match_tuple_with_wildcard(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (1.i256 block1) (0.i256 block3); + v3.i8 = phi (1.i8 block1) (0.i8 block3); return v3; block3: @@ -78,17 +75,16 @@ func private %match_tuple_with_wildcard(v0.i256) -> i256 { block4: v5.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; - v6.*i256 = gep v5 0.i256 0.i256; - v7.i256 = mload v6 i256; - v8.i1 = ne v7 0.i256; - v9.i256 = zext v8 i256; - br_table v9 block5 (1.i256 block1) (0.i256 block3); + v7.*i1 = gep v5 0.i256 0.i256; + v8.i256 = mload v7 i256; + v9.i1 = ne v8 0.i256; + br_table v9 block5 (1.i1 block1) (0.i1 block3); block5: evm_invalid; } -func private %match_mixed_tuple(v0.i256) -> i256 { +func private %match_mixed_tuple(v0.i256) -> i8 { block0: jump block6; @@ -96,7 +92,7 @@ func private %match_mixed_tuple(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (10.i256 block1) (11.i256 block3) (12.i256 block4) (0.i256 block5); + v3.i8 = phi (10.i8 block1) (11.i8 block3) (12.i8 block4) (0.i8 block5); return v3; block3: @@ -110,19 +106,17 @@ func private %match_mixed_tuple(v0.i256) -> i256 { block6: v7.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v8.*i256 = gep v7 0.i256 0.i256; - v9.i256 = mload v8 i256; - v10.i1 = ne v9 0.i256; - v11.i256 = zext v10 i256; - br_table v11 block8 (1.i256 block7) (0.i256 block5); + v9.*i1 = gep v7 0.i256 0.i256; + v10.i256 = mload v9 i256; + v11.i1 = ne v10 0.i256; + br_table v11 block8 (1.i1 block7) (0.i1 block5); block7: - v14.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v15.*i256 = gep v14 0.i256 1.i256; - v16.i256 = mload v15 i256; - v17.i8 = trunc v16 i8; - v18.i256 = zext v17 i256; - br_table v18 block4 (0.i256 block1) (1.i256 block3); + v15.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; + v17.*i8 = gep v15 0.i256 1.i256; + v18.i256 = mload v17 i256; + v19.i8 = trunc v18 i8; + br_table v19 block4 (0.i8 block1) (1.i8 block3); block8: evm_invalid; @@ -130,7 +124,7 @@ func private %match_mixed_tuple(v0.i256) -> i256 { func private %__fe_sonatina_entry() { block0: - v1.i256 = call %match_bool_tuple 0.i256; + v1.i8 = call %match_bool_tuple 0.i256; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_tuple_binding.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_tuple_binding.snap index dcfad61e13..2db5d55dad 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_tuple_binding.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/match_tuple_binding.snap @@ -5,144 +5,144 @@ input_file: crates/codegen/tests/fixtures/match_tuple_binding.fe --- target = "evm-ethereum-osaka" -type @__fe_tuple_0 = {i256, i256}; -type @__fe_tuple_1 = {@__fe_tuple_0, i256}; +type @__fe_tuple_0 = {i8, i8}; +type @__fe_tuple_1 = {@__fe_tuple_0, i8}; -func private %match_tuple_extract(v0.i256) -> i256 { +func private %match_tuple_extract(v0.i256) -> i8 { block0: jump block5; block1: v3.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; - v5.*i256 = gep v3 0.i256 1.i256; - v6.i256 = mload v5 i256; - v7.i8 = trunc v6 i8; - v8.i256 = zext v7 i256; + v6.*i8 = gep v3 0.i256 1.i256; + v7.i256 = mload v6 i256; + v8.i8 = trunc v7 i8; jump block2; block2: - v10.i256 = phi (v8 block1) (v16 block3) (v28 block4); + v10.i8 = phi (v8 block1) (v15 block3) (v25 block8); return v10; block3: v12.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; - v13.*i256 = gep v12 0.i256 0.i256; + v13.*i8 = gep v12 0.i256 0.i256; v14.i256 = mload v13 i256; v15.i8 = trunc v14 i8; - v16.i256 = zext v15 i256; jump block2; block4: - v18.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; - v19.*i256 = gep v18 0.i256 0.i256; - v20.i256 = mload v19 i256; - v21.i8 = trunc v20 i8; - v22.i256 = zext v21 i256; - v23.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; - v24.*i256 = gep v23 0.i256 1.i256; - v25.i256 = mload v24 i256; - v26.i8 = trunc v25 i8; - v27.i256 = zext v26 i256; - v28.i256 = add v22 v27; - jump block2; + v17.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; + v18.*i8 = gep v17 0.i256 0.i256; + v19.i256 = mload v18 i256; + v20.i8 = trunc v19 i8; + v21.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; + v22.*i8 = gep v21 0.i256 1.i256; + v23.i256 = mload v22 i256; + v24.i8 = trunc v23 i8; + (v25.i8, v26.i1) = uaddo v20 v24; + br v26 block7 block8; block5: - v30.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; - v31.*i256 = gep v30 0.i256 0.i256; - v32.i256 = mload v31 i256; - v33.i8 = trunc v32 i8; - v34.i256 = zext v33 i256; - br_table v34 block6 (0.i256 block1); + v28.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; + v29.*i8 = gep v28 0.i256 0.i256; + v30.i256 = mload v29 i256; + v31.i8 = trunc v30 i8; + br_table v31 block6 (0.i8 block1); block6: - v36.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; - v37.*i256 = gep v36 0.i256 1.i256; - v38.i256 = mload v37 i256; - v39.i8 = trunc v38 i8; - v40.i256 = zext v39 i256; - br_table v40 block4 (0.i256 block3); + v33.*@__fe_tuple_0 = int_to_ptr v0 *@__fe_tuple_0; + v34.*i8 = gep v33 0.i256 1.i256; + v35.i256 = mload v34 i256; + v36.i8 = trunc v35 i8; + br_table v36 block4 (0.i8 block3); + + block7: + evm_revert 0.i256 0.i256; + + block8: + jump block2; } -func private %match_nested_extract(v0.i256) -> i256 { +func private %match_nested_extract(v0.i256) -> i8 { block0: jump block5; block1: v3.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v5.*i256 = gep v3 0.i256 1.i256; - v6.i256 = mload v5 i256; - v7.i8 = trunc v6 i8; - v8.i256 = zext v7 i256; + v6.*i8 = gep v3 0.i256 1.i256; + v7.i256 = mload v6 i256; + v8.i8 = trunc v7 i8; jump block2; block2: - v10.i256 = phi (v8 block1) (v22 block3) (v34 block4); + v10.i8 = phi (v8 block1) (v20 block10) (v31 block11); return v10; block3: v12.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v13.*i256 = gep v12 0.i256 0.i256 1.i256; + v13.*i8 = gep v12 0.i256 0.i256 1.i256; v14.i256 = mload v13 i256; v15.i8 = trunc v14 i8; - v16.i256 = zext v15 i256; - v17.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v18.*i256 = gep v17 0.i256 0.i256 0.i256; - v19.i256 = mload v18 i256; - v20.i8 = trunc v19 i8; - v21.i256 = zext v20 i256; - v22.i256 = add v21 v16; - jump block2; + v16.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; + v17.*i8 = gep v16 0.i256 0.i256 0.i256; + v18.i256 = mload v17 i256; + v19.i8 = trunc v18 i8; + (v20.i8, v21.i1) = uaddo v19 v15; + br v21 block9 block10; block4: - v24.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v25.*i256 = gep v24 0.i256 0.i256 0.i256; - v26.i256 = mload v25 i256; - v27.i8 = trunc v26 i8; - v28.i256 = zext v27 i256; - v29.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v30.*i256 = gep v29 0.i256 1.i256; - v31.i256 = mload v30 i256; - v32.i8 = trunc v31 i8; - v33.i256 = zext v32 i256; - v34.i256 = add v28 v33; - jump block2; + v23.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; + v24.*i8 = gep v23 0.i256 0.i256 0.i256; + v25.i256 = mload v24 i256; + v26.i8 = trunc v25 i8; + v27.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; + v28.*i8 = gep v27 0.i256 1.i256; + v29.i256 = mload v28 i256; + v30.i8 = trunc v29 i8; + (v31.i8, v32.i1) = uaddo v26 v30; + br v32 block9 block11; block5: - v36.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v37.*i256 = gep v36 0.i256 0.i256 1.i256; - v38.i256 = mload v37 i256; - v39.i8 = trunc v38 i8; - v40.i256 = zext v39 i256; - br_table v40 block8 (0.i256 block6); + v34.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; + v35.*i8 = gep v34 0.i256 0.i256 1.i256; + v36.i256 = mload v35 i256; + v37.i8 = trunc v36 i8; + br_table v37 block8 (0.i8 block6); block6: - v42.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v43.*i256 = gep v42 0.i256 0.i256 0.i256; - v44.i256 = mload v43 i256; - v45.i8 = trunc v44 i8; - v46.i256 = zext v45 i256; - br_table v46 block7 (0.i256 block1); + v39.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; + v40.*i8 = gep v39 0.i256 0.i256 0.i256; + v41.i256 = mload v40 i256; + v42.i8 = trunc v41 i8; + br_table v42 block7 (0.i8 block1); block7: - v48.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v49.*i256 = gep v48 0.i256 1.i256; - v50.i256 = mload v49 i256; - v51.i8 = trunc v50 i8; - v52.i256 = zext v51 i256; - br_table v52 block4 (0.i256 block3); + v44.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; + v45.*i8 = gep v44 0.i256 1.i256; + v46.i256 = mload v45 i256; + v47.i8 = trunc v46 i8; + br_table v47 block4 (0.i8 block3); block8: - v54.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v55.*i256 = gep v54 0.i256 1.i256; - v56.i256 = mload v55 i256; - v57.i8 = trunc v56 i8; - v58.i256 = zext v57 i256; - br_table v58 block4 (0.i256 block3); + v49.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; + v50.*i8 = gep v49 0.i256 1.i256; + v51.i256 = mload v50 i256; + v52.i8 = trunc v51 i8; + br_table v52 block4 (0.i8 block3); + + block9: + evm_revert 0.i256 0.i256; + + block10: + jump block2; + + block11: + jump block2; } func private %__fe_sonatina_entry() { block0: - v1.i256 = call %match_tuple_extract 0.i256; + v1.i8 = call %match_tuple_extract 0.i256; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_tuple_nested.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_tuple_nested.snap index fd5dccf52d..e64cf1c5ef 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_tuple_nested.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/match_tuple_nested.snap @@ -5,11 +5,11 @@ input_file: crates/codegen/tests/fixtures/match_tuple_nested.fe --- target = "evm-ethereum-osaka" -type @__fe_tuple_0 = {i256, i256}; -type @__fe_tuple_1 = {@__fe_tuple_0, i256}; -type @__fe_tuple_2 = {@__fe_tuple_1, i256}; +type @__fe_tuple_0 = {i1, i1}; +type @__fe_tuple_1 = {@__fe_tuple_0, i1}; +type @__fe_tuple_2 = {@__fe_tuple_1, i1}; -func private %match_nested_tuple(v0.i256) -> i256 { +func private %match_nested_tuple(v0.i256) -> i8 { block0: jump block7; @@ -17,7 +17,7 @@ func private %match_nested_tuple(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (7.i256 block1) (6.i256 block3) (5.i256 block4) (2.i256 block5) (1.i256 block6); + v3.i8 = phi (7.i8 block1) (6.i8 block3) (5.i8 block4) (2.i8 block5) (1.i8 block6); return v3; block3: @@ -34,27 +34,24 @@ func private %match_nested_tuple(v0.i256) -> i256 { block7: v9.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v10.*i256 = gep v9 0.i256 0.i256 0.i256; - v11.i256 = mload v10 i256; - v12.i1 = ne v11 0.i256; - v13.i256 = zext v12 i256; - br_table v13 block14 (1.i256 block8) (0.i256 block12); + v11.*i1 = gep v9 0.i256 0.i256 0.i256; + v12.i256 = mload v11 i256; + v13.i1 = ne v12 0.i256; + br_table v13 block14 (1.i1 block8) (0.i1 block12); block8: - v15.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v16.*i256 = gep v15 0.i256 0.i256 1.i256; - v17.i256 = mload v16 i256; - v18.i1 = ne v17 0.i256; - v19.i256 = zext v18 i256; - br_table v19 block11 (1.i256 block9) (0.i256 block4); + v17.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; + v19.*i1 = gep v17 0.i256 0.i256 1.i256; + v20.i256 = mload v19 i256; + v21.i1 = ne v20 0.i256; + br_table v21 block11 (1.i1 block9) (0.i1 block4); block9: - v21.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v22.*i256 = gep v21 0.i256 1.i256; - v23.i256 = mload v22 i256; - v24.i1 = ne v23 0.i256; - v25.i256 = zext v24 i256; - br_table v25 block10 (1.i256 block1) (0.i256 block3); + v23.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; + v24.*i1 = gep v23 0.i256 1.i256; + v25.i256 = mload v24 i256; + v26.i1 = ne v25 0.i256; + br_table v26 block10 (1.i1 block1) (0.i1 block3); block10: evm_invalid; @@ -63,12 +60,11 @@ func private %match_nested_tuple(v0.i256) -> i256 { evm_invalid; block12: - v27.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; - v28.*i256 = gep v27 0.i256 1.i256; - v29.i256 = mload v28 i256; - v30.i1 = ne v29 0.i256; - v31.i256 = zext v30 i256; - br_table v31 block13 (1.i256 block5) (0.i256 block6); + v28.*@__fe_tuple_1 = int_to_ptr v0 *@__fe_tuple_1; + v29.*i1 = gep v28 0.i256 1.i256; + v30.i256 = mload v29 i256; + v31.i1 = ne v30 0.i256; + br_table v31 block13 (1.i1 block5) (0.i1 block6); block13: evm_invalid; @@ -77,7 +73,7 @@ func private %match_nested_tuple(v0.i256) -> i256 { evm_invalid; } -func private %match_deeply_nested(v0.i256) -> i256 { +func private %match_deeply_nested(v0.i256) -> i8 { block0: jump block5; @@ -85,7 +81,7 @@ func private %match_deeply_nested(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (15.i256 block1) (8.i256 block3) (0.i256 block4); + v3.i8 = phi (15.i8 block1) (8.i8 block3) (0.i8 block4); return v3; block3: @@ -96,35 +92,31 @@ func private %match_deeply_nested(v0.i256) -> i256 { block5: v6.*@__fe_tuple_2 = int_to_ptr v0 *@__fe_tuple_2; - v7.*i256 = gep v6 0.i256 0.i256 0.i256 0.i256; - v8.i256 = mload v7 i256; - v9.i1 = ne v8 0.i256; - v10.i256 = zext v9 i256; - br_table v10 block9 (1.i256 block6) (0.i256 block4); + v8.*i1 = gep v6 0.i256 0.i256 0.i256 0.i256; + v9.i256 = mload v8 i256; + v10.i1 = ne v9 0.i256; + br_table v10 block9 (1.i1 block6) (0.i1 block4); block6: - v13.*@__fe_tuple_2 = int_to_ptr v0 *@__fe_tuple_2; - v14.*i256 = gep v13 0.i256 1.i256; - v15.i256 = mload v14 i256; - v16.i1 = ne v15 0.i256; - v17.i256 = zext v16 i256; - br_table v17 block3 (1.i256 block7); + v14.*@__fe_tuple_2 = int_to_ptr v0 *@__fe_tuple_2; + v16.*i1 = gep v14 0.i256 1.i256; + v17.i256 = mload v16 i256; + v18.i1 = ne v17 0.i256; + br_table v18 block3 (1.i1 block7); block7: - v19.*@__fe_tuple_2 = int_to_ptr v0 *@__fe_tuple_2; - v20.*i256 = gep v19 0.i256 0.i256 1.i256; - v21.i256 = mload v20 i256; - v22.i1 = ne v21 0.i256; - v23.i256 = zext v22 i256; - br_table v23 block3 (1.i256 block8); + v20.*@__fe_tuple_2 = int_to_ptr v0 *@__fe_tuple_2; + v21.*i1 = gep v20 0.i256 0.i256 1.i256; + v22.i256 = mload v21 i256; + v23.i1 = ne v22 0.i256; + br_table v23 block3 (1.i1 block8); block8: v25.*@__fe_tuple_2 = int_to_ptr v0 *@__fe_tuple_2; - v26.*i256 = gep v25 0.i256 0.i256 0.i256 1.i256; + v26.*i1 = gep v25 0.i256 0.i256 0.i256 1.i256; v27.i256 = mload v26 i256; v28.i1 = ne v27 0.i256; - v29.i256 = zext v28 i256; - br_table v29 block3 (1.i256 block1); + br_table v28 block3 (1.i1 block1); block9: evm_invalid; @@ -132,7 +124,7 @@ func private %match_deeply_nested(v0.i256) -> i256 { func private %__fe_sonatina_entry() { block0: - v1.i256 = call %match_nested_tuple 0.i256; + v1.i8 = call %match_nested_tuple 0.i256; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/match_wildcard.snap b/crates/codegen/tests/fixtures/sonatina_ir/match_wildcard.snap index f884c80f6b..2588a909eb 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/match_wildcard.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/match_wildcard.snap @@ -5,7 +5,7 @@ input_file: crates/codegen/tests/fixtures/match_wildcard.fe --- target = "evm-ethereum-osaka" -func private %match_with_wildcard(v0.i256) -> i256 { +func private %match_with_wildcard(v0.i256) -> i8 { block0: jump block4; @@ -13,7 +13,7 @@ func private %match_with_wildcard(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (1.i256 block1) (0.i256 block3); + v3.i8 = phi (1.i8 block1) (0.i8 block3); return v3; block3: @@ -25,7 +25,7 @@ func private %match_with_wildcard(v0.i256) -> i256 { br_table v6 block3 (0.i256 block1); } -func private %wildcard_not_last(v0.i256) -> i256 { +func private %wildcard_not_last(v0.i8) -> i8 { block0: jump block4; @@ -33,17 +33,17 @@ func private %wildcard_not_last(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (10.i256 block1) (99.i256 block3); + v3.i8 = phi (10.i8 block1) (99.i8 block3); return v3; block3: jump block2; block4: - br_table v0 block3 (0.i256 block1); + br_table v0 block3 (0.i8 block1); } -func private %multiple_before_wildcard(v0.i256) -> i256 { +func private %multiple_before_wildcard(v0.i256) -> i8 { block0: jump block5; @@ -51,7 +51,7 @@ func private %multiple_before_wildcard(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (1.i256 block1) (2.i256 block3) (3.i256 block4); + v3.i8 = phi (1.i8 block1) (2.i8 block3) (3.i8 block4); return v3; block3: @@ -68,7 +68,7 @@ func private %multiple_before_wildcard(v0.i256) -> i256 { func private %__fe_sonatina_entry() { block0: - v1.i256 = call %match_with_wildcard 0.i256; + v1.i8 = call %match_with_wildcard 0.i256; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/math_ops.snap b/crates/codegen/tests/fixtures/sonatina_ir/math_ops.snap index 4ba86ff2f7..eec6167132 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/math_ops.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/math_ops.snap @@ -5,18 +5,33 @@ input_file: crates/codegen/tests/fixtures/math_ops.fe --- target = "evm-ethereum-osaka" -func private %math_ops() -> i256 { +func private %math_ops() -> i64 { block0: - v3.i256 = sub 10.i256 3.i256; - v5.i256 = mul v3 2.i256; - v7.i256 = evm_udiv v5 7.i256; - v8.i256 = evm_umod v7 3.i256; - return v8; + (v2.i64, v3.i1) = usubo 10.i64 3.i64; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + (v6.i64, v7.i1) = umulo v2 2.i64; + br v7 block1 block3; + + block3: + (v9.i64, v10.i1) = evm_udivo v6 7.i64; + br v10 block1 block4; + + block4: + (v11.i64, v12.i1) = evm_umodo v9 3.i64; + br v12 block1 block5; + + block5: + return v11; } func private %__fe_sonatina_entry() { block0: - v0.i256 = call %math_ops; + v0.i64 = call %math_ops; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/method_call.snap b/crates/codegen/tests/fixtures/sonatina_ir/method_call.snap index f316f0da6f..b60293a5fd 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/method_call.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/method_call.snap @@ -5,32 +5,32 @@ input_file: crates/codegen/tests/fixtures/method_call.fe --- target = "evm-ethereum-osaka" -func private %make_value() -> i256 { +func private %make_value() -> i64 { block0: - return 42.i256; + return 42.i64; } -func private %call_method(v0.i256) -> i256 { +func private %call_method(v0.i256) -> i64 { block0: - v2.i256 = call %foo_h6dbce71a6ea992b8_return_value v0; - return v2; + v1.i64 = call %foo_h6dbce71a6ea992b8_return_value v0; + return v1; } -func private %foo_h6dbce71a6ea992b8_gen_value(v0.i256) -> i256 { +func private %foo_h6dbce71a6ea992b8_gen_value(v0.i256) -> i64 { block0: - v2.i256 = call %make_value; - return v2; + v1.i64 = call %make_value; + return v1; } -func private %foo_h6dbce71a6ea992b8_return_value(v0.i256) -> i256 { +func private %foo_h6dbce71a6ea992b8_return_value(v0.i256) -> i64 { block0: - v2.i256 = call %foo_h6dbce71a6ea992b8_gen_value v0; - return v2; + v1.i64 = call %foo_h6dbce71a6ea992b8_gen_value v0; + return v1; } func private %__fe_sonatina_entry() { block0: - v0.i256 = call %make_value; + v0.i64 = call %make_value; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/method_infer_by_constraints.snap b/crates/codegen/tests/fixtures/sonatina_ir/method_infer_by_constraints.snap index cbca84f37f..d0f2849500 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/method_infer_by_constraints.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/method_infer_by_constraints.snap @@ -5,29 +5,27 @@ input_file: crates/codegen/tests/fixtures/method_infer_by_constraints.fe --- target = "evm-ethereum-osaka" -type @__fe_tuple_0 = {i256, i256}; +type @__fe_tuple_0 = {i64, i64}; func private %call() -> i256 { block0: - v2.i256 = call %s_t__h10779c135f64b393_foo_h6dbce71a6ea992b8_foo__u64__aee7f05a097ffa16 10.i256; - return v2; + v1.i256 = call %s_t__h10779c135f64b393_foo_h6dbce71a6ea992b8_foo__u64__aee7f05a097ffa16 10.i64; + return v1; } -func private %s_t__h10779c135f64b393_foo_h6dbce71a6ea992b8_foo__u64__aee7f05a097ffa16(v0.i256) -> i256 { +func private %s_t__h10779c135f64b393_foo_h6dbce71a6ea992b8_foo__u64__aee7f05a097ffa16(v0.i64) -> i256 { block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v5.i64 = trunc v0 i64; - v6.i256 = zext v5 i256; - v7.*@__fe_tuple_0 = bitcast v3 *@__fe_tuple_0; - v8.*i256 = gep v7 0.i256 0.i256; - mstore v8 v6 i256; - v10.i64 = trunc 1.i256 i64; - v11.i256 = zext v10 i256; - v12.*@__fe_tuple_0 = bitcast v3 *@__fe_tuple_0; - v13.*i256 = gep v12 0.i256 1.i256; - mstore v13 v11 i256; - return v4; + v2.*i8 = evm_malloc 64.i256; + v3.i256 = ptr_to_int v2 i256; + v4.i256 = zext v0 i256; + v5.*@__fe_tuple_0 = bitcast v2 *@__fe_tuple_0; + v7.*i64 = gep v5 0.i256 0.i256; + mstore v7 v4 i256; + v9.i256 = zext 1.i64 i256; + v10.*@__fe_tuple_0 = bitcast v2 *@__fe_tuple_0; + v12.*i64 = gep v10 0.i256 1.i256; + mstore v12 v9 i256; + return v3; } func private %__fe_sonatina_entry() { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/momo.snap b/crates/codegen/tests/fixtures/sonatina_ir/momo.snap index a364d358f9..5d3d29ab32 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/momo.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/momo.snap @@ -5,27 +5,31 @@ input_file: crates/codegen/tests/fixtures/momo.fe --- target = "evm-ethereum-osaka" -type @__fe_MyStruct_0 = {i256, i256}; +type @__fe_MyStruct_0 = {i8, i8}; -func private %read_x(v0.i256) -> i256 { +func private %read_x(v0.i256) -> i8 { block0: - v2.*@__fe_MyStruct_0 = int_to_ptr v0 *@__fe_MyStruct_0; - v3.*i256 = gep v2 0.i256 0.i256; + v1.*@__fe_MyStruct_0 = int_to_ptr v0 *@__fe_MyStruct_0; + v3.*i8 = gep v1 0.i256 0.i256; v4.i256 = mload v3 i256; v5.i8 = trunc v4 i8; - v6.i256 = zext v5 i256; - v7.*@__fe_MyStruct_0 = int_to_ptr v0 *@__fe_MyStruct_0; - v9.*i256 = gep v7 0.i256 1.i256; - v10.i256 = mload v9 i256; - v11.i8 = trunc v10 i8; - v12.i256 = zext v11 i256; - v13.i256 = add v6 v12; - return v13; + v6.*@__fe_MyStruct_0 = int_to_ptr v0 *@__fe_MyStruct_0; + v8.*i8 = gep v6 0.i256 1.i256; + v9.i256 = mload v8 i256; + v10.i8 = trunc v9 i8; + (v11.i8, v12.i1) = uaddo v5 v10; + br v12 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v11; } func private %__fe_sonatina_entry() { block0: - v1.i256 = call %read_x 0.i256; + v1.i8 = call %read_x 0.i256; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/name_collisions.snap b/crates/codegen/tests/fixtures/sonatina_ir/name_collisions.snap index 6e473365d6..6b5e3db98a 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/name_collisions.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/name_collisions.snap @@ -5,143 +5,194 @@ input_file: crates/codegen/tests/fixtures/name_collisions.fe --- target = "evm-ethereum-osaka" -func private %a_b_h12fd23afeb13a092_flattened_fn() -> i256 { +func private %a_b_h12fd23afeb13a092_flattened_fn() -> i32 { block0: - return 1.i256; + return 1.i32; } -func private %a_b_h948d5ab23860c017_flattened_fn() -> i256 { +func private %a_b_h948d5ab23860c017_flattened_fn() -> i32 { block0: - return 2.i256; + return 2.i32; } -func private %test_module_qualifier_flatten_collision() -> i256 { +func private %test_module_qualifier_flatten_collision() -> i32 { block0: - v1.i256 = call %a_b_h12fd23afeb13a092_flattened_fn; - v2.i256 = call %a_b_h948d5ab23860c017_flattened_fn; - v3.i256 = add v1 v2; - return v3; + v0.i32 = call %a_b_h12fd23afeb13a092_flattened_fn; + v1.i32 = call %a_b_h948d5ab23860c017_flattened_fn; + (v2.i32, v3.i1) = uaddo v0 v1; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; } -func private %test_generic_type_collision() -> i256 { +func private %test_generic_type_collision() -> i32 { block0: - v3.i256 = call %generic_fn__S_h730d9dc564aaaf27__8d32801e7ec9d42b 1.i256; - v4.i256 = call %generic_fn__S_h2db58d011b97b333__42a13489a1ec39e8 2.i256; - return 42.i256; + v2.i32 = call %generic_fn__S_h730d9dc564aaaf27__8d32801e7ec9d42b 1.i32; + v3.i64 = call %generic_fn__S_h2db58d011b97b333__42a13489a1ec39e8 2.i64; + return 42.i32; } -func private %test_impl_method_collision() -> i256 { +func private %test_impl_method_collision() -> i32 { block0: - v3.i256 = call %widget_h8588afca9d68e578_process 10.i256; - v4.i256 = call %widget_h6847c0e3e0e4aa1e_process 20.i256; - return v3; + v2.i32 = call %widget_h8588afca9d68e578_process 10.i32; + v3.i64 = call %widget_h6847c0e3e0e4aa1e_process 20.i64; + return v2; } -func private %test_trait_method_collision() -> i256 { +func private %test_trait_method_collision() -> i32 { block0: - v2.i256 = call %multitraitimpl_h60cc862fc809464_trait_h79853acec5b2b3ad_same_method 100.i256; - v3.i256 = call %multitraitimpl_h60cc862fc809464_trait_ha6da5e54b37dd39c_same_method 100.i256; - v4.i256 = add v2 v3; - return v4; + v1.i32 = call %multitraitimpl_h60cc862fc809464_trait_h79853acec5b2b3ad_same_method 100.i32; + v2.i32 = call %multitraitimpl_h60cc862fc809464_trait_ha6da5e54b37dd39c_same_method 100.i32; + (v3.i32, v4.i1) = uaddo v1 v2; + br v4 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v3; } -func private %param_local_collision(v0.i256) -> i256 { +func private %param_local_collision(v0.i32) -> i32 { block0: - v3.i256 = add v0 1.i256; - v5.i256 = add v3 2.i256; - return v5; + (v2.i32, v3.i1) = uaddo v0 1.i32; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + (v6.i32, v7.i1) = uaddo v2 2.i32; + br v7 block1 block3; + + block3: + return v6; } -func private %test_param_local_collision() -> i256 { +func private %test_param_local_collision() -> i32 { block0: - v2.i256 = call %param_local_collision 10.i256; - return v2; + v1.i32 = call %param_local_collision 10.i32; + return v1; } -func private %__u32_as_u256(v0.i256) -> i256 { +func private %__u32_as_u256(v0.i32) -> i256 { block0: return 999.i256; } func private %test_cast_shim_collision() -> i256 { block0: - v2.i256 = call %__u32_as_u256 42.i256; - return v2; + v1.i256 = call %__u32_as_u256 42.i32; + return v1; } -func private %ret_param_collision(v0.i256) -> i256 { +func private %ret_param_collision(v0.i32) -> i32 { block0: - v3.i256 = add v0 1.i256; - return v3; + (v2.i32, v3.i1) = uaddo v0 1.i32; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; } -func private %test_ret_param_collision() -> i256 { +func private %test_ret_param_collision() -> i32 { block0: - v2.i256 = call %ret_param_collision 10.i256; - return v2; + v1.i32 = call %ret_param_collision 10.i32; + return v1; } -func private %add() -> i256 { +func private %add() -> i32 { block0: - return 123.i256; + return 123.i32; } -func private %test_yul_reserved_fn_collision() -> i256 { +func private %test_yul_reserved_fn_collision() -> i32 { block0: - v1.i256 = call %add; - return v1; + v0.i32 = call %add; + return v0; } -func private %main() -> i256 { +func private %main() -> i32 { block0: - v1.i256 = call %test_module_qualifier_flatten_collision; - v2.i256 = call %test_generic_type_collision; - v3.i256 = call %test_impl_method_collision; - v4.i256 = call %test_trait_method_collision; - v5.i256 = call %test_param_local_collision; - v6.i256 = call %test_cast_shim_collision; - v7.i256 = call %test_ret_param_collision; - v8.i256 = call %test_yul_reserved_fn_collision; - return 0.i256; + v0.i32 = call %test_module_qualifier_flatten_collision; + v1.i32 = call %test_generic_type_collision; + v2.i32 = call %test_impl_method_collision; + v3.i32 = call %test_trait_method_collision; + v4.i32 = call %test_param_local_collision; + v5.i256 = call %test_cast_shim_collision; + v6.i32 = call %test_ret_param_collision; + v7.i32 = call %test_yul_reserved_fn_collision; + return 0.i32; } -func private %widget_h8588afca9d68e578_process(v0.i256) -> i256 { +func private %widget_h8588afca9d68e578_process(v0.i32) -> i32 { block0: - v3.i256 = mul v0 2.i256; - return v3; + (v2.i32, v3.i1) = umulo v0 2.i32; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; } -func private %widget_h6847c0e3e0e4aa1e_process(v0.i256) -> i256 { +func private %widget_h6847c0e3e0e4aa1e_process(v0.i64) -> i64 { block0: - v3.i256 = mul v0 3.i256; - return v3; + (v2.i64, v3.i1) = umulo v0 3.i64; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; } -func private %multitraitimpl_h60cc862fc809464_trait_h79853acec5b2b3ad_same_method(v0.i256) -> i256 { +func private %multitraitimpl_h60cc862fc809464_trait_h79853acec5b2b3ad_same_method(v0.i32) -> i32 { block0: - v3.i256 = add v0 1.i256; - return v3; + (v2.i32, v3.i1) = uaddo v0 1.i32; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; } -func private %multitraitimpl_h60cc862fc809464_trait_ha6da5e54b37dd39c_same_method(v0.i256) -> i256 { +func private %multitraitimpl_h60cc862fc809464_trait_ha6da5e54b37dd39c_same_method(v0.i32) -> i32 { block0: - v3.i256 = add v0 2.i256; - return v3; + (v2.i32, v3.i1) = uaddo v0 2.i32; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; } -func private %generic_fn__S_h730d9dc564aaaf27__8d32801e7ec9d42b(v0.i256) -> i256 { +func private %generic_fn__S_h730d9dc564aaaf27__8d32801e7ec9d42b(v0.i32) -> i32 { block0: return v0; } -func private %generic_fn__S_h2db58d011b97b333__42a13489a1ec39e8(v0.i256) -> i256 { +func private %generic_fn__S_h2db58d011b97b333__42a13489a1ec39e8(v0.i64) -> i64 { block0: return v0; } func private %__fe_sonatina_entry() { block0: - v0.i256 = call %a_b_h12fd23afeb13a092_flattened_fn; + v0.i32 = call %a_b_h12fd23afeb13a092_flattened_fn; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/nested_struct.snap b/crates/codegen/tests/fixtures/sonatina_ir/nested_struct.snap index 8a6827996d..f3ab1c9c60 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/nested_struct.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/nested_struct.snap @@ -13,8 +13,8 @@ func private %abi_encode__Evm_hef0af3106e109414__3af54274b2985741(v0.i256, v1.i2 func private %read_inner__StorPtr_Outer___dab28b9da6c3e28(v0.i256) -> i256 { block0: - v2.i256 = evm_sload v0; - return v2; + v1.i256 = evm_sload v0; + return v1; } func private %write_inner__StorPtr_Outer___dab28b9da6c3e28(v0.i256, v1.i256) { @@ -38,39 +38,39 @@ func private %init__StorPtr_Evm___207f35a85ac4062e() { func private %runtime__StorPtr_Evm___207f35a85ac4062e() { block0: - v1.i256 = call %stor_ptr_stor__Evm_hef0af3106e109414_Outer_hccd04e332bd35653__177c3c9a6f7ae368 0.i256 0.i256; - v2.i256 = evm_calldata_load 0.i256; - v4.i256 = shr 224.i256 v2; + v2.i256 = call %stor_ptr_stor__Evm_hef0af3106e109414_Outer_hccd04e332bd35653__177c3c9a6f7ae368 0.i256 0.i256; + v3.i256 = evm_calldata_load 0.i256; + v5.i256 = shr 224.i256 v3; jump block5; block1: - v6.i256 = evm_calldata_load 4.i256; - call %write_inner__StorPtr_Outer___dab28b9da6c3e28 v6 v1; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v6 0.i256; + v7.i256 = evm_calldata_load 4.i256; + call %write_inner__StorPtr_Outer___dab28b9da6c3e28 v7 v2; + call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v7 0.i256; evm_invalid; block2: - v9.i256 = call %read_inner__StorPtr_Outer___dab28b9da6c3e28 v1; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v9 0.i256; + v11.i256 = call %read_inner__StorPtr_Outer___dab28b9da6c3e28 v2; + call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v11 0.i256; evm_invalid; block3: - v10.i256 = evm_calldata_load 4.i256; - v11.i256 = call %mem_read v10; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v11 0.i256; + v13.i256 = evm_calldata_load 4.i256; + v14.i256 = call %mem_read v13; + call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v14 0.i256; evm_invalid; block4: evm_return 0.i256 0.i256; block5: - br_table v4 block4 (3091856072.i256 block1) (3513050253.i256 block2) (2154770637.i256 block3); + br_table v5 block4 (3091856072.i256 block1) (3513050253.i256 block2) (2154770637.i256 block3); } func private %stor_ptr_stor__Evm_hef0af3106e109414_Outer_hccd04e332bd35653__177c3c9a6f7ae368(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Outer_hccd04e332bd35653__f44d0100de7cf929 v1; - return v3; + v2.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Outer_hccd04e332bd35653__f44d0100de7cf929 v1; + return v2; } func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Outer_hccd04e332bd35653__f44d0100de7cf929(v0.i256) -> i256 { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/newtype_field_mut_method_call.snap b/crates/codegen/tests/fixtures/sonatina_ir/newtype_field_mut_method_call.snap index 7686e42b27..3778697ec5 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/newtype_field_mut_method_call.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/newtype_field_mut_method_call.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 expression: output input_file: crates/codegen/tests/fixtures/newtype_field_mut_method_call.fe --- @@ -12,24 +11,24 @@ type @__fe_Container_2 = {i256, @__fe_WrapCounter_1}; func private %newtype_field_mut_method_call(v0.i256) -> i256 { block0: - v2.*@__fe_Counter_0 = alloca @__fe_Counter_0; - v3.i256 = ptr_to_int v2 i256; - v4.*i256 = gep v2 0.i256 0.i256; + v1.*@__fe_Counter_0 = alloca @__fe_Counter_0; + v2.i256 = ptr_to_int v1 i256; + v4.*i256 = gep v1 0.i256 0.i256; mstore v4 v0 i256; - v6.*i256 = gep v2 0.i256 1.i256; + v6.*i256 = gep v1 0.i256 1.i256; mstore v6 0.i256 i256; v8.*i8 = evm_malloc 96.i256; v9.i256 = ptr_to_int v8 i256; v10.*@__fe_Container_2 = bitcast v8 *@__fe_Container_2; v11.*i256 = gep v10 0.i256 0.i256; mstore v11 0.i256 i256; - v12.*@__fe_WrapCounter_1 = bitcast v2 *@__fe_WrapCounter_1; + v12.*@__fe_WrapCounter_1 = bitcast v1 *@__fe_WrapCounter_1; v13.*i256 = gep v12 0.i256 0.i256 0.i256; v14.i256 = mload v13 i256; v15.*@__fe_Container_2 = bitcast v8 *@__fe_Container_2; v16.*i256 = gep v15 0.i256 1.i256 0.i256 0.i256; mstore v16 v14 i256; - v17.*@__fe_WrapCounter_1 = bitcast v2 *@__fe_WrapCounter_1; + v17.*@__fe_WrapCounter_1 = bitcast v1 *@__fe_WrapCounter_1; v18.*i256 = gep v17 0.i256 0.i256 1.i256; v19.i256 = mload v18 i256; v20.*@__fe_Container_2 = bitcast v8 *@__fe_Container_2; @@ -50,25 +49,37 @@ func private %newtype_field_mut_method_call(v0.i256) -> i256 { func private %counter_h872958864d1ad471_bump(v0.i256) { block0: - v2.*@__fe_Counter_0 = int_to_ptr v0 *@__fe_Counter_0; - v3.*i256 = gep v2 0.i256 0.i256; + v1.*@__fe_Counter_0 = int_to_ptr v0 *@__fe_Counter_0; + v3.*i256 = gep v1 0.i256 0.i256; v4.i256 = mload v3 i256; - v6.i256 = add v4 1.i256; - v7.*@__fe_Counter_0 = int_to_ptr v0 *@__fe_Counter_0; - v8.*i256 = gep v7 0.i256 0.i256; - mstore v8 v6 i256; + (v6.i256, v7.i1) = uaddo v4 1.i256; + br v7 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v9.*@__fe_Counter_0 = int_to_ptr v0 *@__fe_Counter_0; + v10.*i256 = gep v9 0.i256 0.i256; + mstore v10 v6 i256; return; } func private %wrapcounter_hbcbd3a74a267488b_bump(v0.i256) { block0: - v2.*@__fe_Counter_0 = int_to_ptr v0 *@__fe_Counter_0; - v3.*i256 = gep v2 0.i256 0.i256; + v1.*@__fe_Counter_0 = int_to_ptr v0 *@__fe_Counter_0; + v3.*i256 = gep v1 0.i256 0.i256; v4.i256 = mload v3 i256; - v6.i256 = add v4 1.i256; - v7.*@__fe_Counter_0 = int_to_ptr v0 *@__fe_Counter_0; - v8.*i256 = gep v7 0.i256 0.i256; - mstore v8 v6 i256; + (v6.i256, v7.i1) = uaddo v4 1.i256; + br v7 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v9.*@__fe_Counter_0 = int_to_ptr v0 *@__fe_Counter_0; + v10.*i256 = gep v9 0.i256 0.i256; + mstore v10 v6 i256; return; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/newtype_storage_byplace_effect_arg.snap b/crates/codegen/tests/fixtures/sonatina_ir/newtype_storage_byplace_effect_arg.snap index 60a737439d..184bd71e6a 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/newtype_storage_byplace_effect_arg.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/newtype_storage_byplace_effect_arg.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 expression: output input_file: crates/codegen/tests/fixtures/newtype_storage_byplace_effect_arg.fe --- @@ -17,9 +16,15 @@ type @__fe_SolDecoder_7 = {@__fe_Cursor_6, i256}; func private %bump__StorPtr_Wrap___5036bb3e02939b91(v0.i256) { block0: - v2.i256 = evm_sload v0; - v4.i256 = add v2 1.i256; - evm_sstore v0 v4; + v1.i256 = evm_sload v0; + (v3.i256, v4.i1) = uaddo v1 1.i256; + br v4 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + evm_sstore v0 v3; return; } @@ -32,23 +37,27 @@ func private %__NewtypeByPlaceEffectArg_recv_0_0(v0.i256, v1.i256) -> i256 { block0: call %bump__StorPtr_Wrap___5036bb3e02939b91 v0; v3.i256 = evm_sload v1; - v5.i256 = add v3 1.i256; + (v5.i256, v6.i1) = uaddo v3 1.i256; + br v6 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: evm_sstore v1 v5; - v6.i256 = evm_sload v1; - return v6; + v9.i256 = evm_sload v1; + return v9; } func private %__NewtypeByPlaceEffectArg_init() { block0: - v1.i256 = call %init_field__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9 0.i256 0.i256; - v3.i256 = call %init_field__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24 0.i256 1.i256; - v4.i256 = sym_addr &__NewtypeByPlaceEffectArg_runtime; - v5.i256 = sym_size &__NewtypeByPlaceEffectArg_runtime; - v6.i256 = sym_size .; - v7.i256 = evm_code_size; - v8.i1 = lt v7 v6; - v9.i256 = zext v8 i256; - v10.i1 = ne v9 0.i256; + v2.i256 = call %init_field__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9 0.i256 0.i256; + v5.i256 = call %init_field__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24 0.i256 1.i256; + v6.i256 = sym_addr &__NewtypeByPlaceEffectArg_runtime; + v7.i256 = sym_size &__NewtypeByPlaceEffectArg_runtime; + v8.i256 = sym_size .; + v9.i256 = evm_code_size; + v10.i1 = lt v9 v8; br v10 block1 block2; block1: @@ -56,56 +65,56 @@ func private %__NewtypeByPlaceEffectArg_init() { evm_invalid; block2: - v13.i256 = sub v7 v6; - v14.i256 = sub v7 v6; - v15.*i8 = evm_malloc v14; - v16.i256 = ptr_to_int v15 i256; - v17.i256 = sub v7 v6; - evm_code_copy v16 v6 v17; - v19.*i8 = evm_malloc 64.i256; - v20.i256 = ptr_to_int v19 i256; - v21.*@__fe_MemoryBytes_0 = bitcast v19 *@__fe_MemoryBytes_0; - v22.*i256 = gep v21 0.i256 0.i256; - mstore v22 v16 i256; - v23.i256 = sub v7 v6; - v24.*@__fe_MemoryBytes_0 = bitcast v19 *@__fe_MemoryBytes_0; - v25.*i256 = gep v24 0.i256 1.i256; - mstore v25 v23 i256; - v26.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v20; + v14.i256 = sub v9 v8; + v15.i256 = sub v9 v8; + v16.*i8 = evm_malloc v15; + v17.i256 = ptr_to_int v16 i256; + v18.i256 = sub v9 v8; + evm_code_copy v17 v8 v18; + v20.*i8 = evm_malloc 64.i256; + v21.i256 = ptr_to_int v20 i256; + v22.*@__fe_MemoryBytes_0 = bitcast v20 *@__fe_MemoryBytes_0; + v23.*i256 = gep v22 0.i256 0.i256; + mstore v23 v17 i256; + v24.i256 = sub v9 v8; + v25.*@__fe_MemoryBytes_0 = bitcast v20 *@__fe_MemoryBytes_0; + v26.*i256 = gep v25 0.i256 1.i256; + mstore v26 v24 i256; + v27.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v21; call %__NewtypeByPlaceEffectArg_init_contract; - evm_code_copy 0.i256 v4 v5; - evm_return 0.i256 v5; + evm_code_copy 0.i256 v6 v7; + evm_return 0.i256 v7; } func private %__NewtypeByPlaceEffectArg_runtime() { block0: - v1.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483 0.i256 0.i256; - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd 0.i256 1.i256; - v4.i256 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v5.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - br_table v4 block1 (1.i256 block2); + v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483 0.i256 0.i256; + v5.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd 0.i256 1.i256; + v7.i32 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; + v9.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; + br_table v7 block1 (1.i32 block2); block1: call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; evm_invalid; block2: - call %bump_hfb5a53c6af92b8a6_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v9.i256 = call %__NewtypeByPlaceEffectArg_recv_0_0 v3 v1; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v9; + call %bump_hfb5a53c6af92b8a6_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v9; + v15.i256 = call %__NewtypeByPlaceEffectArg_recv_0_0 v5 v2; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v15; evm_invalid; } func private %init_field__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483 v0 v1; - return v3; + v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483 v0 v1; + return v2; } func private %init_field__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd v0 v1; - return v3; + v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd v0 v1; + return v2; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(v0.i256) { @@ -115,46 +124,44 @@ func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(v0.i256 func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; + v1.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; + return v1; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9 0.i256 v1; - return v3; + v4.i256 = call %stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9 0.i256 v1; + return v4; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %stor_ptr__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24 0.i256 v1; - return v3; + v4.i256 = call %stor_ptr__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24 0.i256 v1; + return v4; } -func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { +func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i32 { block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; - v3.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v2; - v5.i1 = lt v3 4.i256; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; + v1.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; + v2.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v1; + v4.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt v2 4.i256; + br v4 block1 block2; block1: call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort v0; evm_invalid; block2: - v10.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v2 0.i256; - v11.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v10; - return v11; + v8.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v1 0.i256; + v9.i32 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v8; + return v9; } func private %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; - v4.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 4.i256; - return v4; + v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; + v5.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 4.i256; + return v5; } func private %bump_hfb5a53c6af92b8a6_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) { @@ -164,14 +171,14 @@ func private %bump_hfb5a53c6af92b8a6_decode_h624c3cd8c996d995_decode__SolDecoder func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f(v0.i256, v1.i256) { block0: - v3.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v3; - v6.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v7.*@__fe_tuple_1 = int_to_ptr v6 *@__fe_tuple_1; - v8.*i256 = gep v7 0.i256 0.i256; + v2.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; + v4.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v2 32.i256; + call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v2; + v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v2; + v6.*@__fe_tuple_1 = int_to_ptr v5 *@__fe_tuple_1; + v8.*i256 = gep v6 0.i256 0.i256; v9.i256 = mload v8 i256; - v10.*@__fe_tuple_1 = int_to_ptr v6 *@__fe_tuple_1; + v10.*@__fe_tuple_1 = int_to_ptr v5 *@__fe_tuple_1; v12.*i256 = gep v10 0.i256 1.i256; v13.i256 = mload v12 i256; call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes 0.i256 v9 v13; @@ -180,43 +187,43 @@ func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4 func private %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v2.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - v4.*i8 = evm_malloc 128.i256; - v5.i256 = ptr_to_int v4 i256; - v6.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; - v7.*i256 = gep v6 0.i256 0.i256 0.i256; + v1.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; + v3.*i8 = evm_malloc 128.i256; + v4.i256 = ptr_to_int v3 i256; + v5.*@__fe_Cursor_2 = int_to_ptr v1 *@__fe_Cursor_2; + v7.*i256 = gep v5 0.i256 0.i256 0.i256; v8.i256 = mload v7 i256; - v9.*@__fe_SolDecoder_3 = bitcast v4 *@__fe_SolDecoder_3; + v9.*@__fe_SolDecoder_3 = bitcast v3 *@__fe_SolDecoder_3; v10.*i256 = gep v9 0.i256 0.i256 0.i256 0.i256; mstore v10 v8 i256; - v11.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; + v11.*@__fe_Cursor_2 = int_to_ptr v1 *@__fe_Cursor_2; v13.*i256 = gep v11 0.i256 0.i256 1.i256; v14.i256 = mload v13 i256; - v15.*@__fe_SolDecoder_3 = bitcast v4 *@__fe_SolDecoder_3; + v15.*@__fe_SolDecoder_3 = bitcast v3 *@__fe_SolDecoder_3; v16.*i256 = gep v15 0.i256 0.i256 0.i256 1.i256; mstore v16 v14 i256; - v17.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; + v17.*@__fe_Cursor_2 = int_to_ptr v1 *@__fe_Cursor_2; v18.*i256 = gep v17 0.i256 1.i256; v19.i256 = mload v18 i256; - v20.*@__fe_SolDecoder_3 = bitcast v4 *@__fe_SolDecoder_3; + v20.*@__fe_SolDecoder_3 = bitcast v3 *@__fe_SolDecoder_3; v21.*i256 = gep v20 0.i256 0.i256 1.i256; mstore v21 v19 i256; - v22.*@__fe_SolDecoder_3 = bitcast v4 *@__fe_SolDecoder_3; + v22.*@__fe_SolDecoder_3 = bitcast v3 *@__fe_SolDecoder_3; v23.*i256 = gep v22 0.i256 1.i256; mstore v23 0.i256 i256; - return v5; + return v4; } func private %stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483 v1; - return v3; + v2.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483 v1; + return v2; } func private %stor_ptr__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483 v1; - return v3; + v2.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Wrap_haf9e70905fcbd513__945a70bbbf171dbd v1; + return v2; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256) -> i256 { @@ -226,68 +233,89 @@ func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256 func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { block0: - v2.i256 = evm_calldata_size; - v3.i256 = sub v2 v0; - return v3; + v1.i256 = evm_calldata_size; + (v2.i256, v3.i1) = usubo v1 v0; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; +} + +func private %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = lt v0 v1; + return v2; } func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = add v0 v1; - v4.i256 = add v0 v1; - v5.i256 = evm_calldata_load v4; + (v2.i256, v3.i1) = uaddo v0 v1; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v5.i256 = evm_calldata_load v2; return v5; } -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i256 { +func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i32 { block0: - v3.i256 = shr 224.i256 v0; - v4.i256 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v3; - return v4; + v2.i256 = shr 224.i256 v0; + v3.i32 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v2; + return v3; } func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; - return v3; + v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; + return v2; } func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() -> i256 { block0: - v1.i256 = call %solencoder_h1b9228b90dad6928_new; - return v1; + v0.i256 = call %solencoder_h1b9228b90dad6928_new; + return v0; } func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v4.*i256 = gep v3 0.i256 0.i256; + v2.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v4.*i256 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; - v6.i1 = eq v5 0.i256; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block1 block2; + v6.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq v5 0.i256; + br v6 block1 block2; block1: - v10.*i8 = evm_malloc v1; - v11.i256 = ptr_to_int v10 i256; + v8.*i8 = evm_malloc v1; + v9.i256 = ptr_to_int v8 i256; + v11.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v12.*i256 = gep v11 0.i256 0.i256; + mstore v12 v9 i256; v13.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v14.*i256 = gep v13 0.i256 0.i256; - mstore v14 v11 i256; - v15.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v17.*i256 = gep v15 0.i256 1.i256; - mstore v17 v11 i256; - v18.i256 = add v11 v1; - v19.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v21.*i256 = gep v19 0.i256 2.i256; - mstore v21 v18 i256; - jump block2; + v15.*i256 = gep v13 0.i256 1.i256; + mstore v15 v9 i256; + (v16.i256, v17.i1) = uaddo v9 v1; + br v17 block3 block4; block2: v23.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; v24.*i256 = gep v23 0.i256 0.i256; v25.i256 = mload v24 i256; return v25; + + block3: + evm_revert 0.i256 0.i256; + + block4: + v19.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v21.*i256 = gep v19 0.i256 2.i256; + mstore v21 v16 i256; + jump block2; } func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { @@ -298,22 +326,28 @@ func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482 func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0.i256) -> i256 { block0: - v2.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v3.*i256 = gep v2 0.i256 0.i256; + v1.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v3.*i256 = gep v1 0.i256 0.i256; v4.i256 = mload v3 i256; v5.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; v7.*i256 = gep v5 0.i256 2.i256; v8.i256 = mload v7 i256; - v10.*i8 = evm_malloc 64.i256; - v11.i256 = ptr_to_int v10 i256; - v12.*@__fe_tuple_1 = bitcast v10 *@__fe_tuple_1; - v13.*i256 = gep v12 0.i256 0.i256; - mstore v13 v4 i256; - v14.i256 = sub v8 v4; - v15.*@__fe_tuple_1 = bitcast v10 *@__fe_tuple_1; - v17.*i256 = gep v15 0.i256 1.i256; - mstore v17 v14 i256; - return v11; + (v9.i256, v10.i1) = usubo v8 v4; + br v10 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v12.*i8 = evm_malloc 64.i256; + v13.i256 = ptr_to_int v12 i256; + v15.*@__fe_tuple_1 = bitcast v12 *@__fe_tuple_1; + v16.*i256 = gep v15 0.i256 0.i256; + mstore v16 v4 i256; + v17.*@__fe_tuple_1 = bitcast v12 *@__fe_tuple_1; + v19.*i256 = gep v17 0.i256 1.i256; + mstore v19 v9 i256; + return v13; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(v0.i256, v1.i256, v2.i256) { @@ -323,24 +357,24 @@ func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes( func private %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v3.*i8 = evm_malloc 96.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v6.*i256 = gep v5 0.i256 0.i256; + v2.*i8 = evm_malloc 96.i256; + v3.i256 = ptr_to_int v2 i256; + v4.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; + v6.*i256 = gep v4 0.i256 0.i256; v7.i256 = mload v6 i256; - v8.*@__fe_Cursor_2 = bitcast v3 *@__fe_Cursor_2; + v8.*@__fe_Cursor_2 = bitcast v2 *@__fe_Cursor_2; v9.*i256 = gep v8 0.i256 0.i256 0.i256; mstore v9 v7 i256; v10.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; v12.*i256 = gep v10 0.i256 1.i256; v13.i256 = mload v12 i256; - v14.*@__fe_Cursor_2 = bitcast v3 *@__fe_Cursor_2; + v14.*@__fe_Cursor_2 = bitcast v2 *@__fe_Cursor_2; v15.*i256 = gep v14 0.i256 0.i256 1.i256; mstore v15 v13 i256; - v16.*@__fe_Cursor_2 = bitcast v3 *@__fe_Cursor_2; + v16.*@__fe_Cursor_2 = bitcast v2 *@__fe_Cursor_2; v17.*i256 = gep v16 0.i256 1.i256; mstore v17 0.i256 i256; - return v4; + return v3; } func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483(v0.i256) -> i256 { @@ -348,63 +382,80 @@ func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_r return v0; } -func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i256 { +func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Wrap_haf9e70905fcbd513__945a70bbbf171dbd(v0.i256) -> i256 { block0: - v2.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; - v3.i256 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v2; - return v3; + return v0; +} + +func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i32 { + block0: + v1.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; + v2.i32 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v1; + return v2; } func private %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - v4.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 v1; - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v9.*i256 = gep v8 0.i256 0.i256 0.i256; + v2.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; + v3.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 v1; + v5.*i8 = evm_malloc 96.i256; + v6.i256 = ptr_to_int v5 i256; + v7.*@__fe_Cursor_6 = int_to_ptr v3 *@__fe_Cursor_6; + v9.*i256 = gep v7 0.i256 0.i256 0.i256; v10.i256 = mload v9 i256; - v11.*@__fe_SolDecoder_7 = bitcast v6 *@__fe_SolDecoder_7; + v11.*@__fe_SolDecoder_7 = bitcast v5 *@__fe_SolDecoder_7; v12.*i256 = gep v11 0.i256 0.i256 0.i256 0.i256; mstore v12 v10 i256; - v13.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; + v13.*@__fe_Cursor_6 = int_to_ptr v3 *@__fe_Cursor_6; v15.*i256 = gep v13 0.i256 1.i256; v16.i256 = mload v15 i256; - v17.*@__fe_SolDecoder_7 = bitcast v6 *@__fe_SolDecoder_7; + v17.*@__fe_SolDecoder_7 = bitcast v5 *@__fe_SolDecoder_7; v18.*i256 = gep v17 0.i256 0.i256 1.i256; mstore v18 v16 i256; - v19.*@__fe_SolDecoder_7 = bitcast v6 *@__fe_SolDecoder_7; + v19.*@__fe_SolDecoder_7 = bitcast v5 *@__fe_SolDecoder_7; v20.*i256 = gep v19 0.i256 1.i256; mstore v20 v1 i256; - return v7; + return v6; } func private %solencoder_h1b9228b90dad6928_new() -> i256 { block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v4.*@__fe_SolEncoder_4 = bitcast v2 *@__fe_SolEncoder_4; + v1.*i8 = evm_malloc 96.i256; + v2.i256 = ptr_to_int v1 i256; + v4.*@__fe_SolEncoder_4 = bitcast v1 *@__fe_SolEncoder_4; v5.*i256 = gep v4 0.i256 0.i256; mstore v5 0.i256 i256; - v6.*@__fe_SolEncoder_4 = bitcast v2 *@__fe_SolEncoder_4; + v6.*@__fe_SolEncoder_4 = bitcast v1 *@__fe_SolEncoder_4; v8.*i256 = gep v6 0.i256 1.i256; mstore v8 0.i256 i256; - v9.*@__fe_SolEncoder_4 = bitcast v2 *@__fe_SolEncoder_4; + v9.*@__fe_SolEncoder_4 = bitcast v1 *@__fe_SolEncoder_4; v11.*i256 = gep v9 0.i256 2.i256; mstore v11 0.i256 i256; - return v3; + return v2; +} + +func private %u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; + return v2; } func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word(v0.i256, v1.i256) { block0: - v3.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v5.*i256 = gep v3 0.i256 1.i256; + v2.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v5.*i256 = gep v2 0.i256 1.i256; v6.i256 = mload v5 i256; mstore v6 v1 i256; - v8.i256 = add v6 32.i256; - v9.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v10.*i256 = gep v9 0.i256 1.i256; - mstore v10 v8 i256; + (v8.i256, v9.i1) = uaddo v6 32.i256; + br v9 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v11.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v12.*i256 = gep v11 0.i256 1.i256; + mstore v12 v8 i256; return; } @@ -413,28 +464,29 @@ func private %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0.i256) return v0; } -func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i256 { +func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i32 { block0: - return v0; + v1.i32 = trunc v0 i32; + return v1; } func private %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256) -> i256 { block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_6 = bitcast v3 *@__fe_Cursor_6; - v6.*@__fe_CallData_5 = gep v5 0.i256 0.i256; + v2.*i8 = evm_malloc 64.i256; + v3.i256 = ptr_to_int v2 i256; + v4.*@__fe_Cursor_6 = bitcast v2 *@__fe_Cursor_6; + v6.*@__fe_CallData_5 = gep v4 0.i256 0.i256; mstore v6 v0 i256; - v7.*@__fe_Cursor_6 = bitcast v3 *@__fe_Cursor_6; + v7.*@__fe_Cursor_6 = bitcast v2 *@__fe_Cursor_6; v9.*i256 = gep v7 0.i256 1.i256; mstore v9 0.i256 i256; - return v4; + return v3; } func private %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_Cursor_6 = int_to_ptr v0 *@__fe_Cursor_6; - v4.*@__fe_CallData_5 = gep v3 0.i256 0.i256; + v2.*@__fe_Cursor_6 = int_to_ptr v0 *@__fe_Cursor_6; + v4.*@__fe_CallData_5 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; v7.*i8 = evm_malloc 64.i256; v8.i256 = ptr_to_int v7 i256; diff --git a/crates/codegen/tests/fixtures/sonatina_ir/newtype_storage_field_mut_method_call.snap b/crates/codegen/tests/fixtures/sonatina_ir/newtype_storage_field_mut_method_call.snap index 7a3374a4f9..d376c78d81 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/newtype_storage_field_mut_method_call.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/newtype_storage_field_mut_method_call.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 expression: output input_file: crates/codegen/tests/fixtures/newtype_storage_field_mut_method_call.fe --- @@ -17,11 +16,17 @@ type @__fe_SolDecoder_7 = {@__fe_Cursor_6, i256}; func private %wrap_haf9e70905fcbd513_bump(v0.i256) { block0: - v2.*i256 = int_to_ptr v0 *i256; - v3.i256 = mload v2 i256; - v5.i256 = add v3 1.i256; - v6.*i256 = int_to_ptr v0 *i256; - mstore v6 v5 i256; + v1.*i256 = int_to_ptr v0 *i256; + v2.i256 = mload v1 i256; + (v4.i256, v5.i1) = uaddo v2 1.i256; + br v5 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v8.*i256 = int_to_ptr v0 *i256; + mstore v8 v4 i256; return; } @@ -40,15 +45,13 @@ func private %__NewtypeStorageFieldMutMethodCall_recv_0_0(v0.i256) -> i256 { func private %__NewtypeStorageFieldMutMethodCall_init() { block0: - v1.i256 = call %init_field__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9 0.i256 0.i256; - v3.i256 = call %init_field__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24 0.i256 1.i256; - v4.i256 = sym_addr &__NewtypeStorageFieldMutMethodCall_runtime; - v5.i256 = sym_size &__NewtypeStorageFieldMutMethodCall_runtime; - v6.i256 = sym_size .; - v7.i256 = evm_code_size; - v8.i1 = lt v7 v6; - v9.i256 = zext v8 i256; - v10.i1 = ne v9 0.i256; + v2.i256 = call %init_field__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9 0.i256 0.i256; + v5.i256 = call %init_field__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24 0.i256 1.i256; + v6.i256 = sym_addr &__NewtypeStorageFieldMutMethodCall_runtime; + v7.i256 = sym_size &__NewtypeStorageFieldMutMethodCall_runtime; + v8.i256 = sym_size .; + v9.i256 = evm_code_size; + v10.i1 = lt v9 v8; br v10 block1 block2; block1: @@ -56,64 +59,70 @@ func private %__NewtypeStorageFieldMutMethodCall_init() { evm_invalid; block2: - v13.i256 = sub v7 v6; - v14.i256 = sub v7 v6; - v15.*i8 = evm_malloc v14; - v16.i256 = ptr_to_int v15 i256; - v17.i256 = sub v7 v6; - evm_code_copy v16 v6 v17; - v19.*i8 = evm_malloc 64.i256; - v20.i256 = ptr_to_int v19 i256; - v21.*@__fe_MemoryBytes_0 = bitcast v19 *@__fe_MemoryBytes_0; - v22.*i256 = gep v21 0.i256 0.i256; - mstore v22 v16 i256; - v23.i256 = sub v7 v6; - v24.*@__fe_MemoryBytes_0 = bitcast v19 *@__fe_MemoryBytes_0; - v25.*i256 = gep v24 0.i256 1.i256; - mstore v25 v23 i256; - v26.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v20; + v14.i256 = sub v9 v8; + v15.i256 = sub v9 v8; + v16.*i8 = evm_malloc v15; + v17.i256 = ptr_to_int v16 i256; + v18.i256 = sub v9 v8; + evm_code_copy v17 v8 v18; + v20.*i8 = evm_malloc 64.i256; + v21.i256 = ptr_to_int v20 i256; + v22.*@__fe_MemoryBytes_0 = bitcast v20 *@__fe_MemoryBytes_0; + v23.*i256 = gep v22 0.i256 0.i256; + mstore v23 v17 i256; + v24.i256 = sub v9 v8; + v25.*@__fe_MemoryBytes_0 = bitcast v20 *@__fe_MemoryBytes_0; + v26.*i256 = gep v25 0.i256 1.i256; + mstore v26 v24 i256; + v27.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v21; call %__NewtypeStorageFieldMutMethodCall_init_contract; - evm_code_copy 0.i256 v4 v5; - evm_return 0.i256 v5; + evm_code_copy 0.i256 v6 v7; + evm_return 0.i256 v7; } func private %__NewtypeStorageFieldMutMethodCall_runtime() { block0: - v1.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483 0.i256 0.i256; - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd 0.i256 1.i256; - v4.i256 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v5.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - br_table v4 block1 (1.i256 block2); + v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483 0.i256 0.i256; + v5.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd 0.i256 1.i256; + v7.i32 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; + v9.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; + br_table v7 block1 (1.i32 block2); block1: call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; evm_invalid; block2: - call %bump_hfb5a53c6af92b8a6_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v5; - v8.i256 = call %__NewtypeStorageFieldMutMethodCall_recv_0_0 v3; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v8; + call %bump_hfb5a53c6af92b8a6_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v9; + v14.i256 = call %__NewtypeStorageFieldMutMethodCall_recv_0_0 v5; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f 0.i256 v14; evm_invalid; } func private %wrap_haf9e70905fcbd513_bump_stor_arg0_root_stor(v0.i256) { block0: - v2.i256 = evm_sload v0; - v4.i256 = add v2 1.i256; - evm_sstore v0 v4; + v1.i256 = evm_sload v0; + (v3.i256, v4.i1) = uaddo v1 1.i256; + br v4 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + evm_sstore v0 v3; return; } func private %init_field__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483 v0 v1; - return v3; + v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483 v0 v1; + return v2; } func private %init_field__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd v0 v1; - return v3; + v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd v0 v1; + return v2; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(v0.i256) { @@ -123,46 +132,44 @@ func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(v0.i256 func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; + v1.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; + return v1; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9 0.i256 v1; - return v3; + v4.i256 = call %stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9 0.i256 v1; + return v4; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__Wrap_haf9e70905fcbd513__945a70bbbf171dbd(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %stor_ptr__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24 0.i256 v1; - return v3; + v4.i256 = call %stor_ptr__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24 0.i256 v1; + return v4; } -func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { +func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i32 { block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; - v3.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v2; - v5.i1 = lt v3 4.i256; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; + v1.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; + v2.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v1; + v4.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt v2 4.i256; + br v4 block1 block2; block1: call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort v0; evm_invalid; block2: - v10.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v2 0.i256; - v11.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v10; - return v11; + v8.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v1 0.i256; + v9.i32 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v8; + return v9; } func private %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; - v4.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 4.i256; - return v4; + v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; + v5.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 4.i256; + return v5; } func private %bump_hfb5a53c6af92b8a6_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) { @@ -172,14 +179,14 @@ func private %bump_hfb5a53c6af92b8a6_decode_h624c3cd8c996d995_decode__SolDecoder func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4b26908c66ef75f(v0.i256, v1.i256) { block0: - v3.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v3; - v6.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v7.*@__fe_tuple_1 = int_to_ptr v6 *@__fe_tuple_1; - v8.*i256 = gep v7 0.i256 0.i256; + v2.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; + v4.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v2 32.i256; + call %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v2; + v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v2; + v6.*@__fe_tuple_1 = int_to_ptr v5 *@__fe_tuple_1; + v8.*i256 = gep v6 0.i256 0.i256; v9.i256 = mload v8 i256; - v10.*@__fe_tuple_1 = int_to_ptr v6 *@__fe_tuple_1; + v10.*@__fe_tuple_1 = int_to_ptr v5 *@__fe_tuple_1; v12.*i256 = gep v10 0.i256 1.i256; v13.i256 = mload v12 i256; call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes 0.i256 v9 v13; @@ -188,43 +195,43 @@ func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_u256__c4 func private %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v2.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - v4.*i8 = evm_malloc 128.i256; - v5.i256 = ptr_to_int v4 i256; - v6.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; - v7.*i256 = gep v6 0.i256 0.i256 0.i256; + v1.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; + v3.*i8 = evm_malloc 128.i256; + v4.i256 = ptr_to_int v3 i256; + v5.*@__fe_Cursor_2 = int_to_ptr v1 *@__fe_Cursor_2; + v7.*i256 = gep v5 0.i256 0.i256 0.i256; v8.i256 = mload v7 i256; - v9.*@__fe_SolDecoder_3 = bitcast v4 *@__fe_SolDecoder_3; + v9.*@__fe_SolDecoder_3 = bitcast v3 *@__fe_SolDecoder_3; v10.*i256 = gep v9 0.i256 0.i256 0.i256 0.i256; mstore v10 v8 i256; - v11.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; + v11.*@__fe_Cursor_2 = int_to_ptr v1 *@__fe_Cursor_2; v13.*i256 = gep v11 0.i256 0.i256 1.i256; v14.i256 = mload v13 i256; - v15.*@__fe_SolDecoder_3 = bitcast v4 *@__fe_SolDecoder_3; + v15.*@__fe_SolDecoder_3 = bitcast v3 *@__fe_SolDecoder_3; v16.*i256 = gep v15 0.i256 0.i256 0.i256 1.i256; mstore v16 v14 i256; - v17.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; + v17.*@__fe_Cursor_2 = int_to_ptr v1 *@__fe_Cursor_2; v18.*i256 = gep v17 0.i256 1.i256; v19.i256 = mload v18 i256; - v20.*@__fe_SolDecoder_3 = bitcast v4 *@__fe_SolDecoder_3; + v20.*@__fe_SolDecoder_3 = bitcast v3 *@__fe_SolDecoder_3; v21.*i256 = gep v20 0.i256 0.i256 1.i256; mstore v21 v19 i256; - v22.*@__fe_SolDecoder_3 = bitcast v4 *@__fe_SolDecoder_3; + v22.*@__fe_SolDecoder_3 = bitcast v3 *@__fe_SolDecoder_3; v23.*i256 = gep v22 0.i256 1.i256; mstore v23 0.i256 i256; - return v5; + return v4; } func private %stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483 v1; - return v3; + v2.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483 v1; + return v2; } func private %stor_ptr__Evm_hef0af3106e109414_Wrap_haf9e70905fcbd513__fd5231d549c91f24(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483 v1; - return v3; + v2.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Wrap_haf9e70905fcbd513__945a70bbbf171dbd v1; + return v2; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256) -> i256 { @@ -234,68 +241,89 @@ func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256 func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { block0: - v2.i256 = evm_calldata_size; - v3.i256 = sub v2 v0; - return v3; + v1.i256 = evm_calldata_size; + (v2.i256, v3.i1) = usubo v1 v0; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; +} + +func private %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = lt v0 v1; + return v2; } func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = add v0 v1; - v4.i256 = add v0 v1; - v5.i256 = evm_calldata_load v4; + (v2.i256, v3.i1) = uaddo v0 v1; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v5.i256 = evm_calldata_load v2; return v5; } -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i256 { +func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i32 { block0: - v3.i256 = shr 224.i256 v0; - v4.i256 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v3; - return v4; + v2.i256 = shr 224.i256 v0; + v3.i32 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v2; + return v3; } func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; - return v3; + v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; + return v2; } func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() -> i256 { block0: - v1.i256 = call %solencoder_h1b9228b90dad6928_new; - return v1; + v0.i256 = call %solencoder_h1b9228b90dad6928_new; + return v0; } func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v4.*i256 = gep v3 0.i256 0.i256; + v2.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v4.*i256 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; - v6.i1 = eq v5 0.i256; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block1 block2; + v6.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq v5 0.i256; + br v6 block1 block2; block1: - v10.*i8 = evm_malloc v1; - v11.i256 = ptr_to_int v10 i256; + v8.*i8 = evm_malloc v1; + v9.i256 = ptr_to_int v8 i256; + v11.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v12.*i256 = gep v11 0.i256 0.i256; + mstore v12 v9 i256; v13.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v14.*i256 = gep v13 0.i256 0.i256; - mstore v14 v11 i256; - v15.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v17.*i256 = gep v15 0.i256 1.i256; - mstore v17 v11 i256; - v18.i256 = add v11 v1; - v19.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v21.*i256 = gep v19 0.i256 2.i256; - mstore v21 v18 i256; - jump block2; + v15.*i256 = gep v13 0.i256 1.i256; + mstore v15 v9 i256; + (v16.i256, v17.i1) = uaddo v9 v1; + br v17 block3 block4; block2: v23.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; v24.*i256 = gep v23 0.i256 0.i256; v25.i256 = mload v24 i256; return v25; + + block3: + evm_revert 0.i256 0.i256; + + block4: + v19.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v21.*i256 = gep v19 0.i256 2.i256; + mstore v21 v16 i256; + jump block2; } func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { @@ -306,22 +334,28 @@ func private %u256_h3271ca15373d4483_encode_hab7243eccf2714fb_encode__Sol_hfd482 func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0.i256) -> i256 { block0: - v2.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v3.*i256 = gep v2 0.i256 0.i256; + v1.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v3.*i256 = gep v1 0.i256 0.i256; v4.i256 = mload v3 i256; v5.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; v7.*i256 = gep v5 0.i256 2.i256; v8.i256 = mload v7 i256; - v10.*i8 = evm_malloc 64.i256; - v11.i256 = ptr_to_int v10 i256; - v12.*@__fe_tuple_1 = bitcast v10 *@__fe_tuple_1; - v13.*i256 = gep v12 0.i256 0.i256; - mstore v13 v4 i256; - v14.i256 = sub v8 v4; - v15.*@__fe_tuple_1 = bitcast v10 *@__fe_tuple_1; - v17.*i256 = gep v15 0.i256 1.i256; - mstore v17 v14 i256; - return v11; + (v9.i256, v10.i1) = usubo v8 v4; + br v10 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v12.*i8 = evm_malloc 64.i256; + v13.i256 = ptr_to_int v12 i256; + v15.*@__fe_tuple_1 = bitcast v12 *@__fe_tuple_1; + v16.*i256 = gep v15 0.i256 0.i256; + mstore v16 v4 i256; + v17.*@__fe_tuple_1 = bitcast v12 *@__fe_tuple_1; + v19.*i256 = gep v17 0.i256 1.i256; + mstore v19 v9 i256; + return v13; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(v0.i256, v1.i256, v2.i256) { @@ -331,24 +365,24 @@ func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes( func private %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v3.*i8 = evm_malloc 96.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v6.*i256 = gep v5 0.i256 0.i256; + v2.*i8 = evm_malloc 96.i256; + v3.i256 = ptr_to_int v2 i256; + v4.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; + v6.*i256 = gep v4 0.i256 0.i256; v7.i256 = mload v6 i256; - v8.*@__fe_Cursor_2 = bitcast v3 *@__fe_Cursor_2; + v8.*@__fe_Cursor_2 = bitcast v2 *@__fe_Cursor_2; v9.*i256 = gep v8 0.i256 0.i256 0.i256; mstore v9 v7 i256; v10.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; v12.*i256 = gep v10 0.i256 1.i256; v13.i256 = mload v12 i256; - v14.*@__fe_Cursor_2 = bitcast v3 *@__fe_Cursor_2; + v14.*@__fe_Cursor_2 = bitcast v2 *@__fe_Cursor_2; v15.*i256 = gep v14 0.i256 0.i256 1.i256; mstore v15 v13 i256; - v16.*@__fe_Cursor_2 = bitcast v3 *@__fe_Cursor_2; + v16.*@__fe_Cursor_2 = bitcast v2 *@__fe_Cursor_2; v17.*i256 = gep v16 0.i256 1.i256; mstore v17 0.i256 i256; - return v4; + return v3; } func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483(v0.i256) -> i256 { @@ -356,63 +390,80 @@ func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_r return v0; } -func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i256 { +func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__Wrap_haf9e70905fcbd513__945a70bbbf171dbd(v0.i256) -> i256 { block0: - v2.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; - v3.i256 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v2; - return v3; + return v0; +} + +func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i32 { + block0: + v1.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; + v2.i32 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v1; + return v2; } func private %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - v4.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 v1; - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v9.*i256 = gep v8 0.i256 0.i256 0.i256; + v2.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; + v3.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 v1; + v5.*i8 = evm_malloc 96.i256; + v6.i256 = ptr_to_int v5 i256; + v7.*@__fe_Cursor_6 = int_to_ptr v3 *@__fe_Cursor_6; + v9.*i256 = gep v7 0.i256 0.i256 0.i256; v10.i256 = mload v9 i256; - v11.*@__fe_SolDecoder_7 = bitcast v6 *@__fe_SolDecoder_7; + v11.*@__fe_SolDecoder_7 = bitcast v5 *@__fe_SolDecoder_7; v12.*i256 = gep v11 0.i256 0.i256 0.i256 0.i256; mstore v12 v10 i256; - v13.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; + v13.*@__fe_Cursor_6 = int_to_ptr v3 *@__fe_Cursor_6; v15.*i256 = gep v13 0.i256 1.i256; v16.i256 = mload v15 i256; - v17.*@__fe_SolDecoder_7 = bitcast v6 *@__fe_SolDecoder_7; + v17.*@__fe_SolDecoder_7 = bitcast v5 *@__fe_SolDecoder_7; v18.*i256 = gep v17 0.i256 0.i256 1.i256; mstore v18 v16 i256; - v19.*@__fe_SolDecoder_7 = bitcast v6 *@__fe_SolDecoder_7; + v19.*@__fe_SolDecoder_7 = bitcast v5 *@__fe_SolDecoder_7; v20.*i256 = gep v19 0.i256 1.i256; mstore v20 v1 i256; - return v7; + return v6; } func private %solencoder_h1b9228b90dad6928_new() -> i256 { block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v4.*@__fe_SolEncoder_4 = bitcast v2 *@__fe_SolEncoder_4; + v1.*i8 = evm_malloc 96.i256; + v2.i256 = ptr_to_int v1 i256; + v4.*@__fe_SolEncoder_4 = bitcast v1 *@__fe_SolEncoder_4; v5.*i256 = gep v4 0.i256 0.i256; mstore v5 0.i256 i256; - v6.*@__fe_SolEncoder_4 = bitcast v2 *@__fe_SolEncoder_4; + v6.*@__fe_SolEncoder_4 = bitcast v1 *@__fe_SolEncoder_4; v8.*i256 = gep v6 0.i256 1.i256; mstore v8 0.i256 i256; - v9.*@__fe_SolEncoder_4 = bitcast v2 *@__fe_SolEncoder_4; + v9.*@__fe_SolEncoder_4 = bitcast v1 *@__fe_SolEncoder_4; v11.*i256 = gep v9 0.i256 2.i256; mstore v11 0.i256 i256; - return v3; + return v2; +} + +func private %u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; + return v2; } func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word(v0.i256, v1.i256) { block0: - v3.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v5.*i256 = gep v3 0.i256 1.i256; + v2.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v5.*i256 = gep v2 0.i256 1.i256; v6.i256 = mload v5 i256; mstore v6 v1 i256; - v8.i256 = add v6 32.i256; - v9.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v10.*i256 = gep v9 0.i256 1.i256; - mstore v10 v8 i256; + (v8.i256, v9.i1) = uaddo v6 32.i256; + br v9 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v11.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v12.*i256 = gep v11 0.i256 1.i256; + mstore v12 v8 i256; return; } @@ -421,28 +472,29 @@ func private %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0.i256) return v0; } -func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i256 { +func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i32 { block0: - return v0; + v1.i32 = trunc v0 i32; + return v1; } func private %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256) -> i256 { block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_6 = bitcast v3 *@__fe_Cursor_6; - v6.*@__fe_CallData_5 = gep v5 0.i256 0.i256; + v2.*i8 = evm_malloc 64.i256; + v3.i256 = ptr_to_int v2 i256; + v4.*@__fe_Cursor_6 = bitcast v2 *@__fe_Cursor_6; + v6.*@__fe_CallData_5 = gep v4 0.i256 0.i256; mstore v6 v0 i256; - v7.*@__fe_Cursor_6 = bitcast v3 *@__fe_Cursor_6; + v7.*@__fe_Cursor_6 = bitcast v2 *@__fe_Cursor_6; v9.*i256 = gep v7 0.i256 1.i256; mstore v9 0.i256 i256; - return v4; + return v3; } func private %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_Cursor_6 = int_to_ptr v0 *@__fe_Cursor_6; - v4.*@__fe_CallData_5 = gep v3 0.i256 0.i256; + v2.*@__fe_Cursor_6 = int_to_ptr v0 *@__fe_Cursor_6; + v4.*@__fe_CallData_5 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; v7.*i8 = evm_malloc 64.i256; v8.i256 = ptr_to_int v7 i256; diff --git a/crates/codegen/tests/fixtures/sonatina_ir/newtype_word_mut_method_call.snap b/crates/codegen/tests/fixtures/sonatina_ir/newtype_word_mut_method_call.snap index d40bb85930..f91dac674a 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/newtype_word_mut_method_call.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/newtype_word_mut_method_call.snap @@ -7,14 +7,20 @@ target = "evm-ethereum-osaka" func private %newtype_word_mut_method_call(v0.i256) -> i256 { block0: - v2.i256 = call %wrap_haf9e70905fcbd513_bump v0; - return v2; + v1.i256 = call %wrap_haf9e70905fcbd513_bump v0; + return v1; } func private %wrap_haf9e70905fcbd513_bump(v0.i256) -> i256 { block0: - v3.i256 = add v0 1.i256; - return v3; + (v2.i256, v3.i1) = uaddo v0 1.i256; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; } func private %__fe_sonatina_entry() { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/range_bounds.snap b/crates/codegen/tests/fixtures/sonatina_ir/range_bounds.snap index d39eeb0d3e..aa37813d5c 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/range_bounds.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/range_bounds.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 expression: output input_file: crates/codegen/tests/fixtures/range_bounds.fe --- @@ -8,28 +7,32 @@ target = "evm-ethereum-osaka" func private %sum_const() -> i256 { block0: - v1.i256 = call %range_known_const_s__usize___known_const_e__usize___hc7c7abc3858dd85e_seq_ha637d2df505bccf2_len__0_4__f9605efabd18106c 0.i256; + v2.i256 = call %range_known_const_s__usize___known_const_e__usize___hc7c7abc3858dd85e_seq_ha637d2df505bccf2_len__0_4__f9605efabd18106c 0.i256; jump block1; block1: - v16.i256 = phi (0.i256 block0) (v10 block3); - v2.i256 = phi (0.i256 block0) (v13 block3); - v4.i1 = lt v2 v1; - v5.i256 = zext v4 i256; - v6.i1 = ne v5 0.i256; - br v6 block2 block4; + v17.i256 = phi (0.i256 block0) (v10 block3); + v3.i256 = phi (0.i256 block0) (v14 block3); + v5.i1 = lt v3 v2; + br v5 block2 block4; block2: - v8.i256 = call %range_known_const_s__usize___known_const_e__usize___hc7c7abc3858dd85e_seq_ha637d2df505bccf2_get__0_4__f9605efabd18106c 0.i256 v2; - v10.i256 = add v16 v8; - jump block3; + v8.i256 = call %range_known_const_s__usize___known_const_e__usize___hc7c7abc3858dd85e_seq_ha637d2df505bccf2_get__0_4__f9605efabd18106c 0.i256 v3; + (v10.i256, v11.i1) = uaddo v17 v8; + br v11 block5 block6; block3: - v13.i256 = add v2 1.i256; + v14.i256 = add v3 1.i256; jump block1; block4: - return v16; + return v17; + + block5: + evm_revert 0.i256 0.i256; + + block6: + jump block3; } func private %sum_dynamic_end(v0.i256) -> i256 { @@ -42,24 +45,28 @@ func private %sum_dynamic_end(v0.i256) -> i256 { jump block1; block1: - v24.i256 = phi (0.i256 block0) (v16 block3); - v7.i256 = phi (0.i256 block0) (v19 block3); + v23.i256 = phi (0.i256 block0) (v14 block3); + v7.i256 = phi (0.i256 block0) (v18 block3); v9.i1 = lt v7 v6; - v10.i256 = zext v9 i256; - v11.i1 = ne v10 0.i256; - br v11 block2 block4; + br v9 block2 block4; block2: - v14.i256 = call %range_known_const_s__usize___known_const_e__usize___hc7c7abc3858dd85e_seq_ha637d2df505bccf2_get__0_4__f9605efabd18106c v4 v7; - v16.i256 = add v24 v14; - jump block3; + v12.i256 = call %range_known_const_s__usize___known_const_e__usize___hc7c7abc3858dd85e_seq_ha637d2df505bccf2_get__0_4__f9605efabd18106c v4 v7; + (v14.i256, v15.i1) = uaddo v23 v12; + br v15 block5 block6; block3: - v19.i256 = add v7 1.i256; + v18.i256 = add v7 1.i256; jump block1; block4: - return v24; + return v23; + + block5: + evm_revert 0.i256 0.i256; + + block6: + jump block3; } func private %sum_dynamic_start(v0.i256) -> i256 { @@ -72,24 +79,28 @@ func private %sum_dynamic_start(v0.i256) -> i256 { jump block1; block1: - v24.i256 = phi (0.i256 block0) (v16 block3); - v7.i256 = phi (0.i256 block0) (v19 block3); + v23.i256 = phi (0.i256 block0) (v14 block3); + v7.i256 = phi (0.i256 block0) (v18 block3); v9.i1 = lt v7 v6; - v10.i256 = zext v9 i256; - v11.i1 = ne v10 0.i256; - br v11 block2 block4; + br v9 block2 block4; block2: - v14.i256 = call %range_unknown__known_const_e__usize___h7984c64777ae465_seq_ha637d2df505bccf2_get__4__f248ae0e02044d7e v4 v7; - v16.i256 = add v24 v14; - jump block3; + v12.i256 = call %range_unknown__known_const_e__usize___h7984c64777ae465_seq_ha637d2df505bccf2_get__4__f248ae0e02044d7e v4 v7; + (v14.i256, v15.i1) = uaddo v23 v12; + br v15 block5 block6; block3: - v19.i256 = add v7 1.i256; + v18.i256 = add v7 1.i256; jump block1; block4: - return v24; + return v23; + + block5: + evm_revert 0.i256 0.i256; + + block6: + jump block3; } func private %sum_dynamic(v0.i256, v1.i256) -> i256 { @@ -105,48 +116,62 @@ func private %sum_dynamic(v0.i256, v1.i256) -> i256 { jump block1; block1: - v28.i256 = phi (0.i256 block0) (v20 block3); - v11.i256 = phi (0.i256 block0) (v23 block3); + v27.i256 = phi (0.i256 block0) (v18 block3); + v11.i256 = phi (0.i256 block0) (v22 block3); v13.i1 = lt v11 v10; - v14.i256 = zext v13 i256; - v15.i1 = ne v14 0.i256; - br v15 block2 block4; + br v13 block2 block4; block2: - v18.i256 = call %range_unknown__known_const_e__usize___h7984c64777ae465_seq_ha637d2df505bccf2_get__4__f248ae0e02044d7e v5 v11; - v20.i256 = add v28 v18; - jump block3; + v16.i256 = call %range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_get v5 v11; + (v18.i256, v19.i1) = uaddo v27 v16; + br v19 block5 block6; block3: - v23.i256 = add v11 1.i256; + v22.i256 = add v11 1.i256; jump block1; block4: - return v28; + return v27; + + block5: + evm_revert 0.i256 0.i256; + + block6: + jump block3; } func private %range_known_const_s__usize___known_const_e__usize___hc7c7abc3858dd85e_seq_ha637d2df505bccf2_len__0_4__f9605efabd18106c(v0.i256) -> i256 { block0: - v3.i1 = lt 4.i256 0.i256; - v4.i256 = zext v3 i256; - v5.i1 = ne v4 0.i256; - br v5 block1 block2; + v3.i1 = call %usize_ha12462c6d36e68b0_ord_h264f6d6d75097a_lt 4.i256 0.i256; + br v3 block1 block2; block1: jump block3; block2: - v6.i256 = sub 4.i256 0.i256; - jump block3; + (v4.i256, v5.i1) = usubo 4.i256 0.i256; + br v5 block4 block5; block3: - v7.i256 = phi (0.i256 block1) (v6 block2); - return v7; + v6.i256 = phi (0.i256 block1) (v4 block5); + return v6; + + block4: + evm_revert 0.i256 0.i256; + + block5: + jump block3; } func private %range_known_const_s__usize___known_const_e__usize___hc7c7abc3858dd85e_seq_ha637d2df505bccf2_get__0_4__f9605efabd18106c(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = add 0.i256 v1; + (v3.i256, v4.i1) = uaddo 0.i256 v1; + br v4 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: return v3; } @@ -154,54 +179,68 @@ func private %range_known_const_s__usize___unknown__h4e84f6b6b8307914_seq_ha637d block0: v2.*i256 = int_to_ptr v0 *i256; v3.i256 = mload v2 i256; - v4.i1 = lt v3 0.i256; - v5.i256 = zext v4 i256; - v6.i1 = ne v5 0.i256; - br v6 block1 block2; + v4.i1 = call %usize_ha12462c6d36e68b0_ord_h264f6d6d75097a_lt v3 0.i256; + br v4 block1 block2; block1: jump block3; block2: - v8.*i256 = int_to_ptr v0 *i256; - v9.i256 = mload v8 i256; - v10.i256 = sub v9 0.i256; - jump block3; + v6.*i256 = int_to_ptr v0 *i256; + v7.i256 = mload v6 i256; + (v8.i256, v9.i1) = usubo v7 0.i256; + br v9 block4 block5; block3: - v11.i256 = phi (0.i256 block1) (v10 block2); - return v11; + v10.i256 = phi (0.i256 block1) (v8 block5); + return v10; + + block4: + evm_revert 0.i256 0.i256; + + block5: + jump block3; } func private %range_unknown__known_const_e__usize___h7984c64777ae465_seq_ha637d2df505bccf2_len__4__f248ae0e02044d7e(v0.i256) -> i256 { block0: v2.*i256 = int_to_ptr v0 *i256; v3.i256 = mload v2 i256; - v5.i1 = lt 4.i256 v3; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; + v5.i1 = call %usize_ha12462c6d36e68b0_ord_h264f6d6d75097a_lt 4.i256 v3; + br v5 block1 block2; block1: jump block3; block2: - v9.*i256 = int_to_ptr v0 *i256; - v10.i256 = mload v9 i256; - v11.i256 = sub 4.i256 v10; - jump block3; + v7.*i256 = int_to_ptr v0 *i256; + v8.i256 = mload v7 i256; + (v9.i256, v10.i1) = usubo 4.i256 v8; + br v10 block4 block5; block3: - v12.i256 = phi (0.i256 block1) (v11 block2); - return v12; + v11.i256 = phi (0.i256 block1) (v9 block5); + return v11; + + block4: + evm_revert 0.i256 0.i256; + + block5: + jump block3; } func private %range_unknown__known_const_e__usize___h7984c64777ae465_seq_ha637d2df505bccf2_get__4__f248ae0e02044d7e(v0.i256, v1.i256) -> i256 { block0: - v3.*i256 = int_to_ptr v0 *i256; - v4.i256 = mload v3 i256; - v5.i256 = add v4 v1; - return v5; + v2.*i256 = int_to_ptr v0 *i256; + v3.i256 = mload v2 i256; + (v4.i256, v5.i1) = uaddo v3 v1; + br v5 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v4; } func private %range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_len(v0.i256) -> i256 { @@ -211,26 +250,50 @@ func private %range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_le v5.i256 = mload v4 i256; v6.*i256 = int_to_ptr v0 *i256; v7.i256 = mload v6 i256; - v8.i1 = lt v5 v7; - v9.i256 = zext v8 i256; - v10.i1 = ne v9 0.i256; - br v10 block1 block2; + v8.i1 = call %usize_ha12462c6d36e68b0_ord_h264f6d6d75097a_lt v5 v7; + br v8 block1 block2; block1: jump block3; block2: - v12.i256 = add v0 32.i256; - v13.*i256 = int_to_ptr v12 *i256; + v10.i256 = add v0 32.i256; + v11.*i256 = int_to_ptr v10 *i256; + v12.i256 = mload v11 i256; + v13.*i256 = int_to_ptr v0 *i256; v14.i256 = mload v13 i256; - v15.*i256 = int_to_ptr v0 *i256; - v16.i256 = mload v15 i256; - v17.i256 = sub v14 v16; - jump block3; + (v15.i256, v16.i1) = usubo v12 v14; + br v16 block4 block5; block3: - v18.i256 = phi (0.i256 block1) (v17 block2); - return v18; + v17.i256 = phi (0.i256 block1) (v15 block5); + return v17; + + block4: + evm_revert 0.i256 0.i256; + + block5: + jump block3; +} + +func private %range_unknown__unknown__h1dfb0ca64ed7bf96_seq_ha637d2df505bccf2_get(v0.i256, v1.i256) -> i256 { + block0: + v2.*i256 = int_to_ptr v0 *i256; + v3.i256 = mload v2 i256; + (v4.i256, v5.i1) = uaddo v3 v1; + br v5 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v4; +} + +func private %usize_ha12462c6d36e68b0_ord_h264f6d6d75097a_lt(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = lt v0 v1; + return v2; } func private %__fe_sonatina_entry() { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/ret.snap b/crates/codegen/tests/fixtures/sonatina_ir/ret.snap index cb9ab0d944..f858f4d4e2 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/ret.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/ret.snap @@ -5,41 +5,57 @@ input_file: crates/codegen/tests/fixtures/ret.fe --- target = "evm-ethereum-osaka" -func private %retfoo(v0.i256, v1.i256) -> i256 { +func private %retfoo(v0.i1, v1.i64) -> i64 { block0: - v3.i1 = ne v0 0.i256; - br v3 block1 block2; + br v0 block1 block2; block1: - return 0.i256; + return 0.i64; block2: - v6.i1 = lt v1 5.i256; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block3 block4; + v5.i1 = call %u64_haee7f05a097ffa16_ord_h264f6d6d75097a_lt v1 5.i64; + br v5 block3 block4; block3: - return 1.i256; + return 1.i64; block4: - v11.i256 = sub v1 1.i256; - v13.i1 = eq v11 42.i256; - v14.i256 = zext v13 i256; - v15.i1 = ne v14 0.i256; - br v15 block5 block6; + (v8.i64, v9.i1) = usubo v1 1.i64; + br v9 block7 block8; block5: - return 2.i256; + return 2.i64; block6: - v18.i256 = add v11 1.i256; - return v18; + (v15.i64, v16.i1) = uaddo v8 1.i64; + br v16 block7 block9; + + block7: + evm_revert 0.i256 0.i256; + + block8: + v12.i1 = call %u64_haee7f05a097ffa16_eq_he50383edd273619f_eq v8 42.i64; + br v12 block5 block6; + + block9: + return v15; +} + +func private %u64_haee7f05a097ffa16_ord_h264f6d6d75097a_lt(v0.i64, v1.i64) -> i1 { + block0: + v2.i1 = lt v0 v1; + return v2; +} + +func private %u64_haee7f05a097ffa16_eq_he50383edd273619f_eq(v0.i64, v1.i64) -> i1 { + block0: + v2.i1 = eq v0 v1; + return v2; } func private %__fe_sonatina_entry() { block0: - v1.i256 = call %retfoo 0.i256 0.i256; + v2.i64 = call %retfoo 0.i1 0.i64; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/storage.snap b/crates/codegen/tests/fixtures/sonatina_ir/storage.snap index 76cd2d628c..22caf39784 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/storage.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/storage.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 expression: output input_file: crates/codegen/tests/fixtures/storage.fe --- @@ -134,98 +133,130 @@ func private %balance_of_raw__StorPtr_CoinStore___ba1c0d0726e89ba2(v0.i256, v1.i func private %total_supply__StorPtr_TotalSupply___2e654c25952f42f9(v0.i256) -> i256 { block0: - v2.i256 = evm_sload v0; - return v2; + v1.i256 = evm_sload v0; + return v1; } func private %credit_alice__StorPtr_CoinStore__StorPtr_TotalSupply___c407f5b00af9ba78(v0.i256, v1.i256, v2.i256) -> i256 { block0: - v4.i256 = evm_sload v1; - v5.i256 = add v4 v0; - evm_sstore v1 v5; - v6.i256 = evm_sload v2; - v7.i256 = add v6 v0; - evm_sstore v2 v7; - v8.i256 = evm_sload v1; - return v8; + v3.i256 = evm_sload v1; + (v4.i256, v5.i1) = uaddo v3 v0; + br v5 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + evm_sstore v1 v4; + v9.i256 = evm_sload v2; + (v11.i256, v12.i1) = uaddo v9 v0; + br v12 block1 block3; + + block3: + evm_sstore v2 v11; + v15.i256 = evm_sload v1; + return v15; } func private %credit_bob__StorPtr_CoinStore__StorPtr_TotalSupply___c407f5b00af9ba78(v0.i256, v1.i256, v2.i256) -> i256 { block0: - v5.i256 = add v1 1.i256; - v6.i256 = evm_sload v5; - v7.i256 = add v6 v0; - v8.i256 = add v1 1.i256; - evm_sstore v8 v7; - v9.i256 = evm_sload v2; - v10.i256 = add v9 v0; - evm_sstore v2 v10; - v11.i256 = add v1 1.i256; - v12.i256 = evm_sload v11; - return v12; + v4.i256 = add v1 1.i256; + v5.i256 = evm_sload v4; + (v6.i256, v7.i1) = uaddo v5 v0; + br v7 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v10.i256 = add v1 1.i256; + evm_sstore v10 v6; + v12.i256 = evm_sload v2; + (v14.i256, v15.i1) = uaddo v12 v0; + br v15 block1 block3; + + block3: + evm_sstore v2 v14; + v18.i256 = add v1 1.i256; + v19.i256 = evm_sload v18; + return v19; } func private %transfer_from_alice__StorPtr_CoinStore___ba1c0d0726e89ba2(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = evm_sload v1; - v4.i1 = lt v3 v0; - v5.i256 = zext v4 i256; - v6.i1 = ne v5 0.i256; - br v6 block1 block2; + v2.i256 = evm_sload v1; + v3.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt_stor_arg0_root_stor v2 v0; + br v3 block1 block2; block1: - v8.*i8 = evm_malloc 32.i256; - v9.i256 = ptr_to_int v8 i256; - v11.*i256 = bitcast v8 *i256; - mstore v11 1.i256 i256; - return v9; + v5.*i8 = evm_malloc 32.i256; + v6.i256 = ptr_to_int v5 i256; + v8.*i256 = bitcast v5 *i256; + mstore v8 1.i256 i256; + return v6; block2: - v13.i256 = evm_sload v1; - v15.i256 = sub v13 v0; - evm_sstore v1 v15; + v10.i256 = evm_sload v1; + (v12.i256, v13.i1) = usubo v10 v0; + br v13 block3 block4; + + block3: + evm_revert 0.i256 0.i256; + + block4: + evm_sstore v1 v12; v16.i256 = add v1 1.i256; v17.i256 = evm_sload v16; - v18.i256 = add v17 v0; - v19.i256 = add v1 1.i256; - evm_sstore v19 v18; - v20.*i8 = evm_malloc 32.i256; - v21.i256 = ptr_to_int v20 i256; - v22.*i256 = bitcast v20 *i256; - mstore v22 0.i256 i256; - return v21; + (v19.i256, v20.i1) = uaddo v17 v0; + br v20 block3 block5; + + block5: + v22.i256 = add v1 1.i256; + evm_sstore v22 v19; + v23.*i8 = evm_malloc 32.i256; + v24.i256 = ptr_to_int v23 i256; + v25.*i256 = bitcast v23 *i256; + mstore v25 0.i256 i256; + return v24; } func private %transfer_from_bob__StorPtr_CoinStore___ba1c0d0726e89ba2(v0.i256, v1.i256) -> i256 { block0: - v4.i256 = add v1 1.i256; - v5.i256 = evm_sload v4; - v6.i1 = lt v5 v0; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block1 block2; + v3.i256 = add v1 1.i256; + v4.i256 = evm_sload v3; + v5.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt_stor_arg0_root_stor v4 v0; + br v5 block1 block2; block1: - v10.*i8 = evm_malloc 32.i256; - v11.i256 = ptr_to_int v10 i256; - v12.*i256 = bitcast v10 *i256; - mstore v12 1.i256 i256; - return v11; + v7.*i8 = evm_malloc 32.i256; + v8.i256 = ptr_to_int v7 i256; + v9.*i256 = bitcast v7 *i256; + mstore v9 1.i256 i256; + return v8; block2: - v14.i256 = add v1 1.i256; - v15.i256 = evm_sload v14; - v17.i256 = sub v15 v0; + v11.i256 = add v1 1.i256; + v12.i256 = evm_sload v11; + (v14.i256, v15.i1) = usubo v12 v0; + br v15 block3 block4; + + block3: + evm_revert 0.i256 0.i256; + + block4: v18.i256 = add v1 1.i256; - evm_sstore v18 v17; + evm_sstore v18 v14; v19.i256 = evm_sload v1; - v20.i256 = add v19 v0; - evm_sstore v1 v20; - v21.*i8 = evm_malloc 32.i256; - v22.i256 = ptr_to_int v21 i256; - v23.*i256 = bitcast v21 *i256; - mstore v23 0.i256 i256; - return v22; + (v21.i256, v22.i1) = uaddo v19 v0; + br v22 block3 block5; + + block5: + evm_sstore v1 v21; + v24.*i8 = evm_malloc 32.i256; + v25.i256 = ptr_to_int v24 i256; + v26.*i256 = bitcast v24 *i256; + mstore v26 0.i256 i256; + return v25; } func private %init__StorPtr_Evm___207f35a85ac4062e() { @@ -238,83 +269,89 @@ func private %init__StorPtr_Evm___207f35a85ac4062e() { func private %runtime__StorPtr_Evm___207f35a85ac4062e() { block0: - v1.i256 = call %stor_ptr_stor__Evm_hef0af3106e109414_CoinStore_hd26a92ca525e0e79__b6feb5585dda62f1 0.i256 0.i256; - v3.i256 = call %stor_ptr_stor__Evm_hef0af3106e109414_TotalSupply_hddb16bb19b5b088e__f5679b0709de743a 0.i256 2.i256; - v4.i256 = evm_calldata_load 0.i256; - v6.i256 = shr 224.i256 v4; + v2.i256 = call %stor_ptr_stor__Evm_hef0af3106e109414_CoinStore_hd26a92ca525e0e79__b6feb5585dda62f1 0.i256 0.i256; + v5.i256 = call %stor_ptr_stor__Evm_hef0af3106e109414_TotalSupply_hddb16bb19b5b088e__f5679b0709de743a 0.i256 2.i256; + v6.i256 = evm_calldata_load 0.i256; + v8.i256 = shr 224.i256 v6; jump block14; block1: - v8.i256 = evm_calldata_load 4.i256; - v10.i256 = evm_calldata_load 36.i256; + v10.i256 = evm_calldata_load 4.i256; + v12.i256 = evm_calldata_load 36.i256; jump block5; block2: - v14.i256 = call %credit_alice__StorPtr_CoinStore__StorPtr_TotalSupply___c407f5b00af9ba78 v10 v1 v3; + v16.i256 = call %credit_alice__StorPtr_CoinStore__StorPtr_TotalSupply___c407f5b00af9ba78 v12 v2 v5; jump block3; block3: - v15.i256 = phi (v14 block2) (v19 block4); - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v15 0.i256; + v17.i256 = phi (v16 block2) (v22 block4); + call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v17 0.i256; evm_invalid; block4: - v19.i256 = call %credit_bob__StorPtr_CoinStore__StorPtr_TotalSupply___c407f5b00af9ba78 v10 v1 v3; + v22.i256 = call %credit_bob__StorPtr_CoinStore__StorPtr_TotalSupply___c407f5b00af9ba78 v12 v2 v5; jump block3; block5: - br_table v8 block4 (0.i256 block2); + br_table v10 block4 (0.i256 block2); block6: - v21.i256 = evm_calldata_load 4.i256; - v23.i256 = call %balance_of_raw__StorPtr_CoinStore___ba1c0d0726e89ba2 v21 v1; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v23 0.i256; + v24.i256 = evm_calldata_load 4.i256; + v26.i256 = call %balance_of_raw__StorPtr_CoinStore___ba1c0d0726e89ba2 v24 v2; + call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v26 0.i256; evm_invalid; block7: - v24.i256 = evm_calldata_load 4.i256; - v25.i256 = evm_calldata_load 36.i256; + v28.i256 = evm_calldata_load 4.i256; + v29.i256 = evm_calldata_load 36.i256; jump block11; block8: - v28.i256 = call %transfer_from_alice__StorPtr_CoinStore___ba1c0d0726e89ba2 v25 v1; + v32.i256 = call %transfer_from_alice__StorPtr_CoinStore___ba1c0d0726e89ba2 v29 v2; jump block9; block9: - v29.i256 = phi (v28 block8) (v33 block10); - v30.i256 = call %transfer_result_code v29; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v30 0.i256; + v33.i256 = phi (v32 block8) (v38 block10); + v34.i256 = call %transfer_result_code v33; + call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v34 0.i256; evm_invalid; block10: - v33.i256 = call %transfer_from_bob__StorPtr_CoinStore___ba1c0d0726e89ba2 v25 v1; + v38.i256 = call %transfer_from_bob__StorPtr_CoinStore___ba1c0d0726e89ba2 v29 v2; jump block9; block11: - br_table v24 block10 (0.i256 block8); + br_table v28 block10 (0.i256 block8); block12: - v36.i256 = call %total_supply__StorPtr_TotalSupply___2e654c25952f42f9 v3; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v36 0.i256; + v41.i256 = call %total_supply__StorPtr_TotalSupply___2e654c25952f42f9 v5; + call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v41 0.i256; evm_invalid; block13: evm_return 0.i256 0.i256; block14: - br_table v6 block13 (2877082652.i256 block1) (1818602213.i256 block6) (217554442.i256 block7) (960555502.i256 block12); + br_table v8 block13 (2877082652.i256 block1) (1818602213.i256 block6) (217554442.i256 block7) (960555502.i256 block12); +} + +func private %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt_stor_arg0_root_stor(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = lt v0 v1; + return v2; } func private %stor_ptr_stor__Evm_hef0af3106e109414_CoinStore_hd26a92ca525e0e79__b6feb5585dda62f1(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__CoinStore_hd26a92ca525e0e79__a9c0a742c4f0cede v1; - return v3; + v2.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__CoinStore_hd26a92ca525e0e79__a9c0a742c4f0cede v1; + return v2; } func private %stor_ptr_stor__Evm_hef0af3106e109414_TotalSupply_hddb16bb19b5b088e__f5679b0709de743a(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__CoinStore_hd26a92ca525e0e79__a9c0a742c4f0cede v1; - return v3; + v2.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__TotalSupply_hddb16bb19b5b088e__4092604729aa99eb v1; + return v2; } func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__CoinStore_hd26a92ca525e0e79__a9c0a742c4f0cede(v0.i256) -> i256 { @@ -322,6 +359,11 @@ func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_r return v0; } +func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__TotalSupply_hddb16bb19b5b088e__4092604729aa99eb(v0.i256) -> i256 { + block0: + return v0; +} + object @Coin { section init { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/storage_map_contract.snap b/crates/codegen/tests/fixtures/sonatina_ir/storage_map_contract.snap index d458f4a448..55081c6a91 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/storage_map_contract.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/storage_map_contract.snap @@ -29,35 +29,35 @@ func private %runtime__StorPtr_Evm___207f35a85ac4062e() { block1: v5.i256 = evm_calldata_load 4.i256; - v6.i256 = call %get_balance__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d v5 0.i256; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v6 0.i256; + v7.i256 = call %get_balance__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d v5 0.i256; + call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v7 0.i256; evm_invalid; block2: - v7.i256 = evm_calldata_load 4.i256; - v9.i256 = evm_calldata_load 36.i256; - call %set_balance__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d v7 v9 0.i256; + v9.i256 = evm_calldata_load 4.i256; + v11.i256 = evm_calldata_load 36.i256; + call %set_balance__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d v9 v11 0.i256; call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 0.i256 0.i256; evm_invalid; block3: - v10.i256 = evm_calldata_load 4.i256; - v11.i256 = evm_calldata_load 36.i256; - v13.i256 = evm_calldata_load 68.i256; - v14.i256 = call %transfer__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d v10 v11 v13 0.i256; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v14 0.i256; + v14.i256 = evm_calldata_load 4.i256; + v15.i256 = evm_calldata_load 36.i256; + v17.i256 = evm_calldata_load 68.i256; + v19.i256 = call %transfer__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d v14 v15 v17 0.i256; + call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v19 0.i256; evm_invalid; block4: - v15.i256 = evm_calldata_load 4.i256; - v16.i256 = call %get_allowance__1_MemPtr_StorageMap_u256__u256__1____7c78a7c6cb7770e1 v15 0.i256; - call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v16 0.i256; + v21.i256 = evm_calldata_load 4.i256; + v23.i256 = call %get_allowance__1_MemPtr_StorageMap_u256__u256__1____7c78a7c6cb7770e1 v21 0.i256; + call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 v23 0.i256; evm_invalid; block5: - v17.i256 = evm_calldata_load 4.i256; - v18.i256 = evm_calldata_load 36.i256; - call %set_allowance__1_MemPtr_StorageMap_u256__u256__1____7c78a7c6cb7770e1 v17 v18 0.i256; + v25.i256 = evm_calldata_load 4.i256; + v26.i256 = evm_calldata_load 36.i256; + call %set_allowance__1_MemPtr_StorageMap_u256__u256__1____7c78a7c6cb7770e1 v25 v26 0.i256; call %abi_encode__Evm_hef0af3106e109414__3af54274b2985741 0.i256 0.i256; evm_invalid; @@ -80,8 +80,8 @@ func private %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_new__u256_u25 func private %get_balance__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_0__6a346ad3c930d971 v1 v0; - return v3; + v2.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_0__6a346ad3c930d971 v1 v0; + return v2; } func private %set_balance__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d(v0.i256, v1.i256, v2.i256) { @@ -92,28 +92,35 @@ func private %set_balance__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d func private %transfer__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d(v0.i256, v1.i256, v2.i256, v3.i256) -> i256 { block0: - v5.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_0__6a346ad3c930d971 v3 v0; - v6.i1 = lt v5 v2; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block1 block2; + v4.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_0__6a346ad3c930d971 v3 v0; + v5.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt v4 v2; + br v5 block1 block2; block1: return 1.i256; block2: - v12.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_0__6a346ad3c930d971 v3 v1; - v16.i256 = sub v5 v2; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set__u256_u256_0__6a346ad3c930d971 v3 v0 v16; - v17.i256 = add v12 v2; - call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set__u256_u256_0__6a346ad3c930d971 v3 v1 v17; + v9.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_0__6a346ad3c930d971 v3 v1; + (v12.i256, v13.i1) = usubo v4 v2; + br v13 block3 block4; + + block3: + evm_revert 0.i256 0.i256; + + block4: + call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set__u256_u256_0__6a346ad3c930d971 v3 v0 v12; + (v19.i256, v20.i1) = uaddo v9 v2; + br v20 block3 block5; + + block5: + call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set__u256_u256_0__6a346ad3c930d971 v3 v1 v19; return 0.i256; } func private %get_allowance__1_MemPtr_StorageMap_u256__u256__1____7c78a7c6cb7770e1(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_1__3c02c0f2b86be0bb v1 v0; - return v3; + v2.i256 = call %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_1__3c02c0f2b86be0bb v1 v0; + return v2; } func private %set_allowance__1_MemPtr_StorageMap_u256__u256__1____7c78a7c6cb7770e1(v0.i256, v1.i256, v2.i256) { @@ -131,30 +138,36 @@ func private %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u25 func private %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set__u256_u256_0__6a346ad3c930d971(v0.i256, v1.i256, v2.i256) { block0: - v4.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word v2; - call %storagemap_set_word_with_salt__u256__3271ca15373d4483 v1 0.i256 v4; + v3.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word v2; + call %storagemap_set_word_with_salt__u256__3271ca15373d4483 v1 0.i256 v3; return; } +func private %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = lt v0 v1; + return v2; +} + func private %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_1__3c02c0f2b86be0bb(v0.i256, v1.i256) -> i256 { block0: - v4.i256 = call %storagemap_get_word_with_salt__u256__3271ca15373d4483 v1 1.i256; - v5.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word v4; - return v5; + v3.i256 = call %storagemap_get_word_with_salt__u256__3271ca15373d4483 v1 1.i256; + v4.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word v3; + return v4; } func private %storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set__u256_u256_1__3c02c0f2b86be0bb(v0.i256, v1.i256, v2.i256) { block0: - v4.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word v2; - call %storagemap_set_word_with_salt__u256__3271ca15373d4483 v1 1.i256 v4; + v3.i256 = call %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word v2; + call %storagemap_set_word_with_salt__u256__3271ca15373d4483 v1 1.i256 v3; return; } func private %storagemap_get_word_with_salt__u256__3271ca15373d4483(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storagemap_storage_slot_with_salt__u256__3271ca15373d4483 v0 v1; - v4.i256 = evm_sload v3; - return v4; + v2.i256 = call %storagemap_storage_slot_with_salt__u256__3271ca15373d4483 v0 v1; + v3.i256 = evm_sload v2; + return v3; } func private %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_from_word(v0.i256) -> i256 { @@ -169,8 +182,8 @@ func private %u256_h3271ca15373d4483_wordrepr_h7483d41ac8178d88_to_word(v0.i256) func private %storagemap_set_word_with_salt__u256__3271ca15373d4483(v0.i256, v1.i256, v2.i256) { block0: - v4.i256 = call %storagemap_storage_slot_with_salt__u256__3271ca15373d4483 v0 v1; - evm_sstore v4 v2; + v3.i256 = call %storagemap_storage_slot_with_salt__u256__3271ca15373d4483 v0 v1; + evm_sstore v3 v2; return; } @@ -179,12 +192,20 @@ func private %storagemap_storage_slot_with_salt__u256__3271ca15373d4483(v0.i256, v3.*i8 = evm_malloc 0.i256; v4.i256 = ptr_to_int v3 i256; v5.i256 = call %u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key v4 v0; - v6.i256 = add v4 v5; + (v6.i256, v7.i1) = uaddo v4 v5; + br v7 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: mstore v6 v1 i256; - v8.i256 = add v5 32.i256; - v9.i256 = add v5 32.i256; - v10.i256 = evm_keccak256 v4 v9; - return v10; + (v11.i256, v12.i1) = uaddo v5 32.i256; + br v12 block1 block3; + + block3: + v14.i256 = evm_keccak256 v4 v11; + return v14; } func private %u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key(v0.i256, v1.i256) -> i256 { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/struct_init.snap b/crates/codegen/tests/fixtures/sonatina_ir/struct_init.snap index f852985fce..cd59efb7d5 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/struct_init.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/struct_init.snap @@ -1,26 +1,24 @@ --- source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 expression: output input_file: crates/codegen/tests/fixtures/struct_init.fe --- target = "evm-ethereum-osaka" -type @__fe_Dummy_0 = {i256, i256}; +type @__fe_Dummy_0 = {i64, i256}; func private %make_dummy() -> i256 { block0: - v2.*i8 = evm_malloc 64.i256; - v3.i256 = ptr_to_int v2 i256; - v5.i64 = trunc 42.i256 i64; - v6.i256 = zext v5 i256; - v7.*@__fe_Dummy_0 = bitcast v2 *@__fe_Dummy_0; - v8.*i256 = gep v7 0.i256 0.i256; - mstore v8 v6 i256; - v10.*@__fe_Dummy_0 = bitcast v2 *@__fe_Dummy_0; - v12.*i256 = gep v10 0.i256 1.i256; - mstore v12 99.i256 i256; - return v3; + v1.*i8 = evm_malloc 64.i256; + v2.i256 = ptr_to_int v1 i256; + v4.i256 = zext 42.i64 i256; + v5.*@__fe_Dummy_0 = bitcast v1 *@__fe_Dummy_0; + v7.*i64 = gep v5 0.i256 0.i256; + mstore v7 v4 i256; + v9.*@__fe_Dummy_0 = bitcast v1 *@__fe_Dummy_0; + v11.*i256 = gep v9 0.i256 1.i256; + mstore v11 99.i256 i256; + return v2; } func private %__fe_sonatina_entry() { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/tstor_ptr_contract.snap b/crates/codegen/tests/fixtures/sonatina_ir/tstor_ptr_contract.snap index 7a8989933e..91ced23063 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/tstor_ptr_contract.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/tstor_ptr_contract.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 expression: output input_file: crates/codegen/tests/fixtures/tstor_ptr_contract.fe --- @@ -17,90 +16,90 @@ type @__fe_SolDecoder_7 = {@__fe_Cursor_6, i256}; func private %__GuardContract_init_contract(v0.i256) { block0: - v2.i1 = ne 0.i256 0.i256; - v3.i256 = zext v2 i256; - evm_tstore v0 v3; + v2.i256 = zext 0.i1 i256; + evm_tstore v0 v2; return; } -func private %__GuardContract_recv_0_0(v0.i256, v1.i256) -> i256 { +func private %__GuardContract_recv_0_0(v0.i256, v1.i256) -> i1 { block0: v3.i256 = evm_sload v1; - v5.i256 = add v3 1.i256; + (v5.i256, v6.i1) = uaddo v3 1.i256; + br v6 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: evm_sstore v1 v5; - v6.i256 = evm_tload v0; - v7.i1 = ne v6 0.i256; - v8.i256 = zext v7 i256; - v9.i1 = is_zero v8; - v10.i256 = zext v9 i256; + v10.i256 = evm_tload v0; v11.i1 = ne v10 0.i256; - v12.i256 = zext v11 i256; - evm_tstore v0 v12; - return v8; + v12.i1 = is_zero v11; + v13.i256 = zext v12 i256; + evm_tstore v0 v13; + return v11; } func private %__GuardContract_init() { block0: - v1.i256 = call %init_field__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9 0.i256 0.i256; - v2.i256 = call %tstorptr_t__hb73db5b342ccdc03_effecthandle_hfc52f915596f993a_from_raw__bool__947c0c03c59c6f07 0.i256; - v3.i256 = sym_addr &__GuardContract_runtime; - v4.i256 = sym_size &__GuardContract_runtime; - v5.i256 = sym_size .; - v6.i256 = evm_code_size; - v7.i1 = lt v6 v5; - v8.i256 = zext v7 i256; - v9.i1 = ne v8 0.i256; - br v9 block1 block2; + v2.i256 = call %init_field__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9 0.i256 0.i256; + v3.i256 = call %tstorptr_t__hb73db5b342ccdc03_effecthandle_hfc52f915596f993a_from_raw__bool__947c0c03c59c6f07 0.i256; + v4.i256 = sym_addr &__GuardContract_runtime; + v5.i256 = sym_size &__GuardContract_runtime; + v6.i256 = sym_size .; + v7.i256 = evm_code_size; + v8.i1 = lt v7 v6; + br v8 block1 block2; block1: call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; evm_invalid; block2: - v12.i256 = sub v6 v5; - v13.i256 = sub v6 v5; + v12.i256 = sub v7 v6; + v13.i256 = sub v7 v6; v14.*i8 = evm_malloc v13; v15.i256 = ptr_to_int v14 i256; - v16.i256 = sub v6 v5; - evm_code_copy v15 v5 v16; + v16.i256 = sub v7 v6; + evm_code_copy v15 v6 v16; v18.*i8 = evm_malloc 64.i256; v19.i256 = ptr_to_int v18 i256; v20.*@__fe_MemoryBytes_0 = bitcast v18 *@__fe_MemoryBytes_0; v21.*i256 = gep v20 0.i256 0.i256; mstore v21 v15 i256; - v22.i256 = sub v6 v5; + v22.i256 = sub v7 v6; v23.*@__fe_MemoryBytes_0 = bitcast v18 *@__fe_MemoryBytes_0; v25.*i256 = gep v23 0.i256 1.i256; mstore v25 v22 i256; v26.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v19; - call %__GuardContract_init_contract v2; - evm_code_copy 0.i256 v3 v4; - evm_return 0.i256 v4; + call %__GuardContract_init_contract v3; + evm_code_copy 0.i256 v4 v5; + evm_return 0.i256 v5; } func private %__GuardContract_runtime() { block0: - v1.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483 0.i256 0.i256; - v2.i256 = call %tstorptr_t__hb73db5b342ccdc03_effecthandle_hfc52f915596f993a_from_raw__bool__947c0c03c59c6f07 0.i256; - v3.i256 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - v4.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; - br_table v3 block1 (1.i256 block2); + v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483 0.i256 0.i256; + v3.i256 = call %tstorptr_t__hb73db5b342ccdc03_effecthandle_hfc52f915596f993a_from_raw__bool__947c0c03c59c6f07 0.i256; + v5.i32 = call %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; + v7.i256 = call %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2 0.i256; + br_table v5 block1 (1.i32 block2); block1: call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort 0.i256; evm_invalid; block2: - call %flip_h5b3ce0ea80335753_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v4; - v9.i256 = call %__GuardContract_recv_0_0 v2 v1; - call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v9; + call %flip_h5b3ce0ea80335753_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966 v7; + v13.i1 = call %__GuardContract_recv_0_0 v3 v2; + call %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a 0.i256 v13; evm_invalid; } func private %init_field__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483 v0 v1; - return v3; + v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483 v0 v1; + return v2; } func private %tstorptr_t__hb73db5b342ccdc03_effecthandle_hfc52f915596f993a_from_raw__bool__947c0c03c59c6f07(v0.i256) -> i256 { @@ -115,40 +114,38 @@ func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort(v0.i256 func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - return v2; + v1.i256 = call %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; + return v1; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_field__u256__3271ca15373d4483(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9 0.i256 v1; - return v3; + v4.i256 = call %stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9 0.i256 v1; + return v4; } -func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { +func private %runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i32 { block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; - v3.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v2; - v5.i1 = lt v3 4.i256; - v6.i256 = zext v5 i256; - v7.i1 = ne v6 0.i256; - br v7 block1 block2; + v1.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input v0; + v2.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len v1; + v4.i1 = call %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt v2 4.i256; + br v4 block1 block2; block1: call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort v0; evm_invalid; block2: - v10.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v2 0.i256; - v11.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v10; - return v11; + v8.i256 = call %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at v1 0.i256; + v9.i32 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix v8; + return v9; } func private %runtime_decoder__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2(v0.i256) -> i256 { block0: - v2.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; - v4.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 4.i256; - return v4; + v3.i256 = call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input 0.i256; + v5.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 4.i256; + return v5; } func private %flip_h5b3ce0ea80335753_decode_h624c3cd8c996d995_decode__SolDecoder_CallData___c1e4510fd444b966(v0.i256) { @@ -156,16 +153,16 @@ func private %flip_h5b3ce0ea80335753_decode_h624c3cd8c996d995_decode__SolDecoder return; } -func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a(v0.i256, v1.i256) { +func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__397940bf296cce2a(v0.i256, v1.i1) { block0: - v3.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; - v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v3 32.i256; - call %bool_h947c0c03c59c6f07_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v3; - v6.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v3; - v7.*@__fe_tuple_1 = int_to_ptr v6 *@__fe_tuple_1; - v8.*i256 = gep v7 0.i256 0.i256; + v2.i256 = call %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new; + v4.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head v2 32.i256; + call %bool_h947c0c03c59c6f07_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383 v1 v2; + v5.i256 = call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish v2; + v6.*@__fe_tuple_1 = int_to_ptr v5 *@__fe_tuple_1; + v8.*i256 = gep v6 0.i256 0.i256; v9.i256 = mload v8 i256; - v10.*@__fe_tuple_1 = int_to_ptr v6 *@__fe_tuple_1; + v10.*@__fe_tuple_1 = int_to_ptr v5 *@__fe_tuple_1; v12.*i256 = gep v10 0.i256 1.i256; v13.i256 = mload v12 i256; call %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes 0.i256 v9 v13; @@ -174,37 +171,37 @@ func private %return_value__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f_bool__39 func private %soldecoder_i__ha12a03fcb5ba844b_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v2.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; - v4.*i8 = evm_malloc 128.i256; - v5.i256 = ptr_to_int v4 i256; - v6.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; - v7.*i256 = gep v6 0.i256 0.i256 0.i256; + v1.i256 = call %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b v0; + v3.*i8 = evm_malloc 128.i256; + v4.i256 = ptr_to_int v3 i256; + v5.*@__fe_Cursor_2 = int_to_ptr v1 *@__fe_Cursor_2; + v7.*i256 = gep v5 0.i256 0.i256 0.i256; v8.i256 = mload v7 i256; - v9.*@__fe_SolDecoder_3 = bitcast v4 *@__fe_SolDecoder_3; + v9.*@__fe_SolDecoder_3 = bitcast v3 *@__fe_SolDecoder_3; v10.*i256 = gep v9 0.i256 0.i256 0.i256 0.i256; mstore v10 v8 i256; - v11.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; + v11.*@__fe_Cursor_2 = int_to_ptr v1 *@__fe_Cursor_2; v13.*i256 = gep v11 0.i256 0.i256 1.i256; v14.i256 = mload v13 i256; - v15.*@__fe_SolDecoder_3 = bitcast v4 *@__fe_SolDecoder_3; + v15.*@__fe_SolDecoder_3 = bitcast v3 *@__fe_SolDecoder_3; v16.*i256 = gep v15 0.i256 0.i256 0.i256 1.i256; mstore v16 v14 i256; - v17.*@__fe_Cursor_2 = int_to_ptr v2 *@__fe_Cursor_2; + v17.*@__fe_Cursor_2 = int_to_ptr v1 *@__fe_Cursor_2; v18.*i256 = gep v17 0.i256 1.i256; v19.i256 = mload v18 i256; - v20.*@__fe_SolDecoder_3 = bitcast v4 *@__fe_SolDecoder_3; + v20.*@__fe_SolDecoder_3 = bitcast v3 *@__fe_SolDecoder_3; v21.*i256 = gep v20 0.i256 0.i256 1.i256; mstore v21 v19 i256; - v22.*@__fe_SolDecoder_3 = bitcast v4 *@__fe_SolDecoder_3; + v22.*@__fe_SolDecoder_3 = bitcast v3 *@__fe_SolDecoder_3; v23.*i256 = gep v22 0.i256 1.i256; mstore v23 0.i256 i256; - return v5; + return v4; } func private %stor_ptr__Evm_hef0af3106e109414_u256__3b1b0af5b20737f9(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483 v1; - return v3; + v2.i256 = call %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483 v1; + return v2; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256) -> i256 { @@ -214,74 +211,94 @@ func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input(v0.i256 func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0.i256) -> i256 { block0: - v2.i256 = evm_calldata_size; - v3.i256 = sub v2 v0; - return v3; + v1.i256 = evm_calldata_size; + (v2.i256, v3.i1) = usubo v1 v0; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + return v2; +} + +func private %u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = lt v0 v1; + return v2; } func private %calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = add v0 v1; - v4.i256 = add v0 v1; - v5.i256 = evm_calldata_load v4; + (v2.i256, v3.i1) = uaddo v0 v1; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v5.i256 = evm_calldata_load v2; return v5; } -func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i256 { +func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v0.i256) -> i32 { block0: - v3.i256 = shr 224.i256 v0; - v4.i256 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v3; - return v4; + v2.i256 = shr 224.i256 v0; + v3.i32 = call %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35 v2; + return v3; } func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_decoder_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; - return v3; + v2.i256 = call %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0 v1; + return v2; } func private %sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_encoder_new() -> i256 { block0: - v1.i256 = call %solencoder_h1b9228b90dad6928_new; - return v1; + v0.i256 = call %solencoder_h1b9228b90dad6928_new; + return v0; } func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v4.*i256 = gep v3 0.i256 0.i256; + v2.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v4.*i256 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; - v6.i1 = eq v5 0.i256; - v7.i256 = zext v6 i256; - v8.i1 = ne v7 0.i256; - br v8 block1 block2; + v6.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq v5 0.i256; + br v6 block1 block2; block1: - v10.*i8 = evm_malloc v1; - v11.i256 = ptr_to_int v10 i256; + v8.*i8 = evm_malloc v1; + v9.i256 = ptr_to_int v8 i256; + v11.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v12.*i256 = gep v11 0.i256 0.i256; + mstore v12 v9 i256; v13.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v14.*i256 = gep v13 0.i256 0.i256; - mstore v14 v11 i256; - v15.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v17.*i256 = gep v15 0.i256 1.i256; - mstore v17 v11 i256; - v18.i256 = add v11 v1; - v19.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v21.*i256 = gep v19 0.i256 2.i256; - mstore v21 v18 i256; - jump block2; + v15.*i256 = gep v13 0.i256 1.i256; + mstore v15 v9 i256; + (v16.i256, v17.i1) = uaddo v9 v1; + br v17 block3 block4; block2: v23.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; v24.*i256 = gep v23 0.i256 0.i256; v25.i256 = mload v24 i256; return v25; + + block3: + evm_revert 0.i256 0.i256; + + block4: + v19.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v21.*i256 = gep v19 0.i256 2.i256; + mstore v21 v16 i256; + jump block2; } -func private %bool_h947c0c03c59c6f07_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i256, v1.i256) { +func private %bool_h947c0c03c59c6f07_encode_hab7243eccf2714fb_encode__Sol_hfd482bb803ad8c5f_SolEncoder_h1b9228b90dad6928__1a070c3866d16383(v0.i1, v1.i256) { block0: - v3.i1 = ne v0 0.i256; - br v3 block1 block3; + br v0 block1 block3; block1: call %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word v1 1.i256; @@ -297,22 +314,28 @@ func private %bool_h947c0c03c59c6f07_encode_hab7243eccf2714fb_encode__Sol_hfd482 func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish(v0.i256) -> i256 { block0: - v2.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v3.*i256 = gep v2 0.i256 0.i256; + v1.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v3.*i256 = gep v1 0.i256 0.i256; v4.i256 = mload v3 i256; v5.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; v7.*i256 = gep v5 0.i256 2.i256; v8.i256 = mload v7 i256; - v10.*i8 = evm_malloc 64.i256; - v11.i256 = ptr_to_int v10 i256; - v12.*@__fe_tuple_1 = bitcast v10 *@__fe_tuple_1; - v13.*i256 = gep v12 0.i256 0.i256; - mstore v13 v4 i256; - v14.i256 = sub v8 v4; - v15.*@__fe_tuple_1 = bitcast v10 *@__fe_tuple_1; - v17.*i256 = gep v15 0.i256 1.i256; - mstore v17 v14 i256; - return v11; + (v9.i256, v10.i1) = usubo v8 v4; + br v10 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v12.*i8 = evm_malloc 64.i256; + v13.i256 = ptr_to_int v12 i256; + v15.*@__fe_tuple_1 = bitcast v12 *@__fe_tuple_1; + v16.*i256 = gep v15 0.i256 0.i256; + mstore v16 v4 i256; + v17.*@__fe_tuple_1 = bitcast v12 *@__fe_tuple_1; + v19.*i256 = gep v17 0.i256 1.i256; + mstore v19 v9 i256; + return v13; } func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes(v0.i256, v1.i256, v2.i256) { @@ -322,24 +345,24 @@ func private %evm_hef0af3106e109414_contracthost_h57111e7eb283a125_return_bytes( func private %cursor_i__h140a998c67d6d59c_new__MemoryBytes_h1e381015a9b0111b__59e0d528d54cca1b(v0.i256) -> i256 { block0: - v3.*i8 = evm_malloc 96.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; - v6.*i256 = gep v5 0.i256 0.i256; + v2.*i8 = evm_malloc 96.i256; + v3.i256 = ptr_to_int v2 i256; + v4.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; + v6.*i256 = gep v4 0.i256 0.i256; v7.i256 = mload v6 i256; - v8.*@__fe_Cursor_2 = bitcast v3 *@__fe_Cursor_2; + v8.*@__fe_Cursor_2 = bitcast v2 *@__fe_Cursor_2; v9.*i256 = gep v8 0.i256 0.i256 0.i256; mstore v9 v7 i256; v10.*@__fe_MemoryBytes_0 = int_to_ptr v0 *@__fe_MemoryBytes_0; v12.*i256 = gep v10 0.i256 1.i256; v13.i256 = mload v12 i256; - v14.*@__fe_Cursor_2 = bitcast v3 *@__fe_Cursor_2; + v14.*@__fe_Cursor_2 = bitcast v2 *@__fe_Cursor_2; v15.*i256 = gep v14 0.i256 0.i256 1.i256; mstore v15 v13 i256; - v16.*@__fe_Cursor_2 = bitcast v3 *@__fe_Cursor_2; + v16.*@__fe_Cursor_2 = bitcast v2 *@__fe_Cursor_2; v17.*i256 = gep v16 0.i256 1.i256; mstore v17 0.i256 i256; - return v4; + return v3; } func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__u256__3271ca15373d4483(v0.i256) -> i256 { @@ -347,63 +370,75 @@ func private %storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_r return v0; } -func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i256 { +func private %s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35(v0.i256) -> i32 { block0: - v2.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; - v3.i256 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v2; - return v3; + v1.i256 = call %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word v0; + v2.i32 = call %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word v1; + return v2; } func private %soldecoder_i__ha12a03fcb5ba844b_with_base__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; - v4.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v3 v1; - v6.*i8 = evm_malloc 96.i256; - v7.i256 = ptr_to_int v6 i256; - v8.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; - v9.*i256 = gep v8 0.i256 0.i256 0.i256; + v2.i256 = call %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v0; + v3.i256 = call %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563 v2 v1; + v5.*i8 = evm_malloc 96.i256; + v6.i256 = ptr_to_int v5 i256; + v7.*@__fe_Cursor_6 = int_to_ptr v3 *@__fe_Cursor_6; + v9.*i256 = gep v7 0.i256 0.i256 0.i256; v10.i256 = mload v9 i256; - v11.*@__fe_SolDecoder_7 = bitcast v6 *@__fe_SolDecoder_7; + v11.*@__fe_SolDecoder_7 = bitcast v5 *@__fe_SolDecoder_7; v12.*i256 = gep v11 0.i256 0.i256 0.i256 0.i256; mstore v12 v10 i256; - v13.*@__fe_Cursor_6 = int_to_ptr v4 *@__fe_Cursor_6; + v13.*@__fe_Cursor_6 = int_to_ptr v3 *@__fe_Cursor_6; v15.*i256 = gep v13 0.i256 1.i256; v16.i256 = mload v15 i256; - v17.*@__fe_SolDecoder_7 = bitcast v6 *@__fe_SolDecoder_7; + v17.*@__fe_SolDecoder_7 = bitcast v5 *@__fe_SolDecoder_7; v18.*i256 = gep v17 0.i256 0.i256 1.i256; mstore v18 v16 i256; - v19.*@__fe_SolDecoder_7 = bitcast v6 *@__fe_SolDecoder_7; + v19.*@__fe_SolDecoder_7 = bitcast v5 *@__fe_SolDecoder_7; v20.*i256 = gep v19 0.i256 1.i256; mstore v20 v1 i256; - return v7; + return v6; } func private %solencoder_h1b9228b90dad6928_new() -> i256 { block0: - v2.*i8 = evm_malloc 96.i256; - v3.i256 = ptr_to_int v2 i256; - v4.*@__fe_SolEncoder_4 = bitcast v2 *@__fe_SolEncoder_4; + v1.*i8 = evm_malloc 96.i256; + v2.i256 = ptr_to_int v1 i256; + v4.*@__fe_SolEncoder_4 = bitcast v1 *@__fe_SolEncoder_4; v5.*i256 = gep v4 0.i256 0.i256; mstore v5 0.i256 i256; - v6.*@__fe_SolEncoder_4 = bitcast v2 *@__fe_SolEncoder_4; + v6.*@__fe_SolEncoder_4 = bitcast v1 *@__fe_SolEncoder_4; v8.*i256 = gep v6 0.i256 1.i256; mstore v8 0.i256 i256; - v9.*@__fe_SolEncoder_4 = bitcast v2 *@__fe_SolEncoder_4; + v9.*@__fe_SolEncoder_4 = bitcast v1 *@__fe_SolEncoder_4; v11.*i256 = gep v9 0.i256 2.i256; mstore v11 0.i256 i256; - return v3; + return v2; +} + +func private %u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; + return v2; } func private %solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word(v0.i256, v1.i256) { block0: - v3.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v5.*i256 = gep v3 0.i256 1.i256; + v2.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v5.*i256 = gep v2 0.i256 1.i256; v6.i256 = mload v5 i256; mstore v6 v1 i256; - v8.i256 = add v6 32.i256; - v9.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; - v10.*i256 = gep v9 0.i256 1.i256; - mstore v10 v8 i256; + (v8.i256, v9.i1) = uaddo v6 32.i256; + br v9 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v11.*@__fe_SolEncoder_4 = int_to_ptr v0 *@__fe_SolEncoder_4; + v12.*i256 = gep v11 0.i256 1.i256; + mstore v12 v8 i256; return; } @@ -412,28 +447,29 @@ func private %u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0.i256) return v0; } -func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i256 { +func private %u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word(v0.i256) -> i32 { block0: - return v0; + v1.i32 = trunc v0 i32; + return v1; } func private %cursor_i__h140a998c67d6d59c_new__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256) -> i256 { block0: - v3.*i8 = evm_malloc 64.i256; - v4.i256 = ptr_to_int v3 i256; - v5.*@__fe_Cursor_6 = bitcast v3 *@__fe_Cursor_6; - v6.*@__fe_CallData_5 = gep v5 0.i256 0.i256; + v2.*i8 = evm_malloc 64.i256; + v3.i256 = ptr_to_int v2 i256; + v4.*@__fe_Cursor_6 = bitcast v2 *@__fe_Cursor_6; + v6.*@__fe_CallData_5 = gep v4 0.i256 0.i256; mstore v6 v0 i256; - v7.*@__fe_Cursor_6 = bitcast v3 *@__fe_Cursor_6; + v7.*@__fe_Cursor_6 = bitcast v2 *@__fe_Cursor_6; v9.*i256 = gep v7 0.i256 1.i256; mstore v9 0.i256 i256; - return v4; + return v3; } func private %cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563(v0.i256, v1.i256) -> i256 { block0: - v3.*@__fe_Cursor_6 = int_to_ptr v0 *@__fe_Cursor_6; - v4.*@__fe_CallData_5 = gep v3 0.i256 0.i256; + v2.*@__fe_Cursor_6 = int_to_ptr v0 *@__fe_Cursor_6; + v4.*@__fe_CallData_5 = gep v2 0.i256 0.i256; v5.i256 = mload v4 i256; v7.*i8 = evm_malloc 64.i256; v8.i256 = ptr_to_int v7 i256; diff --git a/crates/codegen/tests/fixtures/sonatina_ir/tuple_construction.snap b/crates/codegen/tests/fixtures/sonatina_ir/tuple_construction.snap index d2665774fd..ee1a9197b2 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/tuple_construction.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/tuple_construction.snap @@ -1,40 +1,38 @@ --- source: crates/codegen/tests/sonatina_ir.rs -assertion_line: 64 expression: output input_file: crates/codegen/tests/fixtures/tuple_construction.fe --- target = "evm-ethereum-osaka" -type @__fe_tuple_0 = {i256, i256}; +type @__fe_tuple_0 = {i64, i256}; type @__fe_tuple_1 = {i256, i256, i256}; func private %make_tuple() -> i256 { block0: - v2.*i8 = evm_malloc 64.i256; - v3.i256 = ptr_to_int v2 i256; - v5.i64 = trunc 42.i256 i64; - v6.i256 = zext v5 i256; - v7.*@__fe_tuple_0 = bitcast v2 *@__fe_tuple_0; - v8.*i256 = gep v7 0.i256 0.i256; - mstore v8 v6 i256; - v10.*@__fe_tuple_0 = bitcast v2 *@__fe_tuple_0; - v12.*i256 = gep v10 0.i256 1.i256; - mstore v12 99.i256 i256; - return v3; + v1.*i8 = evm_malloc 64.i256; + v2.i256 = ptr_to_int v1 i256; + v4.i256 = zext 42.i64 i256; + v5.*@__fe_tuple_0 = bitcast v1 *@__fe_tuple_0; + v7.*i64 = gep v5 0.i256 0.i256; + mstore v7 v4 i256; + v9.*@__fe_tuple_0 = bitcast v1 *@__fe_tuple_0; + v11.*i256 = gep v9 0.i256 1.i256; + mstore v11 99.i256 i256; + return v2; } func private %access_tuple() -> i256 { block0: - v1.*@__fe_tuple_1 = alloca @__fe_tuple_1; - v2.i256 = ptr_to_int v1 i256; - v4.*i256 = gep v1 0.i256 0.i256; + v0.*@__fe_tuple_1 = alloca @__fe_tuple_1; + v1.i256 = ptr_to_int v0 i256; + v4.*i256 = gep v0 0.i256 0.i256; mstore v4 1.i256 i256; - v6.*i256 = gep v1 0.i256 1.i256; + v6.*i256 = gep v0 0.i256 1.i256; mstore v6 2.i256 i256; - v8.*i256 = gep v1 0.i256 2.i256; + v8.*i256 = gep v0 0.i256 2.i256; mstore v8 3.i256 i256; - v9.*i256 = gep v1 0.i256 1.i256; + v9.*i256 = gep v0 0.i256 1.i256; v10.i256 = mload v9 i256; return v10; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/tuple_expr.snap b/crates/codegen/tests/fixtures/sonatina_ir/tuple_expr.snap index 59f7d57e1c..bb7a9bc787 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/tuple_expr.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/tuple_expr.snap @@ -5,26 +5,29 @@ input_file: crates/codegen/tests/fixtures/tuple_expr.fe --- target = "evm-ethereum-osaka" -type @__fe_tuple_0 = {i256, i256}; +type @__fe_tuple_0 = {i64, i1}; func private %tuple_expr() -> i256 { block0: - v2.*i8 = evm_malloc 64.i256; - v3.i256 = ptr_to_int v2 i256; - v6.i256 = add 1.i256 2.i256; - v7.i64 = trunc v6 i64; - v8.i256 = zext v7 i256; - v9.*@__fe_tuple_0 = bitcast v2 *@__fe_tuple_0; - v10.*i256 = gep v9 0.i256 0.i256; + (v2.i64, v3.i1) = uaddo 1.i64 2.i64; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + v6.*i8 = evm_malloc 64.i256; + v7.i256 = ptr_to_int v6 i256; + v8.i256 = zext v2 i256; + v9.*@__fe_tuple_0 = bitcast v6 *@__fe_tuple_0; + v10.*i64 = gep v9 0.i256 0.i256; mstore v10 v8 i256; - v11.i1 = is_zero 0.i256; - v12.i256 = zext v11 i256; - v13.i1 = ne v12 0.i256; - v14.i256 = zext v13 i256; - v15.*@__fe_tuple_0 = bitcast v2 *@__fe_tuple_0; - v16.*i256 = gep v15 0.i256 1.i256; - mstore v16 v14 i256; - return v3; + v12.i1 = is_zero 0.i1; + v13.i256 = zext v12 i256; + v14.*@__fe_tuple_0 = bitcast v6 *@__fe_tuple_0; + v16.*i1 = gep v14 0.i256 1.i256; + mstore v16 v13 i256; + return v7; } func private %__fe_sonatina_entry() { diff --git a/crates/codegen/tests/fixtures/sonatina_ir/tuple_literal_field_access.snap b/crates/codegen/tests/fixtures/sonatina_ir/tuple_literal_field_access.snap index 8c51144afb..21e6c9333d 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/tuple_literal_field_access.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/tuple_literal_field_access.snap @@ -10,34 +10,34 @@ type @__fe_tuple_1 = {i256, @__fe_tuple_0}; func private %tuple_literal_field_access() -> i256 { block0: - v3.*@__fe_tuple_0 = alloca @__fe_tuple_0; - v4.i256 = ptr_to_int v3 i256; - v5.*i256 = gep v3 0.i256 0.i256; + v2.*@__fe_tuple_0 = alloca @__fe_tuple_0; + v3.i256 = ptr_to_int v2 i256; + v5.*i256 = gep v2 0.i256 0.i256; mstore v5 1.i256 i256; - v6.*i256 = gep v3 0.i256 1.i256; + v6.*i256 = gep v2 0.i256 1.i256; mstore v6 2.i256 i256; - v7.*i256 = gep v3 0.i256 1.i256; + v7.*i256 = gep v2 0.i256 1.i256; v8.i256 = mload v7 i256; return v8; } func private %tuple_literal_nested_access() -> i256 { block0: - v4.*@__fe_tuple_0 = alloca @__fe_tuple_0; - v5.i256 = ptr_to_int v4 i256; - v6.*i256 = gep v4 0.i256 0.i256; + v3.*@__fe_tuple_0 = alloca @__fe_tuple_0; + v4.i256 = ptr_to_int v3 i256; + v6.*i256 = gep v3 0.i256 0.i256; mstore v6 2.i256 i256; - v7.*i256 = gep v4 0.i256 1.i256; + v7.*i256 = gep v3 0.i256 1.i256; mstore v7 3.i256 i256; v8.*@__fe_tuple_1 = alloca @__fe_tuple_1; v9.i256 = ptr_to_int v8 i256; v10.*i256 = gep v8 0.i256 0.i256; mstore v10 1.i256 i256; - v11.*i256 = gep v4 0.i256 0.i256; + v11.*i256 = gep v3 0.i256 0.i256; v12.i256 = mload v11 i256; v13.*i256 = gep v8 0.i256 1.i256 0.i256; mstore v13 v12 i256; - v14.*i256 = gep v4 0.i256 1.i256; + v14.*i256 = gep v3 0.i256 1.i256; v15.i256 = mload v14 i256; v16.*i256 = gep v8 0.i256 1.i256 1.i256; mstore v16 v15 i256; @@ -50,13 +50,13 @@ func private %tuple_literal_nested_access() -> i256 { func private %tuple_literal_struct_chain() -> i256 { block0: - v3.*@__fe_tuple_0 = alloca @__fe_tuple_0; - v4.i256 = ptr_to_int v3 i256; - v5.*i256 = gep v3 0.i256 0.i256; + v2.*@__fe_tuple_0 = alloca @__fe_tuple_0; + v3.i256 = ptr_to_int v2 i256; + v5.*i256 = gep v2 0.i256 0.i256; mstore v5 1.i256 i256; - v6.*i256 = gep v3 0.i256 1.i256; + v6.*i256 = gep v2 0.i256 1.i256; mstore v6 2.i256 i256; - v7.*i256 = gep v3 0.i256 1.i256; + v7.*i256 = gep v2 0.i256 1.i256; v8.i256 = mload v7 i256; return v8; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/tuple_single_element_peeling.snap b/crates/codegen/tests/fixtures/sonatina_ir/tuple_single_element_peeling.snap index 09ab1ea740..4bff235f41 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/tuple_single_element_peeling.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/tuple_single_element_peeling.snap @@ -20,7 +20,7 @@ func private %tuple_single_struct_newtype_nested(v0.i256) -> i256 { return v0; } -func private %match_single_element_tuple(v0.i256) -> i256 { +func private %match_single_element_tuple(v0.i1) -> i8 { block0: jump block4; @@ -28,14 +28,14 @@ func private %match_single_element_tuple(v0.i256) -> i256 { jump block2; block2: - v3.i256 = phi (1.i256 block1) (0.i256 block3); + v3.i8 = phi (1.i8 block1) (0.i8 block3); return v3; block3: jump block2; block4: - br_table v0 block5 (1.i256 block1) (0.i256 block3); + br_table v0 block5 (1.i1 block1) (0.i1 block3); block5: evm_invalid; diff --git a/crates/codegen/tests/fixtures/sonatina_ir/unary_expr.snap b/crates/codegen/tests/fixtures/sonatina_ir/unary_expr.snap index 9a2eb378f5..ff17fa11d8 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/unary_expr.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/unary_expr.snap @@ -5,16 +5,25 @@ input_file: crates/codegen/tests/fixtures/unary_expr.fe --- target = "evm-ethereum-osaka" -func private %unary_expr() -> i256 { +func private %unary_expr() -> i64 { block0: - v3.i256 = add 1.i256 2.i256; - v4.i256 = neg v3; - return v4; + (v2.i64, v3.i1) = saddo 1.i64 2.i64; + br v3 block1 block2; + + block1: + evm_revert 0.i256 0.i256; + + block2: + (v5.i64, v6.i1) = snego v2; + br v6 block1 block3; + + block3: + return v5; } func private %__fe_sonatina_entry() { block0: - v0.i256 = call %unary_expr; + v0.i64 = call %unary_expr; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/while.snap b/crates/codegen/tests/fixtures/sonatina_ir/while.snap index c3aa14725f..7f0aa9dedc 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/while.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/while.snap @@ -5,28 +5,38 @@ input_file: crates/codegen/tests/fixtures/while.fe --- target = "evm-ethereum-osaka" -func private %do_while() -> i256 { +func private %do_while() -> i64 { block0: jump block1; block1: - v1.i256 = phi (0.i256 block0) (v8 block2); - v3.i1 = lt v1 10.i256; - v4.i256 = zext v3 i256; - v5.i1 = ne v4 0.i256; - br v5 block2 block3; + v1.i64 = phi (0.i64 block0) (v6 block5); + v3.i1 = call %u64_haee7f05a097ffa16_ord_h264f6d6d75097a_lt v1 10.i64; + br v3 block2 block3; block2: - v8.i256 = add v1 1.i256; - jump block1; + (v6.i64, v7.i1) = uaddo v1 1.i64; + br v7 block4 block5; block3: return v1; + + block4: + evm_revert 0.i256 0.i256; + + block5: + jump block1; +} + +func private %u64_haee7f05a097ffa16_ord_h264f6d6d75097a_lt(v0.i64, v1.i64) -> i1 { + block0: + v2.i1 = lt v0 v1; + return v2; } func private %__fe_sonatina_entry() { block0: - v0.i256 = call %do_while; + v0.i64 = call %do_while; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/while_cond_call.snap b/crates/codegen/tests/fixtures/sonatina_ir/while_cond_call.snap index 92b1b7cd88..b3e75c9a87 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/while_cond_call.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/while_cond_call.snap @@ -5,34 +5,44 @@ input_file: crates/codegen/tests/fixtures/while_cond_call.fe --- target = "evm-ethereum-osaka" -func private %lt_ten(v0.i256) -> i256 { +func private %lt_ten(v0.i64) -> i1 { block0: - v3.i1 = lt v0 10.i256; - v4.i256 = zext v3 i256; - return v4; + v2.i1 = call %u64_haee7f05a097ffa16_ord_h264f6d6d75097a_lt v0 10.i64; + return v2; } -func private %while_cond_call() -> i256 { +func private %while_cond_call() -> i64 { block0: jump block1; block1: - v1.i256 = phi (0.i256 block0) (v6 block2); - v2.i256 = call %lt_ten v1; - v3.i1 = ne v2 0.i256; - br v3 block2 block3; + v1.i64 = phi (0.i64 block0) (v5 block5); + v2.i1 = call %lt_ten v1; + br v2 block2 block3; block2: - v6.i256 = add v1 1.i256; - jump block1; + (v5.i64, v6.i1) = uaddo v1 1.i64; + br v6 block4 block5; block3: return v1; + + block4: + evm_revert 0.i256 0.i256; + + block5: + jump block1; +} + +func private %u64_haee7f05a097ffa16_ord_h264f6d6d75097a_lt(v0.i64, v1.i64) -> i1 { + block0: + v2.i1 = lt v0 v1; + return v2; } func private %__fe_sonatina_entry() { block0: - v1.i256 = call %lt_ten 0.i256; + v1.i1 = call %lt_ten 0.i64; evm_stop; } diff --git a/crates/codegen/tests/fixtures/sonatina_ir/wrapping_saturating.snap b/crates/codegen/tests/fixtures/sonatina_ir/wrapping_saturating.snap new file mode 100644 index 0000000000..35148d35f1 --- /dev/null +++ b/crates/codegen/tests/fixtures/sonatina_ir/wrapping_saturating.snap @@ -0,0 +1,314 @@ +--- +source: crates/codegen/tests/sonatina_ir.rs +expression: output +input_file: crates/codegen/tests/fixtures/wrapping_saturating.fe +--- +target = "evm-ethereum-osaka" + +type @__fe_tuple_0 = {i64, i64, i64}; +type @__fe_tuple_1 = {i256, i256, i256}; + +func private %wrapping_ops_u64(v0.i64, v1.i64) -> i256 { + block0: + v2.i64 = call %u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add v0 v1; + v3.i64 = call %u64_haee7f05a097ffa16_wrappingsub_h6880d1ff91f0a556_wrapping_sub v0 v1; + v4.i64 = call %u64_haee7f05a097ffa16_wrappingmul_h64e6b83610cda761_wrapping_mul v0 v1; + v6.*i8 = evm_malloc 96.i256; + v7.i256 = ptr_to_int v6 i256; + v8.i256 = zext v2 i256; + v9.*@__fe_tuple_0 = bitcast v6 *@__fe_tuple_0; + v11.*i64 = gep v9 0.i256 0.i256; + mstore v11 v8 i256; + v12.i256 = zext v3 i256; + v13.*@__fe_tuple_0 = bitcast v6 *@__fe_tuple_0; + v15.*i64 = gep v13 0.i256 1.i256; + mstore v15 v12 i256; + v16.i256 = zext v4 i256; + v17.*@__fe_tuple_0 = bitcast v6 *@__fe_tuple_0; + v19.*i64 = gep v17 0.i256 2.i256; + mstore v19 v16 i256; + return v7; +} + +func private %saturating_ops_u64(v0.i64, v1.i64) -> i256 { + block0: + v2.i64 = call %u64_haee7f05a097ffa16_saturatingadd_h7ca6e43aca8f23bb_saturating_add v0 v1; + v3.i64 = call %u64_haee7f05a097ffa16_saturatingsub_hd0c1c727e69d9468_saturating_sub v0 v1; + v4.i64 = call %u64_haee7f05a097ffa16_saturatingmul_hf2bc6be7b84ff8f7_saturating_mul v0 v1; + v6.*i8 = evm_malloc 96.i256; + v7.i256 = ptr_to_int v6 i256; + v8.i256 = zext v2 i256; + v9.*@__fe_tuple_0 = bitcast v6 *@__fe_tuple_0; + v11.*i64 = gep v9 0.i256 0.i256; + mstore v11 v8 i256; + v12.i256 = zext v3 i256; + v13.*@__fe_tuple_0 = bitcast v6 *@__fe_tuple_0; + v15.*i64 = gep v13 0.i256 1.i256; + mstore v15 v12 i256; + v16.i256 = zext v4 i256; + v17.*@__fe_tuple_0 = bitcast v6 *@__fe_tuple_0; + v19.*i64 = gep v17 0.i256 2.i256; + mstore v19 v16 i256; + return v7; +} + +func private %wrapping_ops_u256(v0.i256, v1.i256) -> i256 { + block0: + v2.i256 = call %u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add v0 v1; + v3.i256 = call %u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub v0 v1; + v4.i256 = call %u256_h3271ca15373d4483_wrappingmul_h64e6b83610cda761_wrapping_mul v0 v1; + v6.*i8 = evm_malloc 96.i256; + v7.i256 = ptr_to_int v6 i256; + v8.*@__fe_tuple_1 = bitcast v6 *@__fe_tuple_1; + v10.*i256 = gep v8 0.i256 0.i256; + mstore v10 v2 i256; + v11.*@__fe_tuple_1 = bitcast v6 *@__fe_tuple_1; + v13.*i256 = gep v11 0.i256 1.i256; + mstore v13 v3 i256; + v14.*@__fe_tuple_1 = bitcast v6 *@__fe_tuple_1; + v16.*i256 = gep v14 0.i256 2.i256; + mstore v16 v4 i256; + return v7; +} + +func private %saturating_ops_u256(v0.i256, v1.i256) -> i256 { + block0: + v2.i256 = call %u256_h3271ca15373d4483_saturatingadd_h7ca6e43aca8f23bb_saturating_add v0 v1; + v3.i256 = call %u256_h3271ca15373d4483_saturatingsub_hd0c1c727e69d9468_saturating_sub v0 v1; + v4.i256 = call %u256_h3271ca15373d4483_saturatingmul_hf2bc6be7b84ff8f7_saturating_mul v0 v1; + v6.*i8 = evm_malloc 96.i256; + v7.i256 = ptr_to_int v6 i256; + v8.*@__fe_tuple_1 = bitcast v6 *@__fe_tuple_1; + v10.*i256 = gep v8 0.i256 0.i256; + mstore v10 v2 i256; + v11.*@__fe_tuple_1 = bitcast v6 *@__fe_tuple_1; + v13.*i256 = gep v11 0.i256 1.i256; + mstore v13 v3 i256; + v14.*@__fe_tuple_1 = bitcast v6 *@__fe_tuple_1; + v16.*i256 = gep v14 0.i256 2.i256; + mstore v16 v4 i256; + return v7; +} + +func private %u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add(v0.i64, v1.i64) -> i64 { + block0: + v2.i64 = add v0 v1; + return v2; +} + +func private %u64_haee7f05a097ffa16_wrappingsub_h6880d1ff91f0a556_wrapping_sub(v0.i64, v1.i64) -> i64 { + block0: + v2.i64 = sub v0 v1; + return v2; +} + +func private %u64_haee7f05a097ffa16_wrappingmul_h64e6b83610cda761_wrapping_mul(v0.i64, v1.i64) -> i64 { + block0: + v2.i64 = mul v0 v1; + return v2; +} + +func private %u64_haee7f05a097ffa16_saturatingadd_h7ca6e43aca8f23bb_saturating_add(v0.i64, v1.i64) -> i64 { + block0: + v2.i64 = add v0 v1; + v4.i1 = lt v2 v0; + br v4 block1 block2; + + block1: + v6.i64 = trunc 18446744073709551615.i256 i64; + jump block3; + + block2: + jump block3; + + block3: + v8.i64 = phi (v6 block1) (v2 block2); + return v8; +} + +func private %u64_haee7f05a097ffa16_saturatingsub_hd0c1c727e69d9468_saturating_sub(v0.i64, v1.i64) -> i64 { + block0: + v3.i1 = gt v1 v0; + br v3 block1 block2; + + block1: + jump block3; + + block2: + v6.i64 = sub v0 v1; + jump block3; + + block3: + v7.i64 = phi (0.i64 block1) (v6 block2); + return v7; +} + +func private %u64_haee7f05a097ffa16_saturatingmul_hf2bc6be7b84ff8f7_saturating_mul(v0.i64, v1.i64) -> i64 { + block0: + v3.i1 = call %u64_haee7f05a097ffa16_eq_he50383edd273619f_eq v0 0.i64; + br v3 block1 block3; + + block1: + jump block7; + + block2: + v6.i64 = mul v0 v1; + (v7.i64, v8.i1) = evm_udivo v6 v0; + br v8 block8 block9; + + block3: + v13.i1 = call %u64_haee7f05a097ffa16_eq_he50383edd273619f_eq v1 0.i64; + br v13 block1 block2; + + block4: + v15.i64 = trunc 18446744073709551615.i256 i64; + jump block6; + + block5: + jump block6; + + block6: + v17.i64 = phi (v15 block4) (v6 block5); + jump block7; + + block7: + v18.i64 = phi (0.i64 block1) (v17 block6); + return v18; + + block8: + evm_revert 0.i256 0.i256; + + block9: + v11.i1 = call %u64_haee7f05a097ffa16_eq_he50383edd273619f_ne v7 v1; + br v11 block4 block5; +} + +func private %u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add(v0.i256, v1.i256) -> i256 { + block0: + v2.i256 = add v0 v1; + return v2; +} + +func private %u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub(v0.i256, v1.i256) -> i256 { + block0: + v2.i256 = sub v0 v1; + return v2; +} + +func private %u256_h3271ca15373d4483_wrappingmul_h64e6b83610cda761_wrapping_mul(v0.i256, v1.i256) -> i256 { + block0: + v2.i256 = mul v0 v1; + return v2; +} + +func private %u256_h3271ca15373d4483_saturatingadd_h7ca6e43aca8f23bb_saturating_add(v0.i256, v1.i256) -> i256 { + block0: + v2.i256 = add v0 v1; + v4.i1 = lt v2 v0; + br v4 block1 block2; + + block1: + jump block3; + + block2: + jump block3; + + block3: + v7.i256 = phi (-1.i256 block1) (v2 block2); + return v7; +} + +func private %u256_h3271ca15373d4483_saturatingsub_hd0c1c727e69d9468_saturating_sub(v0.i256, v1.i256) -> i256 { + block0: + v3.i1 = gt v1 v0; + br v3 block1 block2; + + block1: + jump block3; + + block2: + v6.i256 = sub v0 v1; + jump block3; + + block3: + v7.i256 = phi (0.i256 block1) (v6 block2); + return v7; +} + +func private %u256_h3271ca15373d4483_saturatingmul_hf2bc6be7b84ff8f7_saturating_mul(v0.i256, v1.i256) -> i256 { + block0: + v3.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq v0 0.i256; + br v3 block1 block3; + + block1: + jump block7; + + block2: + v6.i256 = mul v0 v1; + (v7.i256, v8.i1) = evm_udivo v6 v0; + br v8 block8 block9; + + block3: + v12.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_eq v1 0.i256; + br v12 block1 block2; + + block4: + jump block6; + + block5: + jump block6; + + block6: + v15.i256 = phi (-1.i256 block4) (v6 block5); + jump block7; + + block7: + v16.i256 = phi (0.i256 block1) (v15 block6); + return v16; + + block8: + evm_revert 0.i256 0.i256; + + block9: + v10.i1 = call %u256_h3271ca15373d4483_eq_he50383edd273619f_ne v7 v1; + br v10 block4 block5; +} + +func private %u64_haee7f05a097ffa16_eq_he50383edd273619f_eq(v0.i64, v1.i64) -> i1 { + block0: + v2.i1 = eq v0 v1; + return v2; +} + +func private %u64_haee7f05a097ffa16_eq_he50383edd273619f_ne(v0.i64, v1.i64) -> i1 { + block0: + v2.i1 = eq v0 v1; + v3.i1 = is_zero v2; + return v3; +} + +func private %u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; + return v2; +} + +func private %u256_h3271ca15373d4483_eq_he50383edd273619f_ne(v0.i256, v1.i256) -> i1 { + block0: + v2.i1 = eq v0 v1; + v3.i1 = is_zero v2; + return v3; +} + +func private %__fe_sonatina_entry() { + block0: + v1.i256 = call %wrapping_ops_u64 0.i64 0.i64; + evm_stop; +} + + +object @Contract { + section runtime { + entry %__fe_sonatina_entry; + } +} diff --git a/crates/codegen/tests/fixtures/sonatina_ir/zero_sized_aggregates.snap b/crates/codegen/tests/fixtures/sonatina_ir/zero_sized_aggregates.snap index 7086f38105..37b862feb2 100644 --- a/crates/codegen/tests/fixtures/sonatina_ir/zero_sized_aggregates.snap +++ b/crates/codegen/tests/fixtures/sonatina_ir/zero_sized_aggregates.snap @@ -10,11 +10,11 @@ type @__fe_Wrap_1 = {unit, i256}; func private %tuple_with_empty() -> i256 { block0: - v2.*@__fe_tuple_0 = alloca @__fe_tuple_0; - v3.i256 = ptr_to_int v2 i256; - v5.*i256 = gep v2 0.i256 1.i256; + v1.*@__fe_tuple_0 = alloca @__fe_tuple_0; + v2.i256 = ptr_to_int v1 i256; + v5.*i256 = gep v1 0.i256 1.i256; mstore v5 5.i256 i256; - v6.*i256 = gep v2 0.i256 1.i256; + v6.*i256 = gep v1 0.i256 1.i256; v7.i256 = mload v6 i256; return v7; } @@ -26,20 +26,20 @@ func private %tuple_only_empty() { func private %struct_with_empty() -> i256 { block0: - v2.*@__fe_Wrap_1 = alloca @__fe_Wrap_1; - v3.i256 = ptr_to_int v2 i256; - v5.*i256 = gep v2 0.i256 1.i256; + v1.*@__fe_Wrap_1 = alloca @__fe_Wrap_1; + v2.i256 = ptr_to_int v1 i256; + v5.*i256 = gep v1 0.i256 1.i256; mstore v5 7.i256 i256; - v6.*i256 = gep v2 0.i256 1.i256; + v6.*i256 = gep v1 0.i256 1.i256; v7.i256 = mload v6 i256; return v7; } func private %empty_field_assign() { block0: - v1.*@__fe_Wrap_1 = alloca @__fe_Wrap_1; - v2.i256 = ptr_to_int v1 i256; - v4.*i256 = gep v1 0.i256 1.i256; + v0.*@__fe_Wrap_1 = alloca @__fe_Wrap_1; + v1.i256 = ptr_to_int v0 i256; + v4.*i256 = gep v0 0.i256 1.i256; mstore v4 1.i256 i256; return; } diff --git a/crates/codegen/tests/fixtures/storage.snap b/crates/codegen/tests/fixtures/storage.snap index e70ae0b4a8..631a7c287d 100644 --- a/crates/codegen/tests/fixtures/storage.snap +++ b/crates/codegen/tests/fixtures/storage.snap @@ -1,6 +1,5 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 33 expression: output input_file: tests/fixtures/storage.fe --- @@ -36,22 +35,60 @@ object "Coin" { ret := v0 leave } + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } + function $checked_sub_u256($a, $b) -> ret { + let v0 := $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0, v1) + let v3 := v2 + if v3 { + revert(0, 0) + } + let v4 := $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + ret := v4 + leave + } function $credit_alice__StorPtr_CoinStore__StorPtr_TotalSupply___c407f5b00af9ba78($amount, $store, $supply) -> ret { let v0 := sload($store) - sstore($store, add(v0, $amount)) - let v1 := sload($supply) - sstore($supply, add(v1, $amount)) - let v2 := sload($store) - ret := v2 + let v1 := $checked_add_u256(v0, $amount) + sstore($store, v1) + let v2 := sload($supply) + let v3 := $checked_add_u256(v2, $amount) + sstore($supply, v3) + let v4 := sload($store) + ret := v4 leave } function $credit_bob__StorPtr_CoinStore__StorPtr_TotalSupply___c407f5b00af9ba78($amount, $store, $supply) -> ret { let v0 := sload(add($store, 1)) - sstore(add($store, 1), add(v0, $amount)) - let v1 := sload($supply) - sstore($supply, add(v1, $amount)) - let v2 := sload(add($store, 1)) - ret := v2 + let v1 := $checked_add_u256(v0, $amount) + sstore(add($store, 1), v1) + let v2 := sload($supply) + let v3 := $checked_add_u256(v2, $amount) + sstore($supply, v3) + let v4 := sload(add($store, 1)) + ret := v4 leave } function $runtime__StorPtr_Evm___207f35a85ac4062e() { @@ -114,7 +151,7 @@ object "Coin" { leave } function $stor_ptr_stor__Evm_hef0af3106e109414_TotalSupply_hddb16bb19b5b088e__f5679b0709de743a($self, $slot) -> ret { - let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__CoinStore_hd26a92ca525e0e79__a9c0a742c4f0cede($slot) + let v0 := $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__TotalSupply_hddb16bb19b5b088e__4092604729aa99eb($slot) ret := v0 leave } @@ -122,6 +159,10 @@ object "Coin" { ret := $raw leave } + function $storptr_t__hc45dea9607fd5340_effecthandle_hfc52f915596f993a_from_raw__TotalSupply_hddb16bb19b5b088e__4092604729aa99eb($raw) -> ret { + ret := $raw + leave + } function $total_supply__StorPtr_TotalSupply___2e654c25952f42f9($supply) -> ret { let v0 := sload($supply) ret := v0 @@ -129,57 +170,63 @@ object "Coin" { } function $transfer_from_alice__StorPtr_CoinStore___ba1c0d0726e89ba2($amount, $store) -> ret { let v0 := sload($store) - let v1 := lt(v0, $amount) - if v1 { - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 + let v1 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt_stor_arg0_root_stor(v0, $amount) + let v2 := v1 + if v2 { + let v3 := mload(0x40) + if iszero(v3) { + v3 := 0x80 } - mstore(0x40, add(v2, 32)) - mstore(v2, 1) - ret := v2 + mstore(0x40, add(v3, 32)) + mstore(v3, 1) + ret := v3 leave } - if iszero(v1) { - let v3 := sload($store) - sstore($store, sub(v3, $amount)) - let v4 := sload(add($store, 1)) - sstore(add($store, 1), add(v4, $amount)) - let v5 := mload(0x40) - if iszero(v5) { - v5 := 0x80 + if iszero(v2) { + let v4 := sload($store) + let v5 := $checked_sub_u256(v4, $amount) + sstore($store, v5) + let v6 := sload(add($store, 1)) + let v7 := $checked_add_u256(v6, $amount) + sstore(add($store, 1), v7) + let v8 := mload(0x40) + if iszero(v8) { + v8 := 0x80 } - mstore(0x40, add(v5, 32)) - mstore(v5, 0) - ret := v5 + mstore(0x40, add(v8, 32)) + mstore(v8, 0) + ret := v8 leave } } function $transfer_from_bob__StorPtr_CoinStore___ba1c0d0726e89ba2($amount, $store) -> ret { let v0 := sload(add($store, 1)) - let v1 := lt(v0, $amount) - if v1 { - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 + let v1 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt_stor_arg0_root_stor(v0, $amount) + let v2 := v1 + if v2 { + let v3 := mload(0x40) + if iszero(v3) { + v3 := 0x80 } - mstore(0x40, add(v2, 32)) - mstore(v2, 1) - ret := v2 + mstore(0x40, add(v3, 32)) + mstore(v3, 1) + ret := v3 leave } - if iszero(v1) { - let v3 := sload(add($store, 1)) - sstore(add($store, 1), sub(v3, $amount)) - let v4 := sload($store) - sstore($store, add(v4, $amount)) - let v5 := mload(0x40) - if iszero(v5) { - v5 := 0x80 + if iszero(v2) { + let v4 := sload(add($store, 1)) + let v5 := $checked_sub_u256(v4, $amount) + sstore(add($store, 1), v5) + let v6 := sload($store) + let v7 := $checked_add_u256(v6, $amount) + sstore($store, v7) + let v8 := mload(0x40) + if iszero(v8) { + v8 := 0x80 } - mstore(0x40, add(v5, 32)) - mstore(v5, 0) - ret := v5 + mstore(0x40, add(v8, 32)) + mstore(v8, 0) + ret := v8 leave } } @@ -198,6 +245,35 @@ object "Coin" { ret := v0 leave } + function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt_stor_arg0_root_stor($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := sub($self, $other) + ret := v0 + leave + } $runtime__StorPtr_Evm___207f35a85ac4062e() return(0, 0) } diff --git a/crates/codegen/tests/fixtures/storage_map_contract.snap b/crates/codegen/tests/fixtures/storage_map_contract.snap index 54647e52e8..39f8b9e8bb 100644 --- a/crates/codegen/tests/fixtures/storage_map_contract.snap +++ b/crates/codegen/tests/fixtures/storage_map_contract.snap @@ -21,6 +21,40 @@ object "BalanceMap" { mstore(v0, $value) return(v0, 32) } + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } + function $checked_sub_u256($a, $b) -> ret { + let v0 := $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0, v1) + let v3 := v2 + if v3 { + revert(0, 0) + } + let v4 := $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + ret := v4 + leave + } function $get_allowance__1_MemPtr_StorageMap_u256__u256__1____7c78a7c6cb7770e1($addr, $allowances) -> ret { let v0 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_1__3c02c0f2b86be0bb($allowances, $addr) ret := v0 @@ -127,27 +161,45 @@ object "BalanceMap" { } mstore(64, add(v0, 0)) let v1 := $u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key(v0, $key) - mstore(add(v0, v1), $salt) - let v2 := add(v1, 32) - let v3 := keccak256(v0, v2) - ret := v3 + let v2 := $checked_add_u256(v0, v1) + mstore(v2, $salt) + let v3 := $checked_add_u256(v1, 32) + let v4 := keccak256(v0, v3) + ret := v4 leave } function $transfer__0_MemPtr_StorageMap_u256__u256__0____a41b2ecb073da43d($from, $to, $amount, $balances) -> ret { let v0 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_0__6a346ad3c930d971($balances, $from) - let v1 := lt(v0, $amount) - if v1 { + let v1 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v0, $amount) + let v2 := v1 + if v2 { ret := 1 leave } - if iszero(v1) { - let v2 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_0__6a346ad3c930d971($balances, $to) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set__u256_u256_0__6a346ad3c930d971($balances, $from, sub(v0, $amount)) - $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set__u256_u256_0__6a346ad3c930d971($balances, $to, add(v2, $amount)) + if iszero(v2) { + let v3 := $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_get__u256_u256_0__6a346ad3c930d971($balances, $to) + let v4 := $checked_sub_u256(v0, $amount) + $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set__u256_u256_0__6a346ad3c930d971($balances, $from, v4) + let v5 := $checked_add_u256(v3, $amount) + $storagemap_k__v__const_salt__u256__h5955888dd44c2a19_set__u256_u256_0__6a346ad3c930d971($balances, $to, v5) ret := 0 leave } } + function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } function $u256_h3271ca15373d4483_storagekey_hf9e3d38a13ff4409_write_key($ptr, $self) -> ret { mstore($ptr, $self) ret := 32 @@ -161,6 +213,16 @@ object "BalanceMap" { ret := $self leave } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := sub($self, $other) + ret := v0 + leave + } $runtime__StorPtr_Evm___207f35a85ac4062e() return(0, 0) } diff --git a/crates/codegen/tests/fixtures/test_output/effect_test.snap b/crates/codegen/tests/fixtures/test_output/effect_test.snap index f77ccfe823..9ced856bb9 100644 --- a/crates/codegen/tests/fixtures/test_output/effect_test.snap +++ b/crates/codegen/tests/fixtures/test_output/effect_test.snap @@ -11,9 +11,41 @@ object "test_test_effect" { object "runtime" { code { + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } function $test_effect__StorPtr_u256___64779554cfbf0358($x) { let v0 := sload($x) - sstore($x, add(v0, 1)) + let v1 := $checked_add_u256(v0, 1) + sstore($x, v1) + leave + } + function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 leave } $test_effect__StorPtr_u256___64779554cfbf0358(0) diff --git a/crates/codegen/tests/fixtures/tstor_ptr_contract.snap b/crates/codegen/tests/fixtures/tstor_ptr_contract.snap index 8ea4e55533..c0e8cc0788 100644 --- a/crates/codegen/tests/fixtures/tstor_ptr_contract.snap +++ b/crates/codegen/tests/fixtures/tstor_ptr_contract.snap @@ -105,11 +105,12 @@ object "GuardContract" { code { function $__GuardContract_recv_0_0($args, $block_reentrance, $call_count) -> ret { let v0 := sload($call_count) - sstore($call_count, add(v0, 1)) - let v1 := iszero(eq(tload($block_reentrance), 0)) - let v2 := v1 - tstore($block_reentrance, iszero(iszero(iszero(v2)))) - ret := v2 + let v1 := $checked_add_u256(v0, 1) + sstore($call_count, v1) + let v2 := iszero(eq(tload($block_reentrance), 0)) + let v3 := v2 + tstore($block_reentrance, iszero(iszero(iszero(v3)))) + ret := v3 leave } function $__GuardContract_runtime() { @@ -139,15 +140,50 @@ object "GuardContract" { } function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len($self) -> ret { let v0 := calldatasize() - ret := sub(v0, $self) + let v1 := $checked_sub_u256(v0, $self) + ret := v1 leave } function $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at($self, $byte_offset) -> ret { - let v0 := add($self, $byte_offset) + let v0 := $checked_add_u256($self, $byte_offset) let v1 := calldataload(v0) ret := v1 leave } + function $checked_add_u256($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_add_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave + } + function $checked_sub_u256($a, $b) -> ret { + let v0 := $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) + ret := v0 + leave + } + function $checked_sub_unsigned_impl__u256__3271ca15373d4483($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($a) + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt(v0, v1) + let v3 := v2 + if v3 { + revert(0, 0) + } + let v4 := $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + ret := v4 + leave + } function $cursor_i__h140a998c67d6d59c_fork__CallData_hf71d505b6ff5dc81__e6d5f05c3478f563($self, $pos) -> ret { let v0 := mload($self) let v1 := mload(0x40) @@ -208,13 +244,14 @@ object "GuardContract" { function $runtime_selector__Evm_hef0af3106e109414_Sol_hfd482bb803ad8c5f__e4e3f8d20b3805a2($self) -> ret { let v0 := $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_input($self) let v1 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_len(v0) - let v2 := lt(v1, 4) - if v2 { + let v2 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, 4) + let v3 := v2 + if v3 { $evm_hef0af3106e109414_contracthost_h57111e7eb283a125_abort($self) } - let v3 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) - let v4 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v3) - ret := v4 + let v4 := $calldata_hf71d505b6ff5dc81_byteinput_hc4c2cb44299530ae_word_at(v0, 0) + let v5 := $sol_hfd482bb803ad8c5f_abi_h2da9a2d0b1ddaeb7_selector_from_prefix(v4) + ret := v5 leave } function $s_h33f7c3322e562590_intdowncast_hf946d58b157999e1_downcast_unchecked__u256_u32__6e3637cd3e911b35($self) -> ret { @@ -256,37 +293,41 @@ object "GuardContract" { function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_finish($self) -> ret { let v0 := mload($self) let v1 := mload(add($self, 64)) - let v2 := mload(0x40) - if iszero(v2) { - v2 := 0x80 + let v2 := $checked_sub_u256(v1, v0) + let v3 := mload(0x40) + if iszero(v3) { + v3 := 0x80 } - mstore(0x40, add(v2, 64)) - mstore(v2, v0) - mstore(add(v2, 32), sub(v1, v0)) - ret := v2 + mstore(0x40, add(v3, 64)) + mstore(v3, v0) + mstore(add(v3, 32), v2) + ret := v3 leave } function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_reserve_head($self, $bytes) -> ret { let v0 := mload($self) - let v1 := eq(v0, 0) - if v1 { - let v2 := mload(64) - if iszero(v2) { - v2 := 0x80 + let v1 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0, 0) + let v2 := v1 + if v2 { + let v3 := mload(64) + if iszero(v3) { + v3 := 0x80 } - mstore(64, add(v2, $bytes)) - mstore($self, v2) - mstore(add($self, 32), v2) - mstore(add($self, 64), add(v2, $bytes)) + mstore(64, add(v3, $bytes)) + mstore($self, v3) + mstore(add($self, 32), v3) + let v4 := $checked_add_u256(v3, $bytes) + mstore(add($self, 64), v4) } - let v3 := mload($self) - ret := v3 + let v5 := mload($self) + ret := v5 leave } function $solencoder_h1b9228b90dad6928_abiencoder_hffd58d20d4321024_write_word($self, $v) { let v0 := mload(add($self, 32)) mstore(v0, $v) - mstore(add($self, 32), add(v0, 32)) + let v1 := $checked_add_u256(v0, 32) + mstore(add($self, 32), v1) leave } function $solencoder_h1b9228b90dad6928_new() -> ret { @@ -314,10 +355,35 @@ object "GuardContract" { ret := $raw leave } + function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave + } function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { ret := $self leave } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_gt($self, $other) -> ret { + let v0 := gt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave + } + function $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := sub($self, $other) + ret := v0 + leave + } function $u32_h20aa0c10687491ad_intword_h9a147c8c32b1323c_from_word($word) -> ret { ret := $word leave diff --git a/crates/codegen/tests/fixtures/tuple_expr.snap b/crates/codegen/tests/fixtures/tuple_expr.snap index 4406357601..b18085f485 100644 --- a/crates/codegen/tests/fixtures/tuple_expr.snap +++ b/crates/codegen/tests/fixtures/tuple_expr.snap @@ -1,17 +1,48 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 33 expression: output input_file: tests/fixtures/tuple_expr.fe --- function $tuple_expr() -> ret { - let v0 := mload(0x40) - if iszero(v0) { - v0 := 0x80 + let v0 := $checked_add_u64(1, 2) + let v1 := mload(0x40) + if iszero(v1) { + v1 := 0x80 } - mstore(0x40, add(v0, 64)) - mstore(v0, and(add(1, 2), 0xffffffffffffffff)) - mstore(add(v0, 32), iszero(iszero(iszero(0)))) + mstore(0x40, add(v1, 64)) + mstore(v1, and(v0, 0xffffffffffffffff)) + mstore(add(v1, 32), iszero(iszero(iszero(0)))) + ret := v1 + leave +} +function $checked_add_u64($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) + ret := v0 + leave +} +function $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) -> ret { + let v0 := $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := and(add(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) ret := v0 leave } diff --git a/crates/codegen/tests/fixtures/unary_expr.fe b/crates/codegen/tests/fixtures/unary_expr.fe index abf8a6727e..6a7bdccbae 100644 --- a/crates/codegen/tests/fixtures/unary_expr.fe +++ b/crates/codegen/tests/fixtures/unary_expr.fe @@ -1,3 +1,3 @@ -pub fn unary_expr() -> u64 { +pub fn unary_expr() -> i64 { -(1 + 2) } diff --git a/crates/codegen/tests/fixtures/unary_expr.snap b/crates/codegen/tests/fixtures/unary_expr.snap index cb588adb15..3888267ca8 100644 --- a/crates/codegen/tests/fixtures/unary_expr.snap +++ b/crates/codegen/tests/fixtures/unary_expr.snap @@ -4,6 +4,106 @@ expression: output input_file: tests/fixtures/unary_expr.fe --- function $unary_expr() -> ret { - ret := sub(0, add(1, 2)) + let v0 := $checked_add_i64(1, 2) + let v1 := $checked_neg_i64(v0) + ret := v1 + leave +} +function $bool_h947c0c03c59c6f07_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq(iszero(iszero($self)), iszero(iszero($other))) + ret := v0 + leave +} +function $bool_h947c0c03c59c6f07_eq_he50383edd273619f_ne($self, $other) -> ret { + let v0 := iszero(eq(iszero(iszero($self)), iszero(iszero($other)))) + ret := v0 + leave +} +function $checked_add_i64($a, $b) -> ret { + let v0 := $checked_add_signed_impl__i64__ba3703df82fb4e98($a, $b) + ret := v0 + leave +} +function $checked_add_signed_impl__i64__ba3703df82fb4e98($a, $b) -> ret { + let v0 := $i64_hba3703df82fb4e98_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := 9223372036854775808 + let v2 := $i64_hba3703df82fb4e98_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(and(v2, v1), 0) + let v4 := v3 + let v5 := $i64_hba3703df82fb4e98_intword_h9a147c8c32b1323c_to_word($b) + let v6 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(and(v5, v1), 0) + let v7 := v6 + let v8 := $i64_hba3703df82fb4e98_intword_h9a147c8c32b1323c_to_word(v0) + let v9 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(and(v8, v1), 0) + let v10 := v9 + let v11 := $bool_h947c0c03c59c6f07_eq_he50383edd273619f_eq(v4, v7) + let v12 := v11 + if v12 { + let v13 := $bool_h947c0c03c59c6f07_eq_he50383edd273619f_ne(v4, v10) + let v14 := v13 + if v14 { + revert(0, 0) + } + ret := v0 + leave + } + if iszero(v12) { + ret := v0 + leave + } +} +function $checked_neg_i64($x) -> ret { + let v0 := $checked_neg_signed_impl__i64__ba3703df82fb4e98($x) + ret := v0 + leave +} +function $checked_neg_signed_impl__i64__ba3703df82fb4e98($x) -> ret { + let v0 := $i64_hba3703df82fb4e98_intword_h9a147c8c32b1323c_from_word(0) + let v1 := $i64_hba3703df82fb4e98_wrappingsub_h6880d1ff91f0a556_wrapping_sub(v0, $x) + let v2 := $i64_hba3703df82fb4e98_intword_h9a147c8c32b1323c_to_word($x) + let v3 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(v2, 0) + let v4 := v3 + if v4 { + let v5 := $i64_hba3703df82fb4e98_intword_h9a147c8c32b1323c_to_word(v1) + let v6 := $i64_hba3703df82fb4e98_intword_h9a147c8c32b1323c_to_word($x) + let v7 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v5, v6) + let v8 := v7 + if v8 { + revert(0, 0) + } + ret := v1 + leave + } + if iszero(v4) { + ret := v1 + leave + } +} +function $i64_hba3703df82fb4e98_intword_h9a147c8c32b1323c_from_word($word) -> ret { + ret := $word + leave +} +function $i64_hba3703df82fb4e98_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $i64_hba3703df82fb4e98_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := signextend(7, and(add(signextend(7, and($self, 0xffffffffffffffff)), signextend(7, and($other, 0xffffffffffffffff))), 0xffffffffffffffff)) + ret := v0 + leave +} +function $i64_hba3703df82fb4e98_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := signextend(7, and(sub(signextend(7, and($self, 0xffffffffffffffff)), signextend(7, and($other, 0xffffffffffffffff))), 0xffffffffffffffff)) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_eq_he50383edd273619f_ne($self, $other) -> ret { + let v0 := iszero(eq($self, $other)) + ret := v0 leave } diff --git a/crates/codegen/tests/fixtures/while.snap b/crates/codegen/tests/fixtures/while.snap index 4c9e1f79e5..ed4589d84f 100644 --- a/crates/codegen/tests/fixtures/while.snap +++ b/crates/codegen/tests/fixtures/while.snap @@ -1,17 +1,54 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 33 expression: output input_file: tests/fixtures/while.fe --- function $do_while() -> ret { let v0 := 0 for { } 1 { } { - if iszero(lt(v0, 10)) { + let v1 := $u64_haee7f05a097ffa16_ord_h264f6d6d75097a_lt(v0, 10) + if iszero(v1) { break } - v0 := add(v0, 1) + let v2 := $checked_add_u64(v0, 1) + v0 := v2 } ret := v0 leave } +function $u64_haee7f05a097ffa16_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)) + ret := v0 + leave +} +function $checked_add_u64($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) + ret := v0 + leave +} +function $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) -> ret { + let v0 := $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := and(add(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 + leave +} diff --git a/crates/codegen/tests/fixtures/while_cond_call.snap b/crates/codegen/tests/fixtures/while_cond_call.snap index e01adb5000..e156adf07c 100644 --- a/crates/codegen/tests/fixtures/while_cond_call.snap +++ b/crates/codegen/tests/fixtures/while_cond_call.snap @@ -1,11 +1,11 @@ --- source: crates/codegen/tests/yul.rs -assertion_line: 33 expression: output input_file: tests/fixtures/while_cond_call.fe --- function $lt_ten($value) -> ret { - ret := lt($value, 10) + let v0 := $u64_haee7f05a097ffa16_ord_h264f6d6d75097a_lt($value, 10) + ret := v0 leave } function $while_cond_call() -> ret { @@ -15,8 +15,45 @@ function $while_cond_call() -> ret { if iszero(v1) { break } - v0 := add(v0, 1) + let v2 := $checked_add_u64(v0, 1) + v0 := v2 } ret := v0 leave } +function $u64_haee7f05a097ffa16_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)) + ret := v0 + leave +} +function $checked_add_u64($a, $b) -> ret { + let v0 := $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) + ret := v0 + leave +} +function $checked_add_unsigned_impl__u64__aee7f05a097ffa16($a, $b) -> ret { + let v0 := $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word(v0) + let v2 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($a) + let v3 := $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt(v1, v2) + let v4 := v3 + if v4 { + revert(0, 0) + } + ret := v0 + leave +} +function $u256_h3271ca15373d4483_ord_h264f6d6d75097a_lt($self, $other) -> ret { + let v0 := lt($self, $other) + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := and(add(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 + leave +} diff --git a/crates/codegen/tests/fixtures/wrapping_saturating.fe b/crates/codegen/tests/fixtures/wrapping_saturating.fe new file mode 100644 index 0000000000..e912044160 --- /dev/null +++ b/crates/codegen/tests/fixtures/wrapping_saturating.fe @@ -0,0 +1,18 @@ +use core::ops::{WrappingAdd, WrappingSub, WrappingMul} +use core::ops::{SaturatingAdd, SaturatingSub, SaturatingMul} + +pub fn wrapping_ops_u64(a: u64, b: u64) -> (u64, u64, u64) { + (a.wrapping_add(b), a.wrapping_sub(b), a.wrapping_mul(b)) +} + +pub fn saturating_ops_u64(a: u64, b: u64) -> (u64, u64, u64) { + (a.saturating_add(b), a.saturating_sub(b), a.saturating_mul(b)) +} + +pub fn wrapping_ops_u256(a: u256, b: u256) -> (u256, u256, u256) { + (a.wrapping_add(b), a.wrapping_sub(b), a.wrapping_mul(b)) +} + +pub fn saturating_ops_u256(a: u256, b: u256) -> (u256, u256, u256) { + (a.saturating_add(b), a.saturating_sub(b), a.saturating_mul(b)) +} diff --git a/crates/codegen/tests/fixtures/wrapping_saturating.snap b/crates/codegen/tests/fixtures/wrapping_saturating.snap new file mode 100644 index 0000000000..323196eab5 --- /dev/null +++ b/crates/codegen/tests/fixtures/wrapping_saturating.snap @@ -0,0 +1,279 @@ +--- +source: crates/codegen/tests/yul.rs +expression: output +input_file: tests/fixtures/wrapping_saturating.fe +--- +function $wrapping_ops_u64($a, $b) -> ret { + let v0 := $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u64_haee7f05a097ffa16_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + let v2 := $u64_haee7f05a097ffa16_wrappingmul_h64e6b83610cda761_wrapping_mul($a, $b) + let v3 := mload(0x40) + if iszero(v3) { + v3 := 0x80 + } + mstore(0x40, add(v3, 96)) + mstore(v3, and(v0, 0xffffffffffffffff)) + mstore(add(v3, 32), and(v1, 0xffffffffffffffff)) + mstore(add(v3, 64), and(v2, 0xffffffffffffffff)) + ret := v3 + leave +} +function $saturating_ops_u64($a, $b) -> ret { + let v0 := $u64_haee7f05a097ffa16_saturatingadd_h7ca6e43aca8f23bb_saturating_add($a, $b) + let v1 := $u64_haee7f05a097ffa16_saturatingsub_hd0c1c727e69d9468_saturating_sub($a, $b) + let v2 := $u64_haee7f05a097ffa16_saturatingmul_hf2bc6be7b84ff8f7_saturating_mul($a, $b) + let v3 := mload(0x40) + if iszero(v3) { + v3 := 0x80 + } + mstore(0x40, add(v3, 96)) + mstore(v3, and(v0, 0xffffffffffffffff)) + mstore(add(v3, 32), and(v1, 0xffffffffffffffff)) + mstore(add(v3, 64), and(v2, 0xffffffffffffffff)) + ret := v3 + leave +} +function $wrapping_ops_u256($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($a, $b) + let v1 := $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($a, $b) + let v2 := $u256_h3271ca15373d4483_wrappingmul_h64e6b83610cda761_wrapping_mul($a, $b) + let v3 := mload(0x40) + if iszero(v3) { + v3 := 0x80 + } + mstore(0x40, add(v3, 96)) + mstore(v3, v0) + mstore(add(v3, 32), v1) + mstore(add(v3, 64), v2) + ret := v3 + leave +} +function $saturating_ops_u256($a, $b) -> ret { + let v0 := $u256_h3271ca15373d4483_saturatingadd_h7ca6e43aca8f23bb_saturating_add($a, $b) + let v1 := $u256_h3271ca15373d4483_saturatingsub_hd0c1c727e69d9468_saturating_sub($a, $b) + let v2 := $u256_h3271ca15373d4483_saturatingmul_hf2bc6be7b84ff8f7_saturating_mul($a, $b) + let v3 := mload(0x40) + if iszero(v3) { + v3 := 0x80 + } + mstore(0x40, add(v3, 96)) + mstore(v3, v0) + mstore(add(v3, 32), v1) + mstore(add(v3, 64), v2) + ret := v3 + leave +} +function $u64_haee7f05a097ffa16_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := and(add(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := and(sub(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_wrappingmul_h64e6b83610cda761_wrapping_mul($self, $other) -> ret { + let v0 := and(mul(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_saturatingadd_h7ca6e43aca8f23bb_saturating_add($self, $other) -> ret { + let v0 := and(add(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + let v1 := 0 + let v2 := lt(and(v0, 0xffffffffffffffff), and($self, 0xffffffffffffffff)) + let v3 := v2 + if v3 { + v1 := 18446744073709551615 + } + if iszero(v3) { + v1 := v0 + } + ret := v1 + leave +} +function $u64_haee7f05a097ffa16_saturatingsub_hd0c1c727e69d9468_saturating_sub($self, $other) -> ret { + let v0 := 0 + let v1 := gt(and($other, 0xffffffffffffffff), and($self, 0xffffffffffffffff)) + let v2 := v1 + if v2 { + v0 := 0 + } + if iszero(v2) { + let v3 := and(sub(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + v0 := v3 + } + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_saturatingmul_hf2bc6be7b84ff8f7_saturating_mul($self, $other) -> ret { + let v0 := 0 + let v1 := $u64_haee7f05a097ffa16_eq_he50383edd273619f_eq($self, 0) + let v2 := v1 + if v2 { + v0 := 0 + ret := v0 + leave + } + if iszero(v2) { + let v3 := $u64_haee7f05a097ffa16_eq_he50383edd273619f_eq($other, 0) + let v4 := v3 + if v4 { + v0 := 0 + ret := v0 + leave + } + if iszero(v4) { + let v5 := and(mul(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)), 0xffffffffffffffff) + let v6 := 0 + let v7 := $checked_div_u64(v5, $self) + let v8 := $u64_haee7f05a097ffa16_eq_he50383edd273619f_ne(v7, $other) + let v9 := v8 + if v9 { + v6 := 18446744073709551615 + } + if iszero(v9) { + v6 := v5 + } + v0 := v6 + ret := v0 + leave + } + } +} +function $u256_h3271ca15373d4483_wrappingadd_h14afa79b3047617f_wrapping_add($self, $other) -> ret { + let v0 := add($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_wrappingsub_h6880d1ff91f0a556_wrapping_sub($self, $other) -> ret { + let v0 := sub($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_wrappingmul_h64e6b83610cda761_wrapping_mul($self, $other) -> ret { + let v0 := mul($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_saturatingadd_h7ca6e43aca8f23bb_saturating_add($self, $other) -> ret { + let v0 := add($self, $other) + let v1 := 0 + let v2 := lt(v0, $self) + let v3 := v2 + if v3 { + v1 := 115792089237316195423570985008687907853269984665640564039457584007913129639935 + } + if iszero(v3) { + v1 := v0 + } + ret := v1 + leave +} +function $u256_h3271ca15373d4483_saturatingsub_hd0c1c727e69d9468_saturating_sub($self, $other) -> ret { + let v0 := 0 + let v1 := gt($other, $self) + let v2 := v1 + if v2 { + v0 := 0 + } + if iszero(v2) { + let v3 := sub($self, $other) + v0 := v3 + } + ret := v0 + leave +} +function $u256_h3271ca15373d4483_saturatingmul_hf2bc6be7b84ff8f7_saturating_mul($self, $other) -> ret { + let v0 := 0 + let v1 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, 0) + let v2 := v1 + if v2 { + v0 := 0 + ret := v0 + leave + } + if iszero(v2) { + let v3 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($other, 0) + let v4 := v3 + if v4 { + v0 := 0 + ret := v0 + leave + } + if iszero(v4) { + let v5 := mul($self, $other) + let v6 := 0 + let v7 := $checked_div_u256(v5, $self) + let v8 := $u256_h3271ca15373d4483_eq_he50383edd273619f_ne(v7, $other) + let v9 := v8 + if v9 { + v6 := 115792089237316195423570985008687907853269984665640564039457584007913129639935 + } + if iszero(v9) { + v6 := v5 + } + v0 := v6 + ret := v0 + leave + } + } +} +function $u64_haee7f05a097ffa16_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff)) + ret := v0 + leave +} +function $u64_haee7f05a097ffa16_eq_he50383edd273619f_ne($self, $other) -> ret { + let v0 := iszero(eq(and($self, 0xffffffffffffffff), and($other, 0xffffffffffffffff))) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_eq_he50383edd273619f_eq($self, $other) -> ret { + let v0 := eq($self, $other) + ret := v0 + leave +} +function $u256_h3271ca15373d4483_eq_he50383edd273619f_ne($self, $other) -> ret { + let v0 := iszero(eq($self, $other)) + ret := v0 + leave +} +function $checked_div_u256($a, $b) -> ret { + $ensure_nonzero_divisor__u256__3271ca15373d4483($b) + let v0 := div($a, $b) + ret := v0 + leave +} +function $checked_div_u64($a, $b) -> ret { + $ensure_nonzero_divisor__u64__aee7f05a097ffa16($b) + let v0 := and(div(and($a, 0xffffffffffffffff), and($b, 0xffffffffffffffff)), 0xffffffffffffffff) + ret := v0 + leave +} +function $ensure_nonzero_divisor__u256__3271ca15373d4483($b) { + let v0 := $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0, 0) + let v2 := v1 + if v2 { + revert(0, 0) + } + leave +} +function $ensure_nonzero_divisor__u64__aee7f05a097ffa16($b) { + let v0 := $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($b) + let v1 := $u256_h3271ca15373d4483_eq_he50383edd273619f_eq(v0, 0) + let v2 := v1 + if v2 { + revert(0, 0) + } + leave +} +function $u256_h3271ca15373d4483_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} +function $u64_haee7f05a097ffa16_intword_h9a147c8c32b1323c_to_word($self) -> ret { + ret := $self + leave +} diff --git a/crates/codegen/tests/sonatina_operand_collect.rs b/crates/codegen/tests/sonatina_operand_collect.rs index 807372afab..dd7119f4b0 100644 --- a/crates/codegen/tests/sonatina_operand_collect.rs +++ b/crates/codegen/tests/sonatina_operand_collect.rs @@ -1,5 +1,5 @@ use sonatina_ir::{ - I256, Signature, Type, ValueId, + I256, Signature, ValueId, builder::ModuleBuilder, func_cursor::InstInserter, inst::{Inst, evm::EvmCreate2}, @@ -33,7 +33,7 @@ fn make_imm_value_is_interned() { let ctx = sonatina_ir::module::ModuleCtx::new(&isa); let builder = ModuleBuilder::new(ctx); - let sig = Signature::new("f", sonatina_ir::Linkage::Public, &[], Type::Unit); + let sig = Signature::new("f", sonatina_ir::Linkage::Public, &[], &[]); let func_ref = builder.declare_function(sig).unwrap(); let mut fb = builder.func_builder::(func_ref); let entry = fb.append_block(); diff --git a/crates/fe/tests/fixtures/build_foundry/erc20.fe b/crates/fe/tests/fixtures/build_foundry/erc20.fe index 5738c779d2..91225df90a 100644 --- a/crates/fe/tests/fixtures/build_foundry/erc20.fe +++ b/crates/fe/tests/fixtures/build_foundry/erc20.fe @@ -91,7 +91,7 @@ pub contract CoolCoin uses (ctx: Ctx, log: mut Log) { recv Erc20Extended { Mint { to, amount } -> bool uses (mut store, mut log) { - store.total_supply += amount + store.total_supply = store.total_supply + amount store.balances.set(key: to, value: store.balances.get(key: to) + amount) emit_transfer(from: Address::zero(), to: to, value: amount) return true diff --git a/crates/fe/tests/fixtures/fe_test/aug_assign_traits.fe b/crates/fe/tests/fixtures/fe_test/aug_assign_traits.fe new file mode 100644 index 0000000000..32fdfcf468 --- /dev/null +++ b/crates/fe/tests/fixtures/fe_test/aug_assign_traits.fe @@ -0,0 +1,52 @@ +use std::evm::effects::assert +use core::ops::{Add, AddAssign} + +struct OnlyAssign { + value: u8, +} + +impl Copy for OnlyAssign {} + +impl AddAssign for OnlyAssign { + fn add_assign(mut self, _ other: own OnlyAssign) { + self.value = self.value + other.value + 1 + } +} + +struct Divergent { + value: u8, +} + +impl Copy for Divergent {} + +impl Add for Divergent { + fn add(own self, _ other: own Divergent) -> Divergent { + Divergent { value: 99 } + } +} + +impl AddAssign for Divergent { + fn add_assign(mut self, _ other: own Divergent) { + self.value = 7 + } +} + +#[test] +fn add_assign_without_add_trait() { + let mut x = OnlyAssign { value: 1 } + let y = OnlyAssign { value: 2 } + x += y + assert(x.value == 4) +} + +#[test] +fn aug_assign_prefers_add_assign_semantics() { + let mut x = Divergent { value: 1 } + let y = Divergent { value: 2 } + x += y + assert(x.value == 7) + + let z = Divergent { value: 2 } + let sum = x + z + assert(sum.value == 99) +} diff --git a/crates/fe/tests/fixtures/fe_test/bool_not_trait_call.fe b/crates/fe/tests/fixtures/fe_test/bool_not_trait_call.fe new file mode 100644 index 0000000000..47589f4cb5 --- /dev/null +++ b/crates/fe/tests/fixtures/fe_test/bool_not_trait_call.fe @@ -0,0 +1,14 @@ +use core::ops::Not +use std::evm::effects::assert + +#[test] +fn bool_not_trait_call() { + let t = true + let f = false + + let not_t = t.not() + let not_f = f.not() + + assert(not_t == false) + assert(not_f == true) +} diff --git a/crates/fe/tests/fixtures/fe_test/checked_arithmetic_matrix.fe b/crates/fe/tests/fixtures/fe_test/checked_arithmetic_matrix.fe new file mode 100644 index 0000000000..50127cadfc --- /dev/null +++ b/crates/fe/tests/fixtures/fe_test/checked_arithmetic_matrix.fe @@ -0,0 +1,715 @@ +use std::evm::effects::assert + +// ===================================================================== +// u8 / i8 +// ===================================================================== + +#[test(should_revert)] +fn unsigned_add_overflow_u8() { + let x: u8 = 255 + let y: u8 = x + 1 +} + +#[test(should_revert)] +fn unsigned_sub_underflow_u8() { + let a: u8 = 0 + let b: u8 = 1 + let c: u8 = a - b +} + +#[test(should_revert)] +fn unsigned_mul_overflow_u8() { + let a: u8 = 16 + let b: u8 = 16 + let c: u8 = a * b +} + +#[test(should_revert)] +fn unsigned_div_by_zero_u8() { + let a: u8 = 1 + let b: u8 = a / 0 +} + +#[test(should_revert)] +fn unsigned_rem_by_zero_u8() { + let a: u8 = 1 + let b: u8 = a % 0 +} + +#[test(should_revert)] +fn unsigned_pow_overflow_u8() { + let x: u8 = 2 + let y: u8 = x ** 8 +} + +#[test] +fn unsigned_happy_path_u8() { + let a: u8 = 12 + let b: u8 = 10 + let c: u8 = 5 + let p: u8 = 3 + assert(a + b == 22) + assert(a - b == 2) + assert(a * b == 120) + assert(a / c == 2) + assert(a % c == 2) + assert(p ** 4 == 81) +} + +#[test(should_revert)] +fn signed_add_overflow_i8() { + let x: i8 = 127 + let y: i8 = x + 1 +} + +#[test(should_revert)] +fn signed_sub_overflow_i8() { + let x: i8 = -128 + let y: i8 = x - 1 +} + +#[test(should_revert)] +fn signed_mul_overflow_min_neg1_i8() { + let min: i8 = -128 + let y: i8 = min * -1 +} + +#[test(should_revert)] +fn signed_neg_overflow_i8() { + let x: i8 = -128 + let y: i8 = -x +} + +#[test(should_revert)] +fn signed_div_by_zero_i8() { + let a: i8 = 1 + let b: i8 = a / 0 +} + +#[test(should_revert)] +fn signed_div_overflow_min_neg1_i8() { + let min: i8 = -128 + let y: i8 = min / -1 +} + +#[test(should_revert)] +fn signed_rem_by_zero_i8() { + let a: i8 = 1 + let b: i8 = a % 0 +} + +#[test(should_revert)] +fn signed_pow_overflow_i8() { + let x: i8 = 2 + let y: i8 = x ** 7 +} + +#[test] +fn signed_happy_path_i8() { + let a: i8 = -12 + let b: i8 = 10 + let c: i8 = 5 + let p: i8 = 3 + assert(a + b == -2) + assert(a - b == -22) + assert(a * b == -120) + assert(a / c == -2) + assert(a % c == -2) + assert(-a == 12) + assert(p ** 4 == 81) +} + +// ===================================================================== +// u16 / i16 +// ===================================================================== + +#[test(should_revert)] +fn unsigned_add_overflow_u16() { + let x: u16 = 65535 + let y: u16 = x + 1 +} + +#[test(should_revert)] +fn unsigned_sub_underflow_u16() { + let a: u16 = 0 + let b: u16 = 1 + let c: u16 = a - b +} + +#[test(should_revert)] +fn unsigned_mul_overflow_u16() { + let a: u16 = 256 + let b: u16 = 256 + let c: u16 = a * b +} + +#[test(should_revert)] +fn unsigned_div_by_zero_u16() { + let a: u16 = 1 + let b: u16 = a / 0 +} + +#[test(should_revert)] +fn unsigned_rem_by_zero_u16() { + let a: u16 = 1 + let b: u16 = a % 0 +} + +#[test(should_revert)] +fn unsigned_pow_overflow_u16() { + let x: u16 = 2 + let y: u16 = x ** 16 +} + +#[test] +fn unsigned_happy_path_u16() { + let a: u16 = 12 + let b: u16 = 10 + let c: u16 = 5 + let p: u16 = 3 + assert(a + b == 22) + assert(a - b == 2) + assert(a * b == 120) + assert(a / c == 2) + assert(a % c == 2) + assert(p ** 4 == 81) +} + +#[test(should_revert)] +fn signed_add_overflow_i16() { + let x: i16 = 32767 + let y: i16 = x + 1 +} + +#[test(should_revert)] +fn signed_sub_overflow_i16() { + let x: i16 = -32768 + let y: i16 = x - 1 +} + +#[test(should_revert)] +fn signed_mul_overflow_min_neg1_i16() { + let min: i16 = -32768 + let y: i16 = min * -1 +} + +#[test(should_revert)] +fn signed_neg_overflow_i16() { + let x: i16 = -32768 + let y: i16 = -x +} + +#[test(should_revert)] +fn signed_div_by_zero_i16() { + let a: i16 = 1 + let b: i16 = a / 0 +} + +#[test(should_revert)] +fn signed_div_overflow_min_neg1_i16() { + let min: i16 = -32768 + let y: i16 = min / -1 +} + +#[test(should_revert)] +fn signed_rem_by_zero_i16() { + let a: i16 = 1 + let b: i16 = a % 0 +} + +#[test(should_revert)] +fn signed_pow_overflow_i16() { + let x: i16 = 2 + let y: i16 = x ** 15 +} + +#[test] +fn signed_happy_path_i16() { + let a: i16 = -12 + let b: i16 = 10 + let c: i16 = 5 + let p: i16 = 3 + assert(a + b == -2) + assert(a - b == -22) + assert(a * b == -120) + assert(a / c == -2) + assert(a % c == -2) + assert(-a == 12) + assert(p ** 4 == 81) +} + +// ===================================================================== +// u32 / i32 +// ===================================================================== + +#[test(should_revert)] +fn unsigned_add_overflow_u32() { + let x: u32 = 4294967295 + let y: u32 = x + 1 +} + +#[test(should_revert)] +fn unsigned_sub_underflow_u32() { + let a: u32 = 0 + let b: u32 = 1 + let c: u32 = a - b +} + +#[test(should_revert)] +fn unsigned_mul_overflow_u32() { + let a: u32 = 65536 + let b: u32 = 65536 + let c: u32 = a * b +} + +#[test(should_revert)] +fn unsigned_div_by_zero_u32() { + let a: u32 = 1 + let b: u32 = a / 0 +} + +#[test(should_revert)] +fn unsigned_rem_by_zero_u32() { + let a: u32 = 1 + let b: u32 = a % 0 +} + +#[test(should_revert)] +fn unsigned_pow_overflow_u32() { + let x: u32 = 2 + let y: u32 = x ** 32 +} + +#[test] +fn unsigned_happy_path_u32() { + let a: u32 = 12 + let b: u32 = 10 + let c: u32 = 5 + let p: u32 = 3 + assert(a + b == 22) + assert(a - b == 2) + assert(a * b == 120) + assert(a / c == 2) + assert(a % c == 2) + assert(p ** 4 == 81) +} + +#[test(should_revert)] +fn signed_add_overflow_i32() { + let x: i32 = 2147483647 + let y: i32 = x + 1 +} + +#[test(should_revert)] +fn signed_sub_overflow_i32() { + let x: i32 = -2147483648 + let y: i32 = x - 1 +} + +#[test(should_revert)] +fn signed_mul_overflow_min_neg1_i32() { + let min: i32 = -2147483648 + let y: i32 = min * -1 +} + +#[test(should_revert)] +fn signed_neg_overflow_i32() { + let x: i32 = -2147483648 + let y: i32 = -x +} + +#[test(should_revert)] +fn signed_div_by_zero_i32() { + let a: i32 = 1 + let b: i32 = a / 0 +} + +#[test(should_revert)] +fn signed_div_overflow_min_neg1_i32() { + let min: i32 = -2147483648 + let y: i32 = min / -1 +} + +#[test(should_revert)] +fn signed_rem_by_zero_i32() { + let a: i32 = 1 + let b: i32 = a % 0 +} + +#[test(should_revert)] +fn signed_pow_overflow_i32() { + let x: i32 = 2 + let y: i32 = x ** 31 +} + +#[test] +fn signed_happy_path_i32() { + let a: i32 = -12 + let b: i32 = 10 + let c: i32 = 5 + let p: i32 = 3 + assert(a + b == -2) + assert(a - b == -22) + assert(a * b == -120) + assert(a / c == -2) + assert(a % c == -2) + assert(-a == 12) + assert(p ** 4 == 81) +} + +// ===================================================================== +// u64 / i64 +// ===================================================================== + +#[test(should_revert)] +fn unsigned_add_overflow_u64() { + let x: u64 = 18446744073709551615 + let y: u64 = x + 1 +} + +#[test(should_revert)] +fn unsigned_sub_underflow_u64() { + let a: u64 = 0 + let b: u64 = 1 + let c: u64 = a - b +} + +#[test(should_revert)] +fn unsigned_mul_overflow_u64() { + let a: u64 = 4294967296 + let b: u64 = 4294967296 + let c: u64 = a * b +} + +#[test(should_revert)] +fn unsigned_div_by_zero_u64() { + let a: u64 = 1 + let b: u64 = a / 0 +} + +#[test(should_revert)] +fn unsigned_rem_by_zero_u64() { + let a: u64 = 1 + let b: u64 = a % 0 +} + +#[test(should_revert)] +fn unsigned_pow_overflow_u64() { + let x: u64 = 2 + let y: u64 = x ** 64 +} + +#[test] +fn unsigned_happy_path_u64() { + let a: u64 = 12 + let b: u64 = 10 + let c: u64 = 5 + let p: u64 = 3 + assert(a + b == 22) + assert(a - b == 2) + assert(a * b == 120) + assert(a / c == 2) + assert(a % c == 2) + assert(p ** 4 == 81) +} + +#[test(should_revert)] +fn signed_add_overflow_i64() { + let x: i64 = 9223372036854775807 + let y: i64 = x + 1 +} + +#[test(should_revert)] +fn signed_sub_overflow_i64() { + let x: i64 = -9223372036854775808 + let y: i64 = x - 1 +} + +#[test(should_revert)] +fn signed_mul_overflow_min_neg1_i64() { + let min: i64 = -9223372036854775808 + let y: i64 = min * -1 +} + +#[test(should_revert)] +fn signed_neg_overflow_i64() { + let x: i64 = -9223372036854775808 + let y: i64 = -x +} + +#[test(should_revert)] +fn signed_div_by_zero_i64() { + let a: i64 = 1 + let b: i64 = a / 0 +} + +#[test(should_revert)] +fn signed_div_overflow_min_neg1_i64() { + let min: i64 = -9223372036854775808 + let y: i64 = min / -1 +} + +#[test(should_revert)] +fn signed_rem_by_zero_i64() { + let a: i64 = 1 + let b: i64 = a % 0 +} + +#[test(should_revert)] +fn signed_pow_overflow_i64() { + let x: i64 = 2 + let y: i64 = x ** 63 +} + +#[test] +fn signed_happy_path_i64() { + let a: i64 = -12 + let b: i64 = 10 + let c: i64 = 5 + let p: i64 = 3 + assert(a + b == -2) + assert(a - b == -22) + assert(a * b == -120) + assert(a / c == -2) + assert(a % c == -2) + assert(-a == 12) + assert(p ** 4 == 81) +} + +// ===================================================================== +// u128 / i128 +// ===================================================================== + +#[test(should_revert)] +fn unsigned_add_overflow_u128() { + let x: u128 = 340282366920938463463374607431768211455 + let y: u128 = x + 1 +} + +#[test(should_revert)] +fn unsigned_sub_underflow_u128() { + let a: u128 = 0 + let b: u128 = 1 + let c: u128 = a - b +} + +#[test(should_revert)] +fn unsigned_mul_overflow_u128() { + let a: u128 = 18446744073709551616 + let b: u128 = 18446744073709551616 + let c: u128 = a * b +} + +#[test(should_revert)] +fn unsigned_div_by_zero_u128() { + let a: u128 = 1 + let b: u128 = a / 0 +} + +#[test(should_revert)] +fn unsigned_rem_by_zero_u128() { + let a: u128 = 1 + let b: u128 = a % 0 +} + +#[test(should_revert)] +fn unsigned_pow_overflow_u128() { + let x: u128 = 2 + let y: u128 = x ** 128 +} + +#[test] +fn unsigned_happy_path_u128() { + let a: u128 = 12 + let b: u128 = 10 + let c: u128 = 5 + let p: u128 = 3 + assert(a + b == 22) + assert(a - b == 2) + assert(a * b == 120) + assert(a / c == 2) + assert(a % c == 2) + assert(p ** 4 == 81) +} + +#[test(should_revert)] +fn signed_add_overflow_i128() { + let x: i128 = 170141183460469231731687303715884105727 + let y: i128 = x + 1 +} + +#[test(should_revert)] +fn signed_sub_overflow_i128() { + let x: i128 = -170141183460469231731687303715884105728 + let y: i128 = x - 1 +} + +#[test(should_revert)] +fn signed_mul_overflow_min_neg1_i128() { + let min: i128 = -170141183460469231731687303715884105728 + let y: i128 = min * -1 +} + +#[test(should_revert)] +fn signed_neg_overflow_i128() { + let x: i128 = -170141183460469231731687303715884105728 + let y: i128 = -x +} + +#[test(should_revert)] +fn signed_div_by_zero_i128() { + let a: i128 = 1 + let b: i128 = a / 0 +} + +#[test(should_revert)] +fn signed_div_overflow_min_neg1_i128() { + let min: i128 = -170141183460469231731687303715884105728 + let y: i128 = min / -1 +} + +#[test(should_revert)] +fn signed_rem_by_zero_i128() { + let a: i128 = 1 + let b: i128 = a % 0 +} + +#[test(should_revert)] +fn signed_pow_overflow_i128() { + let x: i128 = 2 + let y: i128 = x ** 127 +} + +#[test] +fn signed_happy_path_i128() { + let a: i128 = -12 + let b: i128 = 10 + let c: i128 = 5 + let p: i128 = 3 + assert(a + b == -2) + assert(a - b == -22) + assert(a * b == -120) + assert(a / c == -2) + assert(a % c == -2) + assert(-a == 12) + assert(p ** 4 == 81) +} + +// ===================================================================== +// u256 / i256 +// ===================================================================== + +#[test(should_revert)] +fn unsigned_add_overflow_u256() { + let x: u256 = 115792089237316195423570985008687907853269984665640564039457584007913129639935 + let y: u256 = x + 1 +} + +#[test(should_revert)] +fn unsigned_sub_underflow_u256() { + let a: u256 = 0 + let b: u256 = 1 + let c: u256 = a - b +} + +#[test(should_revert)] +fn unsigned_mul_overflow_u256() { + let a: u256 = 340282366920938463463374607431768211456 + let b: u256 = 340282366920938463463374607431768211456 + let c: u256 = a * b +} + +#[test(should_revert)] +fn unsigned_div_by_zero_u256() { + let a: u256 = 1 + let b: u256 = a / 0 +} + +#[test(should_revert)] +fn unsigned_rem_by_zero_u256() { + let a: u256 = 1 + let b: u256 = a % 0 +} + +#[test(should_revert)] +fn unsigned_pow_overflow_u256() { + let x: u256 = 2 + let y: u256 = x ** 256 +} + +#[test] +fn unsigned_happy_path_u256() { + let a: u256 = 12 + let b: u256 = 10 + let c: u256 = 5 + let p: u256 = 3 + assert(a + b == 22) + assert(a - b == 2) + assert(a * b == 120) + assert(a / c == 2) + assert(a % c == 2) + assert(p ** 4 == 81) +} + +#[test(should_revert)] +fn signed_add_overflow_i256() { + let x: i256 = 57896044618658097711785492504343953926634992332820282019728792003956564819967 + let y: i256 = x + 1 +} + +#[test(should_revert)] +fn signed_sub_overflow_i256() { + let x: i256 = -57896044618658097711785492504343953926634992332820282019728792003956564819968 + let y: i256 = x - 1 +} + +#[test(should_revert)] +fn signed_mul_overflow_min_neg1_i256() { + let min: i256 = -57896044618658097711785492504343953926634992332820282019728792003956564819968 + let y: i256 = min * -1 +} + +#[test(should_revert)] +fn signed_neg_overflow_i256() { + let x: i256 = -57896044618658097711785492504343953926634992332820282019728792003956564819968 + let y: i256 = -x +} + +#[test(should_revert)] +fn signed_div_by_zero_i256() { + let a: i256 = 1 + let b: i256 = a / 0 +} + +#[test(should_revert)] +fn signed_div_overflow_min_neg1_i256() { + let min: i256 = -57896044618658097711785492504343953926634992332820282019728792003956564819968 + let y: i256 = min / -1 +} + +#[test(should_revert)] +fn signed_rem_by_zero_i256() { + let a: i256 = 1 + let b: i256 = a % 0 +} + +#[test(should_revert)] +fn signed_pow_overflow_i256() { + let x: i256 = 2 + let y: i256 = x ** 255 +} + +#[test] +fn signed_happy_path_i256() { + let a: i256 = -12 + let b: i256 = 10 + let c: i256 = 5 + let p: i256 = 3 + assert(a + b == -2) + assert(a - b == -22) + assert(a * b == -120) + assert(a / c == -2) + assert(a % c == -2) + assert(-a == 12) + assert(p ** 4 == 81) +} diff --git a/crates/fe/tests/fixtures/fe_test/checked_arithmetic_methods.fe b/crates/fe/tests/fixtures/fe_test/checked_arithmetic_methods.fe new file mode 100644 index 0000000000..46a3a9d36e --- /dev/null +++ b/crates/fe/tests/fixtures/fe_test/checked_arithmetic_methods.fe @@ -0,0 +1,56 @@ +use std::evm::effects::assert +use core::ops::{ + SaturatingAdd, SaturatingMul, SaturatingSub, WrappingAdd, WrappingMul, WrappingSub, +} + +// ===================================================================== +// Unsigned wrapping and saturating methods +// ===================================================================== + +#[test] +fn wrapping_unsigned_u8() { + let max: u8 = 255 + let zero: u8 = 0 + let sixteen: u8 = 16 + + assert(max.wrapping_add(1) == 0) + assert(zero.wrapping_sub(1) == 255) + assert(sixteen.wrapping_mul(sixteen) == 0) +} + +#[test] +fn saturating_unsigned_u8() { + let max: u8 = 255 + let zero: u8 = 0 + let sixteen: u8 = 16 + + assert(max.saturating_add(1) == 255) + assert(zero.saturating_sub(1) == 0) + assert(sixteen.saturating_mul(sixteen) == 255) +} + +// ===================================================================== +// Signed wrapping and saturating methods +// ===================================================================== + +#[test] +fn wrapping_signed_i8() { + let max: i8 = 127 + let min: i8 = -128 + let sixty_four: i8 = 64 + + assert(max.wrapping_add(1) == -128) + assert(min.wrapping_sub(1) == 127) + assert(sixty_four.wrapping_mul(4) == 0) +} + +#[test] +fn saturating_signed_i8() { + let max: i8 = 127 + let min: i8 = -128 + let sixty_four: i8 = 64 + + assert(max.saturating_add(1) == 127) + assert(min.saturating_sub(1) == -128) + assert(sixty_four.saturating_mul(4) == 127) +} diff --git a/crates/fe/tests/fixtures/fe_test/checked_arithmetic_regressions.fe b/crates/fe/tests/fixtures/fe_test/checked_arithmetic_regressions.fe new file mode 100644 index 0000000000..4cec3c8e37 --- /dev/null +++ b/crates/fe/tests/fixtures/fe_test/checked_arithmetic_regressions.fe @@ -0,0 +1,113 @@ +use std::evm::effects::assert + +fn add_assign_overflow_u8(v: mut u8) { + v += 1 +} + +fn sub_assign_underflow_u8(v: mut u8) { + v -= 1 +} + +fn mul_assign_overflow_u8(v: mut u8) { + v *= 16 +} + +fn div_assign_zero_u8(v: mut u8) { + v /= 0 +} + +fn rem_assign_zero_u8(v: mut u8) { + v %= 0 +} + +fn pow_assign_overflow_u8(v: mut u8) { + v **= 8 +} + +// ===================================================================== +// Assignment operator regressions +// ===================================================================== + +#[test(should_revert)] +fn add_assign_overflow_u8_reverts() { + let mut x: u8 = 255 + add_assign_overflow_u8(mut x) +} + +#[test(should_revert)] +fn sub_assign_underflow_u8_reverts() { + let mut x: u8 = 0 + sub_assign_underflow_u8(mut x) +} + +#[test(should_revert)] +fn mul_assign_overflow_u8_reverts() { + let mut x: u8 = 16 + mul_assign_overflow_u8(mut x) +} + +#[test(should_revert)] +fn div_assign_zero_u8_reverts() { + let mut x: u8 = 1 + div_assign_zero_u8(mut x) +} + +#[test(should_revert)] +fn rem_assign_zero_u8_reverts() { + let mut x: u8 = 1 + rem_assign_zero_u8(mut x) +} + +#[test(should_revert)] +fn pow_assign_overflow_u8_reverts() { + let mut x: u8 = 2 + pow_assign_overflow_u8(mut x) +} + +// ===================================================================== +// Expression-shape regressions +// ===================================================================== + +#[test(should_revert)] +fn signed_add_neg_overflow_i8() { + let a: i8 = -100 + let b: i8 = -100 + let c: i8 = a + b +} + +#[test(should_revert)] +fn signed_sub_pos_overflow_i8() { + let a: i8 = 100 + let b: i8 = -100 + let c: i8 = a - b +} + +#[test(should_revert)] +fn signed_mul_overflow_i8_literal_literal() { + let x: i8 = -1 * -128 +} + +#[test(should_revert)] +fn signed_mul_overflow_i8_lhs_literal() { + let min: i8 = -128 + let y: i8 = -1 * min +} + +#[test(should_revert)] +fn signed_mul_overflow_i8_rhs_literal() { + let min: i8 = -128 + let y: i8 = min * -1 +} + +#[test(should_revert)] +fn signed_pow_negative_exp_i8() { + let x: i8 = 2 + let y: i8 = x ** -1 +} + +#[test] +fn signed_mul_no_overflow_i8_neg_neg() { + let a: i8 = -6 + let b: i8 = -3 + assert(a * b == 18) +} diff --git a/crates/fe/tests/fixtures/fe_test/signed_arithmetic.fe b/crates/fe/tests/fixtures/fe_test/signed_arithmetic.fe new file mode 100644 index 0000000000..1bae24816b --- /dev/null +++ b/crates/fe/tests/fixtures/fe_test/signed_arithmetic.fe @@ -0,0 +1,100 @@ +use std::evm::effects::assert + +// ===================================================================== +// Division and remainder semantics +// ===================================================================== + +#[test] +fn signed_div_i8_neg_by_pos() { + let a: i8 = -6 + let b: i8 = 3 + assert(a / b == -2) +} + +#[test] +fn signed_div_i8_pos_by_neg() { + let a: i8 = 6 + let b: i8 = -3 + assert(a / b == -2) +} + +#[test] +fn signed_div_i8_neg_by_neg() { + let a: i8 = -6 + let b: i8 = -3 + assert(a / b == 2) +} + +#[test] +fn signed_rem_i8_neg_by_pos() { + let a: i8 = -7 + let b: i8 = 3 + assert(a % b == -1) +} + +#[test] +fn signed_rem_i8_pos_by_neg() { + let a: i8 = 7 + let b: i8 = -3 + assert(a % b == 1) +} + +#[test] +fn signed_rem_i8_neg_by_neg() { + let a: i8 = -7 + let b: i8 = -3 + assert(a % b == -1) +} + +// ===================================================================== +// Comparisons +// ===================================================================== + +#[test] +fn signed_cmp_i8_uses_signed_order() { + let a: i8 = -1 + let b: i8 = 1 + assert(a < b) + assert((a > b) == false) + assert((a <= b) == true) + assert((a >= b) == false) +} + +#[test] +fn signed_cmp_i256_uses_signed_order() { + let a: i256 = -1 + let b: i256 = 1 + assert(a < b) + assert((a > b) == false) + assert((a <= b) == true) + assert((a >= b) == false) +} + +// ===================================================================== +// Right shift semantics +// ===================================================================== + +fn signed_shr_assign_i8(v: mut i8) { + v >>= 2 + assert(v == -4) +} + +#[test] +fn signed_shr_i8_negative() { + let a: i8 = -16 + let b: i8 = 2 + assert(a >> b == -4) +} + +#[test] +fn signed_shr_i8_minus_one() { + let a: i8 = -1 + let b: i8 = 4 + assert(a >> b == -1) +} + +#[test] +fn signed_shr_assign_i8_is_arithmetic() { + let mut x: i8 = -16 + signed_shr_assign_i8(mut x) +} diff --git a/crates/fe/tests/fixtures/fe_test_runner/checked_arithmetic_reverts.fe b/crates/fe/tests/fixtures/fe_test_runner/checked_arithmetic_reverts.fe new file mode 100644 index 0000000000..8022ab3ac4 --- /dev/null +++ b/crates/fe/tests/fixtures/fe_test_runner/checked_arithmetic_reverts.fe @@ -0,0 +1,47 @@ +#[test] +fn test_add_overflow_u8() { + let x: u8 = 255 + let y: u8 = x + 1 +} + +#[test] +fn test_aug_assign_overflow_u8() { + let mut x: u8 = 255 + x += 1 +} + +#[test] +fn test_div_by_zero_u8() { + let x: u8 = 1 + let y: u8 = x / 0 +} + +#[test] +fn test_rem_by_zero_u8() { + let x: u8 = 1 + let y: u8 = x % 0 +} + +#[test] +fn test_pow_overflow_u8() { + let x: u8 = 2 + let y: u8 = x ** 8 +} + +#[test] +fn test_neg_overflow_i8() { + let x: i8 = -128 + let y: i8 = -x +} + +#[test] +fn test_div_overflow_i8() { + let x: i8 = -128 + let y: i8 = x / -1 +} + +#[test] +fn test_pow_negative_exp_i8() { + let x: i8 = 2 + let y: i8 = x ** -1 +} diff --git a/crates/fe/tests/fixtures/fe_test_runner/checked_arithmetic_reverts.snap b/crates/fe/tests/fixtures/fe_test_runner/checked_arithmetic_reverts.snap new file mode 100644 index 0000000000..2d47c5889d --- /dev/null +++ b/crates/fe/tests/fixtures/fe_test_runner/checked_arithmetic_reverts.snap @@ -0,0 +1,37 @@ +--- +source: crates/fe/tests/cli_output.rs +assertion_line: 922 +expression: output +input_file: tests/fixtures/fe_test_runner/checked_arithmetic_reverts.fe +--- +=== STDOUT === +FAIL [