Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use new QIR gen API for Base Profile #1400

Merged
merged 13 commits into from
Apr 24, 2024
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
Loading