@@ -230,6 +230,14 @@ static const char *const opCommentHeader = R"(
230
230
231
231
)" ;
232
232
233
+ static const char *const inlineCreateBody = R"(
234
+ ::mlir::OperationState __state__({0}, getOperationName());
235
+ build(builder, __state__{1});
236
+ auto __res__ = ::llvm::dyn_cast<{2}>(builder.create(__state__));
237
+ assert(__res__ && "builder didn't return the right type");
238
+ return __res__;
239
+ )" ;
240
+
233
241
// ===----------------------------------------------------------------------===//
234
242
// Utility structs and functions
235
243
// ===----------------------------------------------------------------------===//
@@ -665,6 +673,7 @@ class OpEmitter {
665
673
// Generates the build() method that takes each operand/attribute
666
674
// as a stand-alone parameter.
667
675
void genSeparateArgParamBuilder ();
676
+ void genInlineCreateBody (const SmallVector<MethodParameter> ¶mList);
668
677
669
678
// Generates the build() method that takes each operand/attribute as a
670
679
// stand-alone parameter. The generated build() method uses first operand's
@@ -2557,6 +2566,39 @@ static bool canInferType(const Operator &op) {
2557
2566
return op.getTrait (" ::mlir::InferTypeOpInterface::Trait" );
2558
2567
}
2559
2568
2569
+ void OpEmitter::genInlineCreateBody (
2570
+ const SmallVector<MethodParameter> ¶mList) {
2571
+ SmallVector<MethodParameter> createParamList;
2572
+ SmallVector<llvm::StringRef, 4 > nonBuilderStateArgsList;
2573
+ createParamList.emplace_back (" ::mlir::OpBuilder &" , " builder" );
2574
+ std::string locParamName = " location" ;
2575
+ while (llvm::find_if (paramList, [&locParamName](const MethodParameter &p) {
2576
+ return p.getName () == locParamName;
2577
+ }) != paramList.end ()) {
2578
+ locParamName += " _" ;
2579
+ }
2580
+ createParamList.emplace_back (" ::mlir::Location" , locParamName);
2581
+
2582
+ for (auto ¶m : paramList) {
2583
+ if (param.getType () == " ::mlir::OpBuilder &" ||
2584
+ param.getType () == " ::mlir::OperationState &" )
2585
+ continue ;
2586
+ createParamList.emplace_back (param.getType (), param.getName (),
2587
+ param.getDefaultValue (), param.isOptional ());
2588
+ nonBuilderStateArgsList.push_back (param.getName ());
2589
+ }
2590
+ auto *c = opClass.addStaticMethod (opClass.getClassName (), " create" ,
2591
+ createParamList);
2592
+ std::string nonBuilderStateArgs = " " ;
2593
+ if (!nonBuilderStateArgsList.empty ()) {
2594
+ llvm::raw_string_ostream nonBuilderStateArgsOS (nonBuilderStateArgs);
2595
+ interleaveComma (nonBuilderStateArgsList, nonBuilderStateArgsOS);
2596
+ nonBuilderStateArgs = " , " + nonBuilderStateArgs;
2597
+ }
2598
+ c->body () << llvm::formatv (inlineCreateBody, locParamName,
2599
+ nonBuilderStateArgs, opClass.getClassName ());
2600
+ }
2601
+
2560
2602
void OpEmitter::genSeparateArgParamBuilder () {
2561
2603
SmallVector<AttrParamKind, 2 > attrBuilderType;
2562
2604
attrBuilderType.push_back (AttrParamKind::WrappedAttr);
@@ -2573,10 +2615,12 @@ void OpEmitter::genSeparateArgParamBuilder() {
2573
2615
buildParamList (paramList, inferredAttributes, resultNames, paramKind,
2574
2616
attrType);
2575
2617
2576
- auto *m = opClass.addStaticMethod (" void" , " build" , std::move ( paramList) );
2618
+ auto *m = opClass.addStaticMethod (" void" , " build" , paramList);
2577
2619
// If the builder is redundant, skip generating the method.
2578
2620
if (!m)
2579
2621
return ;
2622
+ genInlineCreateBody (paramList);
2623
+
2580
2624
auto &body = m->body ();
2581
2625
genCodeForAddingArgAndRegionForBuilder (body, inferredAttributes,
2582
2626
/* isRawValueAttr=*/ attrType ==
@@ -2701,10 +2745,11 @@ void OpEmitter::genUseOperandAsResultTypeCollectiveParamBuilder(
2701
2745
if (op.getNumVariadicRegions ())
2702
2746
paramList.emplace_back (" unsigned" , " numRegions" );
2703
2747
2704
- auto *m = opClass.addStaticMethod (" void" , " build" , std::move ( paramList) );
2748
+ auto *m = opClass.addStaticMethod (" void" , " build" , paramList);
2705
2749
// If the builder is redundant, skip generating the method
2706
2750
if (!m)
2707
2751
return ;
2752
+ genInlineCreateBody (paramList);
2708
2753
auto &body = m->body ();
2709
2754
2710
2755
// Operands
@@ -2815,10 +2860,11 @@ void OpEmitter::genInferredTypeCollectiveParamBuilder(
2815
2860
if (op.getNumVariadicRegions ())
2816
2861
paramList.emplace_back (" unsigned" , " numRegions" );
2817
2862
2818
- auto *m = opClass.addStaticMethod (" void" , " build" , std::move ( paramList) );
2863
+ auto *m = opClass.addStaticMethod (" void" , " build" , paramList);
2819
2864
// If the builder is redundant, skip generating the method
2820
2865
if (!m)
2821
2866
return ;
2867
+ genInlineCreateBody (paramList);
2822
2868
auto &body = m->body ();
2823
2869
2824
2870
int numResults = op.getNumResults ();
@@ -2895,10 +2941,11 @@ void OpEmitter::genUseOperandAsResultTypeSeparateParamBuilder() {
2895
2941
buildParamList (paramList, inferredAttributes, resultNames,
2896
2942
TypeParamKind::None, attrType);
2897
2943
2898
- auto *m = opClass.addStaticMethod (" void" , " build" , std::move ( paramList) );
2944
+ auto *m = opClass.addStaticMethod (" void" , " build" , paramList);
2899
2945
// If the builder is redundant, skip generating the method
2900
2946
if (!m)
2901
2947
return ;
2948
+ genInlineCreateBody (paramList);
2902
2949
auto &body = m->body ();
2903
2950
genCodeForAddingArgAndRegionForBuilder (body, inferredAttributes,
2904
2951
/* isRawValueAttr=*/ attrType ==
@@ -2937,10 +2984,11 @@ void OpEmitter::genUseAttrAsResultTypeCollectiveParamBuilder(
2937
2984
: " attributes" ;
2938
2985
paramList.emplace_back (" ::llvm::ArrayRef<::mlir::NamedAttribute>" ,
2939
2986
attributesName, " {}" );
2940
- auto *m = opClass.addStaticMethod (" void" , " build" , std::move ( paramList) );
2987
+ auto *m = opClass.addStaticMethod (" void" , " build" , paramList);
2941
2988
// If the builder is redundant, skip generating the method
2942
2989
if (!m)
2943
2990
return ;
2991
+ genInlineCreateBody (paramList);
2944
2992
2945
2993
auto &body = m->body ();
2946
2994
@@ -3103,10 +3151,11 @@ void OpEmitter::genCollectiveParamBuilder(CollectiveBuilderKind kind) {
3103
3151
if (op.getNumVariadicRegions ())
3104
3152
paramList.emplace_back (" unsigned" , " numRegions" );
3105
3153
3106
- auto *m = opClass.addStaticMethod (" void" , " build" , std::move ( paramList) );
3154
+ auto *m = opClass.addStaticMethod (" void" , " build" , paramList);
3107
3155
// If the builder is redundant, skip generating the method
3108
3156
if (!m)
3109
3157
return ;
3158
+ genInlineCreateBody (paramList);
3110
3159
auto &body = m->body ();
3111
3160
3112
3161
// Operands
0 commit comments