Skip to content

Commit

Permalink
Use new QIR gen API for Base Profile (#1400)
Browse files Browse the repository at this point in the history
Co-authored-by: Stefan J. Wernli <[email protected]>
  • Loading branch information
idavis and swernli authored Apr 23, 2024
1 parent 438d937 commit da3795d
Show file tree
Hide file tree
Showing 65 changed files with 1,125 additions and 274 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions compiler/qsc/benches/eval.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ allocator::assign_global!();

use criterion::{criterion_group, criterion_main, Criterion};
use indoc::indoc;
use qsc::{interpret::Interpreter, PackageType};
use qsc::{interpret::Interpreter, PackageType, TargetCapabilityFlags};
use qsc_data_structures::language_features::LanguageFeatures;
use qsc_eval::output::GenericReceiver;
use qsc_frontend::compile::{SourceMap, TargetCapabilityFlags};
use qsc_frontend::compile::SourceMap;

const TELEPORT: &str = include_str!("../../../samples/algorithms/Teleportation.qs");
const DEUTSCHJOZSA: &str = include_str!("../../../samples/algorithms/DeutschJozsa.qs");
Expand Down
7 changes: 5 additions & 2 deletions compiler/qsc/benches/large.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,12 @@
allocator::assign_global!();

use criterion::{criterion_group, criterion_main, Criterion};
use qsc::compile::{self, compile};
use qsc::{
compile::{self, compile},
TargetCapabilityFlags,
};
use qsc_data_structures::language_features::LanguageFeatures;
use qsc_frontend::compile::{PackageStore, SourceMap, TargetCapabilityFlags};
use qsc_frontend::compile::{PackageStore, SourceMap};
use qsc_passes::PackageType;

const INPUT: &str = include_str!("./large.qs");
Expand Down
4 changes: 2 additions & 2 deletions compiler/qsc/benches/library.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
allocator::assign_global!();

use criterion::{criterion_group, criterion_main, Criterion};
use qsc::compile;
use qsc_frontend::compile::{PackageStore, TargetCapabilityFlags};
use qsc::{compile, TargetCapabilityFlags};
use qsc_frontend::compile::PackageStore;

pub fn library(c: &mut Criterion) {
c.bench_function("Core + Standard library compilation", |b| {
Expand Down
4 changes: 2 additions & 2 deletions compiler/qsc/benches/rca.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@

use criterion::{criterion_group, criterion_main, Criterion};
use qsc::incremental::Compiler;
use qsc_data_structures::language_features::LanguageFeatures;
use qsc_data_structures::{language_features::LanguageFeatures, target::TargetCapabilityFlags};
use qsc_fir::fir::PackageStore;
use qsc_frontend::compile::{PackageStore as HirPackageStore, SourceMap, TargetCapabilityFlags};
use qsc_frontend::compile::{PackageStore as HirPackageStore, SourceMap};
use qsc_lowerer::{map_hir_package_to_fir, Lowerer};
use qsc_passes::PackageType;
use qsc_rca::{Analyzer, PackageStoreComputeProperties};
Expand Down
3 changes: 2 additions & 1 deletion compiler/qsc/src/bin/memtest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
//! Records the memory usage of the compiler.

use qsc::{compile, CompileUnit};
use qsc_frontend::compile::{PackageStore, TargetCapabilityFlags};
use qsc_data_structures::target::TargetCapabilityFlags;
use qsc_frontend::compile::PackageStore;
use std::{
alloc::{GlobalAlloc, Layout, System},
sync::atomic::{AtomicU64, Ordering},
Expand Down
4 changes: 2 additions & 2 deletions compiler/qsc/src/bin/qsc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ use log::info;
use miette::{Context, IntoDiagnostic, Report};
use qsc::compile::compile;
use qsc_codegen::qir_base;
use qsc_data_structures::language_features::LanguageFeatures;
use qsc_data_structures::{language_features::LanguageFeatures, target::TargetCapabilityFlags};
use qsc_frontend::{
compile::{PackageStore, SourceContents, SourceMap, SourceName, TargetCapabilityFlags},
compile::{PackageStore, SourceContents, SourceMap, SourceName},
error::WithSource,
};
use qsc_hir::hir::{Package, PackageId};
Expand Down
4 changes: 2 additions & 2 deletions compiler/qsc/src/bin/qsi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ use miette::{Context, IntoDiagnostic, Report, Result};
use num_bigint::BigUint;
use num_complex::Complex64;
use qsc::interpret::{self, InterpretResult, Interpreter};
use qsc_data_structures::language_features::LanguageFeatures;
use qsc_data_structures::{language_features::LanguageFeatures, target::TargetCapabilityFlags};
use qsc_eval::{
output::{self, Receiver},
state::format_state_id,
val::Value,
};
use qsc_frontend::compile::{SourceContents, SourceMap, SourceName, TargetCapabilityFlags};
use qsc_frontend::compile::{SourceContents, SourceMap, SourceName};
use qsc_passes::PackageType;
use qsc_project::{FileSystem, Manifest, StdFs};
use std::{
Expand Down
50 changes: 32 additions & 18 deletions compiler/qsc/src/codegen.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

#[cfg(test)]
mod tests;

use qsc_codegen::qir::fir_to_qir;
use qsc_data_structures::language_features::LanguageFeatures;
use qsc_frontend::compile::{PackageStore, SourceMap, TargetCapabilityFlags};
use qsc_data_structures::{language_features::LanguageFeatures, target::TargetCapabilityFlags};
use qsc_frontend::compile::{PackageStore, SourceMap};
use qsc_partial_eval::ProgramEntry;
use qsc_passes::{PackageType, PassContext};
use qsc_rca::Analyzer;

use crate::compile;

Expand All @@ -30,14 +34,19 @@ pub fn get_qir(

// Ensure it compiles before trying to add it to the store.
if !errors.is_empty() {
// This should never happen, as the program should be checked for errors before trying to
// generate code for it. But just in case, simply report the failure.
return Err("Failed to generate QIR".to_string());
// This will happen when QIR generation is attempted on a program that has errors.
// This can happen in the playground.
let mut error_message =
String::from("Failed to generate QIR. Could not compile sources.:\n");
for error in errors {
error_message.push_str(&format!("{error}\n"));
}

return Err(error_message);
}

let package_id = package_store.insert(unit);
let (fir_store, fir_package_id) = qsc_passes::lower_hir_to_fir(&package_store, package_id);
let caps_results = PassContext::run_fir_passes_on_fir(&fir_store, fir_package_id, capabilities);
let package = fir_store.get(fir_package_id);
let entry = ProgramEntry {
exec_graph: package.entry_exec_graph.clone(),
Expand All @@ -49,16 +58,21 @@ pub fn get_qir(
)
.into(),
};
// Ensure it compiles before trying to add it to the store.
match caps_results {
Ok(compute_properties) => {
fir_to_qir(&fir_store, capabilities, Some(compute_properties), &entry)
.map_err(|e| e.to_string())
}
Err(_) => {
// This should never happen, as the program should be checked for errors before trying to
// generate code for it. But just in case, simply report the failure.
Err("Failed to generate QIR".to_string())
}
}

let compute_properties = if capabilities == TargetCapabilityFlags::empty() {
// baseprofchk already handled compliance, run the analyzer to get the compute properties.
let analyzer = Analyzer::init(&fir_store);
Ok(analyzer.analyze_all())
} else {
PassContext::run_fir_passes_on_fir(&fir_store, fir_package_id, capabilities)
};

let Ok(compute_properties) = compute_properties else {
// This should never happen, as the program should be checked for errors before trying to
// generate code for it. But just in case, simply report the failure.
return Err("Failed to generate QIR. Could not generate compute properties.".to_string());
};

fir_to_qir(&fir_store, capabilities, Some(compute_properties), &entry)
.map_err(|e| e.to_string())
}
Loading

0 comments on commit da3795d

Please sign in to comment.