@@ -148,3 +148,67 @@ void cudaq::opt::addPipelineTranslateToIQMJson(PassManager &pm) {
148
148
pm.addNestedPass <func::FuncOp>(createCanonicalizerPass ());
149
149
pm.addPass (createSymbolDCEPass ());
150
150
}
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
+ }
0 commit comments