@@ -31,7 +31,8 @@ namespace {
3131class ConvertToLLVMPassInterface {
3232public:
3333 ConvertToLLVMPassInterface (MLIRContext *context,
34- ArrayRef<std::string> filterDialects);
34+ ArrayRef<std::string> filterDialects,
35+ bool allowPatternRollback = true );
3536 virtual ~ConvertToLLVMPassInterface () = default ;
3637
3738 // / Get the dependent dialects used by `convert-to-llvm`.
@@ -60,6 +61,9 @@ class ConvertToLLVMPassInterface {
6061 MLIRContext *context;
6162 // / List of dialects names to use as filters.
6263 ArrayRef<std::string> filterDialects;
64+ // / An experimental flag to disallow pattern rollback. This is more efficient
65+ // / but not supported by all lowering patterns.
66+ bool allowPatternRollback;
6367};
6468
6569// / This DialectExtension can be attached to the context, which will invoke the
@@ -128,7 +132,9 @@ struct StaticConvertToLLVM : public ConvertToLLVMPassInterface {
128132
129133 // / Apply the conversion driver.
130134 LogicalResult transform (Operation *op, AnalysisManager manager) const final {
131- if (failed (applyPartialConversion (op, *target, *patterns)))
135+ ConversionConfig config;
136+ config.allowPatternRollback = allowPatternRollback;
137+ if (failed (applyPartialConversion (op, *target, *patterns, config)))
132138 return failure ();
133139 return success ();
134140 }
@@ -179,7 +185,9 @@ struct DynamicConvertToLLVM : public ConvertToLLVMPassInterface {
179185 patterns);
180186
181187 // Apply the conversion.
182- if (failed (applyPartialConversion (op, target, std::move (patterns))))
188+ ConversionConfig config;
189+ config.allowPatternRollback = allowPatternRollback;
190+ if (failed (applyPartialConversion (op, target, std::move (patterns), config)))
183191 return failure ();
184192 return success ();
185193 }
@@ -206,9 +214,11 @@ class ConvertToLLVMPass
206214 std::shared_ptr<ConvertToLLVMPassInterface> impl;
207215 // Choose the pass implementation.
208216 if (useDynamic)
209- impl = std::make_shared<DynamicConvertToLLVM>(context, filterDialects);
217+ impl = std::make_shared<DynamicConvertToLLVM>(context, filterDialects,
218+ allowPatternRollback);
210219 else
211- impl = std::make_shared<StaticConvertToLLVM>(context, filterDialects);
220+ impl = std::make_shared<StaticConvertToLLVM>(context, filterDialects,
221+ allowPatternRollback);
212222 if (failed (impl->initialize ()))
213223 return failure ();
214224 this ->impl = impl;
@@ -228,8 +238,10 @@ class ConvertToLLVMPass
228238// ===----------------------------------------------------------------------===//
229239
230240ConvertToLLVMPassInterface::ConvertToLLVMPassInterface (
231- MLIRContext *context, ArrayRef<std::string> filterDialects)
232- : context(context), filterDialects(filterDialects) {}
241+ MLIRContext *context, ArrayRef<std::string> filterDialects,
242+ bool allowPatternRollback)
243+ : context(context), filterDialects(filterDialects),
244+ allowPatternRollback(allowPatternRollback) {}
233245
234246void ConvertToLLVMPassInterface::getDependentDialects (
235247 DialectRegistry ®istry) {
0 commit comments