Skip to content

Commit 8ed7b4e

Browse files
committed
Continue to flail at mystery CI failures.
Signed-off-by: Eric Schweitz <[email protected]>
1 parent 6055715 commit 8ed7b4e

File tree

3 files changed

+74
-2
lines changed

3 files changed

+74
-2
lines changed

include/cudaq/Optimizer/CodeGen/Passes.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,14 @@ void addPipelineTranslateToOpenQASM(mlir::PassManager &pm);
108108
/// Pipeline builder to convert Quake to IQM `Json`.
109109
void addPipelineTranslateToIQMJson(mlir::PassManager &pm);
110110

111+
//===----------------------------------------------------------------------===//
112+
113+
void commonPipelineConvertToQIR(mlir::PassManager &pm,
114+
mlir::StringRef codeGenFor = "qir:0.1",
115+
mlir::StringRef passConfigAs = "qir:0.1");
116+
void addPipelineConvertToQIR(mlir::PassManager &pm, mlir::StringRef convertTo);
117+
118+
111119
// declarative passes
112120
#define GEN_PASS_DECL
113121
#define GEN_PASS_REGISTRATION

lib/Optimizer/CodeGen/Pipelines.cpp

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,3 +148,67 @@ void cudaq::opt::addPipelineTranslateToIQMJson(PassManager &pm) {
148148
pm.addNestedPass<func::FuncOp>(createCanonicalizerPass());
149149
pm.addPass(createSymbolDCEPass());
150150
}
151+
152+
void cudaq::opt::commonPipelineConvertToQIR(PassManager &pm,
153+
StringRef codeGenFor,
154+
StringRef passConfigAs) {
155+
auto codeGenFields = codeGenFor.split(':');
156+
auto passConfigFields = passConfigAs.split(':');
157+
158+
pm.addNestedPass<func::FuncOp>(createApplyControlNegations());
159+
addAggressiveInlining(pm);
160+
pm.addNestedPass<func::FuncOp>(createCanonicalizerPass());
161+
pm.addNestedPass<func::FuncOp>(createUnwindLowering());
162+
pm.addNestedPass<func::FuncOp>(createCanonicalizerPass());
163+
pm.addNestedPass<func::FuncOp>(createExpandMeasurementsPass());
164+
pm.addNestedPass<func::FuncOp>(createClassicalMemToReg());
165+
pm.addNestedPass<func::FuncOp>(createCanonicalizerPass());
166+
pm.addNestedPass<func::FuncOp>(createCSEPass());
167+
pm.addNestedPass<func::FuncOp>(createQuakeAddDeallocs());
168+
pm.addNestedPass<func::FuncOp>(createQuakeAddMetadata());
169+
pm.addPass(createQuakePropagateMetadata());
170+
pm.addNestedPass<func::FuncOp>(createLoopNormalize());
171+
LoopUnrollOptions luo;
172+
luo.allowBreak = passConfigAs == "qir-adaptive";
173+
pm.addNestedPass<func::FuncOp>(createLoopUnroll(luo));
174+
pm.addNestedPass<func::FuncOp>(createCanonicalizerPass());
175+
pm.addNestedPass<func::FuncOp>(createCSEPass());
176+
// A final round of apply specialization after loop unrolling. This should
177+
// eliminate any residual control structures so the kernel specializations can
178+
// succeed.
179+
pm.addPass(createApplySpecialization());
180+
// If there was any specialization, we want another round in inlining to
181+
// inline the apply calls properly.
182+
addAggressiveInlining(pm);
183+
addLowerToCFG(pm);
184+
pm.addNestedPass<func::FuncOp>(createCombineQuantumAllocations());
185+
pm.addNestedPass<func::FuncOp>(createCanonicalizerPass());
186+
pm.addNestedPass<func::FuncOp>(createCSEPass());
187+
188+
if (passConfigFields.first == "qir-base")
189+
pm.addNestedPass<func::FuncOp>(createDelayMeasurementsPass());
190+
191+
if (codeGenFields.first == "qir" || codeGenFields.first == "qir-full")
192+
cudaq::opt::addConvertToQIRAPIPipeline(pm, "full:" +
193+
codeGenFields.second.str());
194+
else if (codeGenFields.first == "qir-base")
195+
cudaq::opt::addConvertToQIRAPIPipeline(pm, "base-profile:" +
196+
codeGenFields.second.str());
197+
else if (codeGenFields.first == "qir-adaptive")
198+
cudaq::opt::addConvertToQIRAPIPipeline(pm, "adaptive-profile:" +
199+
codeGenFields.second.str());
200+
else
201+
emitError(UnknownLoc::get(pm.getContext()),
202+
"convert to QIR must be given a valid specification to use.");
203+
pm.addPass(createReturnToOutputLog());
204+
pm.addPass(createConvertMathToFuncs());
205+
pm.addPass(createSymbolDCEPass());
206+
pm.addPass(createCCToLLVM());
207+
}
208+
209+
void cudaq::opt::addPipelineConvertToQIR(PassManager &pm, StringRef convertTo) {
210+
commonPipelineConvertToQIR(pm, convertTo, convertTo);
211+
auto targetPair = convertTo.split(':');
212+
if (targetPair.first != "qir" && targetPair.first != "qir-full")
213+
addQIRProfileVerify(pm, convertTo);
214+
}

python/runtime/cudaq/platform/py_alt_launch_kernel.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ ExecutionEngine *jitKernel(const std::string &name, MlirModule module,
169169
else
170170
tl = "qir:" + tlPair.second.str();
171171
}
172-
cudaq::opt::addAOTPipelineConvertToQIR(pm, tl);
172+
cudaq::opt::addPipelineConvertToQIR(pm, tl);
173173
pm.addPass(createSymbolDCEPass());
174174

175175
auto enablePrintMLIREachPass =
@@ -850,7 +850,7 @@ std::string getQIR(const std::string &name, MlirModule module,
850850
std::string profile{profile_};
851851
if (profile.empty())
852852
profile = "qir:0.1";
853-
cudaq::opt::addAOTPipelineConvertToQIR(pm, profile);
853+
cudaq::opt::addPipelineConvertToQIR(pm, profile);
854854
DefaultTimingManager tm;
855855
tm.setEnabled(cudaq::isTimingTagEnabled(cudaq::TIMING_JIT_PASSES));
856856
auto timingScope = tm.getRootScope(); // starts the timer

0 commit comments

Comments
 (0)