Skip to content

Commit 38a0d44

Browse files
cesarzcswernli
andauthored
Use dense FIR IDs across packages (#1296)
This change fixes three things: - It reduces the memory footprint by using dense FIR IDs across packages. This is accomplished by using a new lowerer instance for every package such that IDs for blocks, statements, expressions and pats are reset and start from zero. - It fixes a bug where the debugger would not honor a breakpoint if the statement that mapped to the breakpoint had the ID 0. - As a consequence of changing the way the FIR lowerer is used, the debugger would now randomly and inadvertently break into a core or standard library statement if the statement ID happened to be the same than the statement ID where a breakpoint is set in the user's code. This problem is also addressed by this change. This was done in collaboration with @swernli and @idavis. --------- Co-authored-by: Stefan J. Wernli <swernli@microsoft.com>
1 parent 15c26c4 commit 38a0d44

File tree

8 files changed

+317
-330
lines changed

8 files changed

+317
-330
lines changed

compiler/qsc/benches/rca.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -134,26 +134,22 @@ impl Default for CompilationContext {
134134
LanguageFeatures::default(),
135135
)
136136
.expect("should be able to create a new compiler");
137-
let mut lowerer = Lowerer::new();
138-
let fir_store = lower_hir_package_store(&mut lowerer, compiler.package_store());
137+
let fir_store = lower_hir_package_store(compiler.package_store());
139138
Self {
140139
compiler,
141-
lowerer,
140+
lowerer: Lowerer::new(),
142141
fir_store,
143142
compute_properties: None,
144143
}
145144
}
146145
}
147146

148-
fn lower_hir_package_store(
149-
lowerer: &mut Lowerer,
150-
hir_package_store: &HirPackageStore,
151-
) -> PackageStore {
147+
fn lower_hir_package_store(hir_package_store: &HirPackageStore) -> PackageStore {
152148
let mut fir_store = PackageStore::new();
153149
for (id, unit) in hir_package_store {
154150
fir_store.insert(
155151
map_hir_package_to_fir(id),
156-
lowerer.lower_package(&unit.package),
152+
Lowerer::new().lower_package(&unit.package),
157153
);
158154
}
159155
fir_store

compiler/qsc/src/interpret.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -145,28 +145,25 @@ impl Interpreter {
145145
capabilities: RuntimeCapabilityFlags,
146146
language_features: LanguageFeatures,
147147
) -> std::result::Result<Self, Vec<Error>> {
148-
let mut lowerer = qsc_eval::lower::Lowerer::new();
149-
let mut fir_store = fir::PackageStore::new();
150-
151148
let compiler = Compiler::new(std, sources, package_type, capabilities, language_features)
152149
.map_err(into_errors)?;
153150

151+
let mut fir_store = fir::PackageStore::new();
154152
for (id, unit) in compiler.package_store() {
155153
fir_store.insert(
156154
map_hir_package_to_fir(id),
157-
lowerer.lower_package(&unit.package),
155+
qsc_eval::lower::Lowerer::new().lower_package(&unit.package),
158156
);
159157
}
160158

161159
let source_package_id = compiler.source_package_id();
162160
let package_id = compiler.package_id();
163-
164161
Ok(Self {
165162
compiler,
166163
lines: 0,
167164
capabilities,
168165
fir_store,
169-
lowerer,
166+
lowerer: qsc_eval::lower::Lowerer::new(),
170167
env: Env::default(),
171168
sim: BackendChain::new(
172169
SparseSim::new(),

compiler/qsc_codegen/src/qir_base.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,11 @@ pub fn generate_qir(
3131
store: &PackageStore,
3232
package: hir::PackageId,
3333
) -> std::result::Result<String, (Error, Vec<Frame>)> {
34-
let mut fir_lowerer = qsc_eval::lower::Lowerer::new();
3534
let mut fir_store = fir::PackageStore::new();
3635
for (id, unit) in store {
3736
fir_store.insert(
3837
map_hir_package_to_fir(id),
39-
fir_lowerer.lower_package(&unit.package),
38+
qsc_eval::lower::Lowerer::new().lower_package(&unit.package),
4039
);
4140
}
4241

compiler/qsc_eval/src/intrinsic/tests.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,9 @@ impl Backend for CustomSim {
146146
}
147147

148148
fn check_intrinsic(file: &str, expr: &str, out: &mut impl Receiver) -> Result<Value, Error> {
149-
let mut fir_lowerer = crate::lower::Lowerer::new();
150149
let mut core = compile::core();
151150
run_core_passes(&mut core);
152-
let core_fir = fir_lowerer.lower_package(&core.package);
151+
let core_fir = crate::lower::Lowerer::new().lower_package(&core.package);
153152
let mut store = PackageStore::new(core);
154153

155154
let mut std = compile::std(&store, RuntimeCapabilityFlags::all());
@@ -161,7 +160,7 @@ fn check_intrinsic(file: &str, expr: &str, out: &mut impl Receiver) -> Result<Va
161160
RuntimeCapabilityFlags::all()
162161
)
163162
.is_empty());
164-
let std_fir = fir_lowerer.lower_package(&std.package);
163+
let std_fir = crate::lower::Lowerer::new().lower_package(&std.package);
165164
let std_id = store.insert(std);
166165

167166
let sources = SourceMap::new([("test".into(), file.into())], Some(expr.into()));
@@ -180,7 +179,7 @@ fn check_intrinsic(file: &str, expr: &str, out: &mut impl Receiver) -> Result<Va
180179
RuntimeCapabilityFlags::all()
181180
)
182181
.is_empty());
183-
let unit_fir = fir_lowerer.lower_package(&unit.package);
182+
let unit_fir = crate::lower::Lowerer::new().lower_package(&unit.package);
184183
let entry = unit_fir.entry_exec_graph.clone();
185184

186185
let id = store.insert(unit);

compiler/qsc_eval/src/lib.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,7 @@ pub struct State {
406406
idx_stack: Vec<u32>,
407407
val_register: Option<Value>,
408408
val_stack: Vec<Vec<Value>>,
409+
source_package: PackageId,
409410
package: PackageId,
410411
call_stack: CallStack,
411412
current_span: Span,
@@ -429,6 +430,7 @@ impl State {
429430
idx_stack: Vec::new(),
430431
val_register: None,
431432
val_stack: vec![Vec::new()],
433+
source_package: package,
432434
package,
433435
call_stack: CallStack::default(),
434436
current_span: Span::default(),
@@ -547,7 +549,10 @@ impl State {
547549
self.idx += 1;
548550
self.current_span = globals.get_stmt((self.package, *stmt).into()).span;
549551

550-
if let Some(bp) = breakpoints.iter().find(|&bp| *bp == *stmt) {
552+
if let Some(bp) = breakpoints
553+
.iter()
554+
.find(|&bp| *bp == *stmt && self.package == self.source_package)
555+
{
551556
StepResult::BreakpointHit(*bp)
552557
} else {
553558
if self.current_span == Span::default() {

0 commit comments

Comments
 (0)