Skip to content

Commit

Permalink
fix: Complete call stacks with no_predicates (#5418)
Browse files Browse the repository at this point in the history
# Description

## Problem\*

Consider the following code:
```rust
fn inner<N>(input: Field) {
    assert_eq(input, 27);
}

#[no_predicates]
fn no_predicates(input: Field) {
    inner(input)
}

fn outer_pass_through(input: Field) {
    no_predicates(input)
}

fn main(input: Field) {
    outer_pass_through(input)
}

```
This is the call stack with `#[no_predicates]`:
```
   ┌─ /mnt/user-data/alvaro/constructor/src/main.nr:23:5
   │
23 │     assert_eq(input, 27);
   │     --------------------
   │
   = Call stack:
     1. /mnt/user-data/alvaro/constructor/src/main.nr:32:5
     2. /mnt/user-data/alvaro/constructor/src/main.nr:28:5
     3. /mnt/user-data/alvaro/constructor/src/main.nr:23:5
```

This is the call stack without  `#[no_predicates]`:
```
error: Failed constraint
   ┌─ /mnt/user-data/alvaro/constructor/src/main.nr:23:5
   │
23 │     assert_eq(input, 27);
   │     --------------------
   │
   = Call stack:
     1. /mnt/user-data/alvaro/constructor/src/main.nr:35:5
     2. /mnt/user-data/alvaro/constructor/src/main.nr:31:5
     3. /mnt/user-data/alvaro/constructor/src/main.nr:27:5
     4. /mnt/user-data/alvaro/constructor/src/main.nr:23:5
```

Inlining with no predicates was eating up the `outer_pass_through` call.

## Summary\*

The inliner now doesn't assume that there is at most one location in the
source call stack.

## Additional Context



## Documentation\*

Check one:
- [x] No documentation needed.
- [ ] Documentation included in this PR.
- [ ] **[For Experimental Features]** Documentation to be submitted in a
separate PR.

# PR Checklist\*

- [x] I have tested the changes locally.
- [x] I have formatted the changes with [Prettier](https://prettier.io/)
and/or `cargo fmt` on default settings.
  • Loading branch information
sirasistant authored Jul 5, 2024
1 parent bf3a75a commit df73fe2
Showing 1 changed file with 4 additions and 10 deletions.
14 changes: 4 additions & 10 deletions compiler/noirc_evaluator/src/ssa/opt/inlining.rs
Original file line number Diff line number Diff line change
Expand Up @@ -517,19 +517,13 @@ impl<'function> PerFunctionContext<'function> {
let old_results = self.source_function.dfg.instruction_results(call_id);
let arguments = vecmap(arguments, |arg| self.translate_value(*arg));

let mut call_stack = self.source_function.dfg.get_call_stack(call_id);
let has_location = !call_stack.is_empty();

// Function calls created by the defunctionalization pass will not have source locations
if let Some(location) = call_stack.pop_back() {
self.context.call_stack.push_back(location);
}
let call_stack = self.source_function.dfg.get_call_stack(call_id);
let call_stack_len = call_stack.len();
self.context.call_stack.append(call_stack);

let new_results = self.context.inline_function(ssa, function, &arguments);

if has_location {
self.context.call_stack.pop_back();
}
self.context.call_stack.truncate(self.context.call_stack.len() - call_stack_len);

let new_results = InsertInstructionResult::Results(call_id, &new_results);
Self::insert_new_instruction_results(&mut self.values, old_results, new_results);
Expand Down

0 comments on commit df73fe2

Please sign in to comment.