diff --git a/crates/cairo-lang-lowering/src/db.rs b/crates/cairo-lang-lowering/src/db.rs index 2fff8bb1f62..79f4b3c37e9 100644 --- a/crates/cairo-lang-lowering/src/db.rs +++ b/crates/cairo-lang-lowering/src/db.rs @@ -357,6 +357,9 @@ fn concrete_function_with_body_lowered( optimize_remappings(&mut lowered); reorder_statements(db, &mut lowered); reorganize_blocks(&mut lowered); + // Removed blocks may have caused some remappings to be redundent, so they need to be removed, + // as SierraGen drop additions assumes all remappings are of used variables. + optimize_remappings(&mut lowered); Ok(Arc::new(lowered)) } diff --git a/crates/cairo-lang-lowering/src/test.rs b/crates/cairo-lang-lowering/src/test.rs index f0a0d9e9bde..b3cf01c9252 100644 --- a/crates/cairo-lang-lowering/src/test.rs +++ b/crates/cairo-lang-lowering/src/test.rs @@ -151,7 +151,8 @@ fn test_function_lowering_phases( apply_stage("after_lower_implicits", &|lowered| lower_implicits(&db, function_id, lowered)); apply_stage("after_optimize_remappings2", &optimize_remappings); apply_stage("after_reorder_statements3", &|lowered| reorder_statements(&db, lowered)); - apply_stage("after_reorganize_blocks (final)", &reorganize_blocks); + apply_stage("after_reorganize_blocks", &reorganize_blocks); + apply_stage("after_optimize_remappings3 (final)", &optimize_remappings); let after_all = db.concrete_function_with_body_lowered(function_id).unwrap(); diff --git a/crates/cairo-lang-lowering/src/test_data/lowering_phases b/crates/cairo-lang-lowering/src/test_data/lowering_phases index f8f46e0daae..f7477a28f63 100644 --- a/crates/cairo-lang-lowering/src/test_data/lowering_phases +++ b/crates/cairo-lang-lowering/src/test_data/lowering_phases @@ -1095,7 +1095,52 @@ Statements: End: Return(v34, v35, v25) -//! > after_reorganize_blocks (final) +//! > after_reorganize_blocks +Parameters: v26: core::RangeCheck, v27: core::gas::GasBuiltin +blk0 (root): +Statements: + (v16: core::gas::BuiltinCosts) <- core::gas::get_builtin_costs() +End: + Match(match core::gas::withdraw_gas_all(v26, v27, v16) { + Option::Some(v28, v29) => blk1, + Option::None(v30, v31) => blk4, + }) + +blk1: +Statements: + (v34: core::RangeCheck, v35: core::gas::GasBuiltin, v17: core::panics::PanicResult::<((),)>) <- test::foo(v28, v29) +End: + Match(match_enum(v17) { + PanicResult::Ok(v18) => blk2, + PanicResult::Err(v20) => blk3, + }) + +blk2: +Statements: + (v19: ()) <- struct_destructure(v18) + (v21: ((),)) <- struct_construct(v19) + (v22: core::panics::PanicResult::<((),)>) <- PanicResult::Ok(v21) +End: + Return(v34, v35, v22) + +blk3: +Statements: + (v25: core::panics::PanicResult::<((),)>) <- PanicResult::Err(v20) +End: + Return(v34, v35, v25) + +blk4: +Statements: + (v11: core::array::Array::) <- core::array::array_new::() + (v12: core::felt252) <- 375233589013918064796019u + (v14: core::array::Array::) <- core::array::array_append::(v11, v12) + (v13: core::panics::Panic) <- struct_construct() + (v15: (core::panics::Panic, core::array::Array::)) <- struct_construct(v13, v14) + (v24: core::panics::PanicResult::<((),)>) <- PanicResult::Err(v15) +End: + Return(v30, v31, v24) + +//! > after_optimize_remappings3 (final) Parameters: v26: core::RangeCheck, v27: core::gas::GasBuiltin blk0 (root): Statements: diff --git a/tests/bug_samples/issue4034.cairo b/tests/bug_samples/issue4034.cairo new file mode 100644 index 00000000000..5b78834b8ac --- /dev/null +++ b/tests/bug_samples/issue4034.cairo @@ -0,0 +1,7 @@ +#[test] +fn var_dropped_after_merge_remapping() { + let mut x: u32 = 0; + if (x == 0 && x != 1 && false) { + x = x + 1; + } +} diff --git a/tests/bug_samples/lib.cairo b/tests/bug_samples/lib.cairo index 45c6f4ea97f..662796d2305 100644 --- a/tests/bug_samples/lib.cairo +++ b/tests/bug_samples/lib.cairo @@ -26,6 +26,7 @@ mod issue3345; mod issue3658; mod issue3863; mod issue4007; +mod issue4034; mod issue4036; mod loop_only_change; mod inconsistent_gas;