[Mlir-commits] [mlir] 89eab30 - [mlir] use OpBuilderDAG instead of OpBuilder

Alex Zinenko llvmlistbot at llvm.org
Tue Oct 27 02:21:59 PDT 2020


Author: Alex Zinenko
Date: 2020-10-27T10:21:49+01:00
New Revision: 89eab30e5cde90dd3777254f27805b31af780412

URL: https://github.com/llvm/llvm-project/commit/89eab30e5cde90dd3777254f27805b31af780412
DIFF: https://github.com/llvm/llvm-project/commit/89eab30e5cde90dd3777254f27805b31af780412.diff

LOG: [mlir] use OpBuilderDAG instead of OpBuilder

A recent commit introduced a new syntax for specifying builder arguments in
ODS, which is better amenable to automated processing, and deprecated the old
form. Transition all dialects as well as Linalg ODS generator to use the new
syntax.

Add a deprecation notice to ODS generator.

Reviewed By: rriddle, jpienaar

Differential Revision: https://reviews.llvm.org/D90038

Added: 
    

Modified: 
    mlir/docs/Tutorials/Toy/Ch-2.md
    mlir/examples/toy/Ch2/include/toy/Ops.td
    mlir/examples/toy/Ch3/include/toy/Ops.td
    mlir/examples/toy/Ch4/include/toy/Ops.td
    mlir/examples/toy/Ch5/include/toy/Ops.td
    mlir/examples/toy/Ch6/include/toy/Ops.td
    mlir/examples/toy/Ch7/include/toy/Ops.td
    mlir/include/mlir/Dialect/Affine/IR/AffineOps.td
    mlir/include/mlir/Dialect/Async/IR/AsyncOps.td
    mlir/include/mlir/Dialect/GPU/GPUOps.td
    mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
    mlir/include/mlir/Dialect/Linalg/IR/LinalgOps.td
    mlir/include/mlir/Dialect/Linalg/IR/LinalgStructuredOps.td
    mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
    mlir/include/mlir/Dialect/PDL/IR/PDLOps.td
    mlir/include/mlir/Dialect/PDLInterp/IR/PDLInterpOps.td
    mlir/include/mlir/Dialect/SCF/SCFOps.td
    mlir/include/mlir/Dialect/SPIRV/SPIRVAtomicOps.td
    mlir/include/mlir/Dialect/SPIRV/SPIRVCompositeOps.td
    mlir/include/mlir/Dialect/SPIRV/SPIRVControlFlowOps.td
    mlir/include/mlir/Dialect/SPIRV/SPIRVLogicalOps.td
    mlir/include/mlir/Dialect/SPIRV/SPIRVNonUniformOps.td
    mlir/include/mlir/Dialect/SPIRV/SPIRVOps.td
    mlir/include/mlir/Dialect/SPIRV/SPIRVStructureOps.td
    mlir/include/mlir/Dialect/Shape/IR/ShapeOps.td
    mlir/include/mlir/Dialect/StandardOps/IR/Ops.td
    mlir/include/mlir/Dialect/Vector/VectorOps.td
    mlir/test/lib/Dialect/Test/TestOps.td
    mlir/tools/mlir-linalg-ods-gen/mlir-linalg-ods-gen.cpp
    mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp

Removed: 
    


################################################################################
diff  --git a/mlir/docs/Tutorials/Toy/Ch-2.md b/mlir/docs/Tutorials/Toy/Ch-2.md
index 89134e264aa0..be76dc351912 100644
--- a/mlir/docs/Tutorials/Toy/Ch-2.md
+++ b/mlir/docs/Tutorials/Toy/Ch-2.md
@@ -490,14 +490,14 @@ def ConstantOp : Toy_Op<"constant"> {
   // using `builder.create<ConstantOp>(...)`.
   let builders = [
     // Build a constant with a given constant tensor value.
-    OpBuilder<"DenseElementsAttr value", [{
+    OpBuilderDAG<(ins "DenseElementsAttr":$value), [{
       // Call into an autogenerated `build` method.
       build(builder, result, value.getType(), value);
     }]>,
 
     // Build a constant with a given constant floating-point value. This builder
     // creates a declaration for `ConstantOp::build` with the given parameters.
-    OpBuilder<"double value">
+    OpBuilderDAG<(ins "double":$value)>
   ];
 }
 ```

diff  --git a/mlir/examples/toy/Ch2/include/toy/Ops.td b/mlir/examples/toy/Ch2/include/toy/Ops.td
index aa344f520233..cc110e1e75b4 100644
--- a/mlir/examples/toy/Ch2/include/toy/Ops.td
+++ b/mlir/examples/toy/Ch2/include/toy/Ops.td
@@ -68,12 +68,12 @@ def ConstantOp : Toy_Op<"constant", [NoSideEffect]> {
   // using `builder.create<ConstantOp>(...)`.
   let builders = [
     // Build a constant with a given constant tensor value.
-    OpBuilder<"DenseElementsAttr value", [{
+    OpBuilderDAG<(ins "DenseElementsAttr":$value), [{
       build($_builder, $_state, value.getType(), value);
     }]>,
 
     // Build a constant with a given constant floating-point value.
-    OpBuilder<"double value">
+    OpBuilderDAG<(ins "double":$value)>
   ];
 
   // Invoke a static verify method to verify this constant operation.
@@ -96,7 +96,7 @@ def AddOp : Toy_Op<"add"> {
 
   // Allow building an AddOp with from the two input operands.
   let builders = [
-    OpBuilder<"Value lhs, Value rhs">
+    OpBuilderDAG<(ins "Value":$lhs, "Value":$rhs)>
   ];
 }
 
@@ -131,7 +131,7 @@ def GenericCallOp : Toy_Op<"generic_call"> {
 
   // Add custom build methods for the generic call operation.
   let builders = [
-    OpBuilder<"StringRef callee, ArrayRef<Value> arguments">
+    OpBuilderDAG<(ins "StringRef":$callee, "ArrayRef<Value>":$arguments)>
   ];
 }
 
@@ -151,7 +151,7 @@ def MulOp : Toy_Op<"mul"> {
 
   // Allow building a MulOp with from the two input operands.
   let builders = [
-    OpBuilder<"Value lhs, Value rhs">
+    OpBuilderDAG<(ins "Value":$lhs, "Value":$rhs)>
   ];
 }
 
@@ -215,7 +215,7 @@ def ReturnOp : Toy_Op<"return", [NoSideEffect, HasParent<"FuncOp">,
 
   // Allow building a ReturnOp with no return operand.
   let builders = [
-    OpBuilder<"", [{ build($_builder, $_state, llvm::None); }]>
+    OpBuilderDAG<(ins), [{ build($_builder, $_state, llvm::None); }]>
   ];
 
   // Provide extra utility definitions on the c++ operation class definition.
@@ -239,7 +239,7 @@ def TransposeOp : Toy_Op<"transpose"> {
 
   // Allow building a TransposeOp with from the input operand.
   let builders = [
-    OpBuilder<"Value input">
+    OpBuilderDAG<(ins "Value":$input)>
   ];
 
   // Invoke a static verify method to verify this transpose operation.

diff  --git a/mlir/examples/toy/Ch3/include/toy/Ops.td b/mlir/examples/toy/Ch3/include/toy/Ops.td
index 4f09d8af6bce..8808bc8d2fc7 100644
--- a/mlir/examples/toy/Ch3/include/toy/Ops.td
+++ b/mlir/examples/toy/Ch3/include/toy/Ops.td
@@ -67,12 +67,12 @@ def ConstantOp : Toy_Op<"constant", [NoSideEffect]> {
   // using `builder.create<ConstantOp>(...)`.
   let builders = [
     // Build a constant with a given constant tensor value.
-    OpBuilder<"DenseElementsAttr value", [{
+    OpBuilderDAG<(ins "DenseElementsAttr":$value), [{
       build($_builder, $_state, value.getType(), value);
     }]>,
 
     // Build a constant with a given constant floating-point value.
-    OpBuilder<"double value">
+    OpBuilderDAG<(ins "double":$value)>
   ];
 
   // Invoke a static verify method to verify this constant operation.
@@ -95,7 +95,7 @@ def AddOp : Toy_Op<"add", [NoSideEffect]> {
 
   // Allow building an AddOp with from the two input operands.
   let builders = [
-    OpBuilder<"Value lhs, Value rhs">
+    OpBuilderDAG<(ins "Value":$lhs, "Value":$rhs)>
   ];
 }
 
@@ -130,7 +130,7 @@ def GenericCallOp : Toy_Op<"generic_call"> {
 
   // Add custom build methods for the generic call operation.
   let builders = [
-    OpBuilder<"StringRef callee, ArrayRef<Value> arguments">
+    OpBuilderDAG<(ins "StringRef":$callee, "ArrayRef<Value>":$arguments)>
   ];
 }
 
@@ -150,7 +150,7 @@ def MulOp : Toy_Op<"mul", [NoSideEffect]> {
 
   // Allow building a MulOp with from the two input operands.
   let builders = [
-    OpBuilder<"Value lhs, Value rhs">
+    OpBuilderDAG<(ins "Value":$lhs, "Value":$rhs)>
   ];
 }
 
@@ -217,7 +217,7 @@ def ReturnOp : Toy_Op<"return", [NoSideEffect, HasParent<"FuncOp">,
 
   // Allow building a ReturnOp with no return operand.
   let builders = [
-    OpBuilder<"", [{ build($_builder, $_state, llvm::None); }]>
+    OpBuilderDAG<(ins), [{ build($_builder, $_state, llvm::None); }]>
   ];
 
   // Provide extra utility definitions on the c++ operation class definition.
@@ -244,7 +244,7 @@ def TransposeOp : Toy_Op<"transpose", [NoSideEffect]> {
 
   // Allow building a TransposeOp with from the input operand.
   let builders = [
-    OpBuilder<"Value input">
+    OpBuilderDAG<(ins "Value":$input)>
   ];
 
   // Invoke a static verify method to verify this transpose operation.

diff  --git a/mlir/examples/toy/Ch4/include/toy/Ops.td b/mlir/examples/toy/Ch4/include/toy/Ops.td
index 460dc0cf646e..adf8ab2aec80 100644
--- a/mlir/examples/toy/Ch4/include/toy/Ops.td
+++ b/mlir/examples/toy/Ch4/include/toy/Ops.td
@@ -69,12 +69,12 @@ def ConstantOp : Toy_Op<"constant", [NoSideEffect]> {
   // using `builder.create<ConstantOp>(...)`.
   let builders = [
     // Build a constant with a given constant tensor value.
-    OpBuilder<"DenseElementsAttr value", [{
+    OpBuilderDAG<(ins "DenseElementsAttr":$value), [{
       build($_builder, $_state, value.getType(), value);
     }]>,
 
     // Build a constant with a given constant floating-point value.
-    OpBuilder<"double value">
+    OpBuilderDAG<(ins "double":$value)>
   ];
 
   // Invoke a static verify method to verify this constant operation.
@@ -98,7 +98,7 @@ def AddOp : Toy_Op<"add",
 
   // Allow building an AddOp with from the two input operands.
   let builders = [
-    OpBuilder<"Value lhs, Value rhs">
+    OpBuilderDAG<(ins "Value":$lhs, "Value":$rhs)>
   ];
 }
 
@@ -155,7 +155,7 @@ def GenericCallOp : Toy_Op<"generic_call",
 
   // Add custom build methods for the generic call operation.
   let builders = [
-    OpBuilder<"StringRef callee, ArrayRef<Value> arguments">
+    OpBuilderDAG<(ins "StringRef":$callee, "ArrayRef<Value>":$arguments)>
   ];
 }
 
@@ -176,7 +176,7 @@ def MulOp : Toy_Op<"mul",
 
   // Allow building a MulOp with from the two input operands.
   let builders = [
-    OpBuilder<"Value lhs, Value rhs">
+    OpBuilderDAG<(ins "Value":$lhs, "Value":$rhs)>
   ];
 }
 
@@ -243,7 +243,7 @@ def ReturnOp : Toy_Op<"return", [NoSideEffect, HasParent<"FuncOp">,
 
   // Allow building a ReturnOp with no return operand.
   let builders = [
-    OpBuilder<"", [{ build($_builder, $_state, llvm::None); }]>
+    OpBuilderDAG<(ins), [{ build($_builder, $_state, llvm::None); }]>
   ];
 
   // Provide extra utility definitions on the c++ operation class definition.
@@ -271,7 +271,7 @@ def TransposeOp : Toy_Op<"transpose",
 
   // Allow building a TransposeOp with from the input operand.
   let builders = [
-    OpBuilder<"Value input">
+    OpBuilderDAG<(ins "Value":$input)>
   ];
 
   // Invoke a static verify method to verify this transpose operation.

diff  --git a/mlir/examples/toy/Ch5/include/toy/Ops.td b/mlir/examples/toy/Ch5/include/toy/Ops.td
index 9f889eeb27b3..ee7d6c4b340d 100644
--- a/mlir/examples/toy/Ch5/include/toy/Ops.td
+++ b/mlir/examples/toy/Ch5/include/toy/Ops.td
@@ -69,12 +69,12 @@ def ConstantOp : Toy_Op<"constant", [NoSideEffect]> {
   // using `builder.create<ConstantOp>(...)`.
   let builders = [
     // Build a constant with a given constant tensor value.
-    OpBuilder<"DenseElementsAttr value", [{
+    OpBuilderDAG<(ins "DenseElementsAttr":$value), [{
       build($_builder, $_state, value.getType(), value);
     }]>,
 
     // Build a constant with a given constant floating-point value.
-    OpBuilder<"double value">
+    OpBuilderDAG<(ins "double":$value)>
   ];
 
   // Invoke a static verify method to verify this constant operation.
@@ -98,7 +98,7 @@ def AddOp : Toy_Op<"add",
 
   // Allow building an AddOp with from the two input operands.
   let builders = [
-    OpBuilder<"Value lhs, Value rhs">
+    OpBuilderDAG<(ins "Value":$lhs, "Value":$rhs)>
   ];
 }
 
@@ -155,7 +155,7 @@ def GenericCallOp : Toy_Op<"generic_call",
 
   // Add custom build methods for the generic call operation.
   let builders = [
-    OpBuilder<"StringRef callee, ArrayRef<Value> arguments">
+    OpBuilderDAG<(ins "StringRef":$callee, "ArrayRef<Value>":$arguments)>
   ];
 }
 
@@ -176,7 +176,7 @@ def MulOp : Toy_Op<"mul",
 
   // Allow building a MulOp with from the two input operands.
   let builders = [
-    OpBuilder<"Value lhs, Value rhs">
+    OpBuilderDAG<(ins "Value":$lhs, "Value":$rhs)>
   ];
 }
 
@@ -244,7 +244,7 @@ def ReturnOp : Toy_Op<"return", [NoSideEffect, HasParent<"FuncOp">,
 
   // Allow building a ReturnOp with no return operand.
   let builders = [
-    OpBuilder<"", [{ build($_builder, $_state, llvm::None); }]>
+    OpBuilderDAG<(ins), [{ build($_builder, $_state, llvm::None); }]>
   ];
 
   // Provide extra utility definitions on the c++ operation class definition.
@@ -272,7 +272,7 @@ def TransposeOp : Toy_Op<"transpose",
 
   // Allow building a TransposeOp with from the input operand.
   let builders = [
-    OpBuilder<"Value input">
+    OpBuilderDAG<(ins "Value":$input)>
   ];
 
   // Invoke a static verify method to verify this transpose operation.

diff  --git a/mlir/examples/toy/Ch6/include/toy/Ops.td b/mlir/examples/toy/Ch6/include/toy/Ops.td
index 99c8026ea692..6f3998357010 100644
--- a/mlir/examples/toy/Ch6/include/toy/Ops.td
+++ b/mlir/examples/toy/Ch6/include/toy/Ops.td
@@ -69,12 +69,12 @@ def ConstantOp : Toy_Op<"constant", [NoSideEffect]> {
   // using `builder.create<ConstantOp>(...)`.
   let builders = [
     // Build a constant with a given constant tensor value.
-    OpBuilder<"DenseElementsAttr value", [{
+    OpBuilderDAG<(ins "DenseElementsAttr":$value), [{
       build($_builder, $_state, value.getType(), value);
     }]>,
 
     // Build a constant with a given constant floating-point value.
-    OpBuilder<"double value">
+    OpBuilderDAG<(ins "double":$value)>
   ];
 
   // Invoke a static verify method to verify this constant operation.
@@ -98,7 +98,7 @@ def AddOp : Toy_Op<"add",
 
   // Allow building an AddOp with from the two input operands.
   let builders = [
-    OpBuilder<"Value lhs, Value rhs">
+    OpBuilderDAG<(ins "Value":$lhs, "Value":$rhs)>
   ];
 }
 
@@ -155,7 +155,7 @@ def GenericCallOp : Toy_Op<"generic_call",
 
   // Add custom build methods for the generic call operation.
   let builders = [
-    OpBuilder<"StringRef callee, ArrayRef<Value> arguments">
+    OpBuilderDAG<(ins "StringRef":$callee, "ArrayRef<Value>":$arguments)>
   ];
 }
 
@@ -176,7 +176,7 @@ def MulOp : Toy_Op<"mul",
 
   // Allow building a MulOp with from the two input operands.
   let builders = [
-    OpBuilder<"Value lhs, Value rhs">
+    OpBuilderDAG<(ins "Value":$lhs, "Value":$rhs)>
   ];
 }
 
@@ -244,7 +244,7 @@ def ReturnOp : Toy_Op<"return", [NoSideEffect, HasParent<"FuncOp">,
 
   // Allow building a ReturnOp with no return operand.
   let builders = [
-    OpBuilder<"", [{ build($_builder, $_state, llvm::None); }]>
+    OpBuilderDAG<(ins), [{ build($_builder, $_state, llvm::None); }]>
   ];
 
   // Provide extra utility definitions on the c++ operation class definition.
@@ -272,7 +272,7 @@ def TransposeOp : Toy_Op<"transpose",
 
   // Allow building a TransposeOp with from the input operand.
   let builders = [
-    OpBuilder<"Value input">
+    OpBuilderDAG<(ins "Value":$input)>
   ];
 
   // Invoke a static verify method to verify this transpose operation.

diff  --git a/mlir/examples/toy/Ch7/include/toy/Ops.td b/mlir/examples/toy/Ch7/include/toy/Ops.td
index 53d47f5364f1..c73a6b94e903 100644
--- a/mlir/examples/toy/Ch7/include/toy/Ops.td
+++ b/mlir/examples/toy/Ch7/include/toy/Ops.td
@@ -79,12 +79,12 @@ def ConstantOp : Toy_Op<"constant",
   // using `builder.create<ConstantOp>(...)`.
   let builders = [
     // Build a constant with a given constant tensor value.
-    OpBuilder<"DenseElementsAttr value", [{
+    OpBuilderDAG<(ins "DenseElementsAttr":$value), [{
       build($_builder, $_state, value.getType(), value);
     }]>,
 
     // Build a constant with a given constant floating-point value.
-    OpBuilder<"double value">
+    OpBuilderDAG<(ins "double":$value)>
   ];
 
   // Invoke a static verify method to verify this constant operation.
@@ -111,7 +111,7 @@ def AddOp : Toy_Op<"add",
 
   // Allow building an AddOp with from the two input operands.
   let builders = [
-    OpBuilder<"Value lhs, Value rhs">
+    OpBuilderDAG<(ins "Value":$lhs, "Value":$rhs)>
   ];
 }
 
@@ -169,7 +169,7 @@ def GenericCallOp : Toy_Op<"generic_call",
 
   // Add custom build methods for the generic call operation.
   let builders = [
-    OpBuilder<"StringRef callee, ArrayRef<Value> arguments">
+    OpBuilderDAG<(ins "StringRef":$callee, "ArrayRef<Value>":$arguments)>
   ];
 }
 
@@ -190,7 +190,7 @@ def MulOp : Toy_Op<"mul",
 
   // Allow building a MulOp with from the two input operands.
   let builders = [
-    OpBuilder<"Value lhs, Value rhs">
+    OpBuilderDAG<(ins "Value":$lhs, "Value":$rhs)>
   ];
 }
 
@@ -258,7 +258,7 @@ def ReturnOp : Toy_Op<"return", [NoSideEffect, HasParent<"FuncOp">,
 
   // Allow building a ReturnOp with no return operand.
   let builders = [
-    OpBuilder<"", [{ build($_builder, $_state, llvm::None); }]>
+    OpBuilderDAG<(ins), [{ build($_builder, $_state, llvm::None); }]>
   ];
 
   // Provide extra utility definitions on the c++ operation class definition.
@@ -285,7 +285,7 @@ def StructAccessOp : Toy_Op<"struct_access", [NoSideEffect]> {
 
   // Allow building a StructAccessOp with just a struct value and an index.
   let builders = [
-    OpBuilder<"Value input, size_t index">
+    OpBuilderDAG<(ins "Value":$input, "size_t":$index)>
   ];
 
   let verifier = [{ return ::verify(*this); }];
@@ -333,7 +333,7 @@ def TransposeOp : Toy_Op<"transpose",
 
   // Allow building a TransposeOp with from the input operand.
   let builders = [
-    OpBuilder<"Value input">
+    OpBuilderDAG<(ins "Value":$input)>
   ];
 
   // Invoke a static verify method to verify this transpose operation.

diff  --git a/mlir/include/mlir/Dialect/Affine/IR/AffineOps.td b/mlir/include/mlir/Dialect/Affine/IR/AffineOps.td
index 7e065cc38f69..e2fffc4ab591 100644
--- a/mlir/include/mlir/Dialect/Affine/IR/AffineOps.td
+++ b/mlir/include/mlir/Dialect/Affine/IR/AffineOps.td
@@ -72,7 +72,8 @@ def AffineApplyOp : Affine_Op<"apply", [NoSideEffect]> {
   // has a constant builder. That way we wouldn't need to explicitly specify the
   // result types here.
   let builders = [
-    OpBuilder<"AffineMap map, ValueRange mapOperands", [{
+    OpBuilderDAG<(ins "AffineMap":$map, "ValueRange":$mapOperands),
+    [{
       build($_builder, $_state, $_builder.getIndexType(), map, mapOperands);
     }]>
   ];
@@ -212,14 +213,15 @@ def AffineForOp : Affine_Op<"for",
 
   let skipDefaultBuilders = 1;
   let builders = [
-    OpBuilder<"int64_t lowerBound, int64_t upperBound, int64_t step = 1, "
-              "ValueRange iterArgs = llvm::None, function_ref<void(OpBuilder "
-              "&, Location, Value, ValueRange)> bodyBuilder = nullptr">,
-    OpBuilder<"ValueRange lbOperands, AffineMap lbMap, "
-              "ValueRange ubOperands, AffineMap ubMap, "
-              "int64_t step = 1, ValueRange iterArgs = llvm::None, "
-              "function_ref<void(OpBuilder &, Location, Value, ValueRange)> "
-              "bodyBuilder = nullptr">
+    OpBuilderDAG<(ins "int64_t":$lowerBound, "int64_t":$upperBound,
+      CArg<"int64_t", "1">:$step, CArg<"ValueRange", "llvm::None">:$iterArgs,
+      CArg<"function_ref<void(OpBuilder &, Location, Value, ValueRange)>",
+           "nullptr">:$bodyBuilder)>,
+    OpBuilderDAG<(ins "ValueRange":$lbOperands, "AffineMap":$lbMap,
+      "ValueRange":$ubOperands, "AffineMap":$ubMap, CArg<"int64_t", "1">:$step,
+      CArg<"ValueRange", "llvm::None">:$iterArgs,
+      CArg<"function_ref<void(OpBuilder &, Location, Value, ValueRange)>",
+           "nullptr">:$bodyBuilder)>
   ];
 
   let extraClassDeclaration = [{
@@ -409,9 +411,10 @@ def AffineIfOp : Affine_Op<"if",
   let skipDefaultBuilders = 1;
 
   let builders = [
-    OpBuilder<"IntegerSet set, ValueRange args, bool withElseRegion">,
-    OpBuilder<"TypeRange resultTypes, IntegerSet set, ValueRange args,"
-              "bool withElseRegion">,
+    OpBuilderDAG<(ins "IntegerSet":$set, "ValueRange":$args,
+      "bool":$withElseRegion)>,
+    OpBuilderDAG<(ins "TypeRange":$resultTypes, "IntegerSet":$set,
+      "ValueRange":$args, "bool":$withElseRegion)>,
   ];
 
   let extraClassDeclaration = [{
@@ -502,11 +505,12 @@ def AffineLoadOp : AffineLoadOpBase<"load"> {
 
   let builders = [
     /// Builds an affine load op with the specified map and operands.
-    OpBuilder<"AffineMap map, ValueRange operands">,
+    OpBuilderDAG<(ins "AffineMap":$map, "ValueRange":$operands)>,
     /// Builds an affine load op with an identity map and operands.
-    OpBuilder<"Value memref, ValueRange indices = {}">,
+    OpBuilderDAG<(ins "Value":$memref, CArg<"ValueRange", "{}">:$indices)>,
     /// Builds an affine load op with the specified map and its operands.
-    OpBuilder<"Value memref, AffineMap map, ValueRange mapOperands">
+    OpBuilderDAG<(ins "Value":$memref, "AffineMap":$map,
+      "ValueRange":$mapOperands)>
   ];
 
   let extraClassDeclaration = extraClassDeclarationBase;
@@ -521,7 +525,7 @@ class AffineMinMaxOpBase<string mnemonic, list<OpTrait> traits = []> :
   let results = (outs Index);
 
   let builders = [
-    OpBuilder<"AffineMap affineMap, ValueRange mapOperands",
+    OpBuilderDAG<(ins "AffineMap":$affineMap, "ValueRange":$mapOperands),
     [{
       build($_builder, $_state, $_builder.getIndexType(), affineMap, mapOperands);
     }]>
@@ -646,18 +650,15 @@ def AffineParallelOp : Affine_Op<"parallel",
   let regions = (region SizedRegion<1>:$region);
 
   let builders = [
-    OpBuilder<"TypeRange resultTypes, "
-              "ArrayRef<AtomicRMWKind> reductions, "
-              "ArrayRef<int64_t> ranges">,
-    OpBuilder<"TypeRange resultTypes, "
-              "ArrayRef<AtomicRMWKind> reductions, "
-              "AffineMap lbMap, ValueRange lbArgs, "
-              "AffineMap ubMap, ValueRange ubArgs">,
-    OpBuilder<"TypeRange resultTypes, "
-              "ArrayRef<AtomicRMWKind> reductions, "
-              "AffineMap lbMap, ValueRange lbArgs, "
-              "AffineMap ubMap, ValueRange ubArgs, "
-              "ArrayRef<int64_t> steps">
+    OpBuilderDAG<(ins "TypeRange":$resultTypes,
+      "ArrayRef<AtomicRMWKind>":$reductions, "ArrayRef<int64_t>":$ranges)>,
+    OpBuilderDAG<(ins "TypeRange":$resultTypes,
+      "ArrayRef<AtomicRMWKind>":$reductions, "AffineMap":$lbMap,
+      "ValueRange":$lbArgs, "AffineMap":$ubMap, "ValueRange":$ubArgs)>,
+    OpBuilderDAG<(ins "TypeRange":$resultTypes,
+      "ArrayRef<AtomicRMWKind>":$reductions, "AffineMap":$lbMap,
+      "ValueRange":$lbArgs, "AffineMap":$ubMap, "ValueRange":$ubArgs,
+      "ArrayRef<int64_t>":$steps)>
   ];
 
   let extraClassDeclaration = [{
@@ -722,9 +723,10 @@ def AffinePrefetchOp : Affine_Op<"prefetch"> {
                      IntMaxValue<3>]>:$localityHint,
                    BoolAttr:$isDataCache);
 
-  let builders = [OpBuilder<
-    "Value memref, AffineMap map, ArrayRef<Value> mapOperands, bool isWrite,"
-    "unsigned localityHint, bool isDataCache",
+  let builders = [
+    OpBuilderDAG<(ins "Value":$memref, "AffineMap":$map,
+      "ArrayRef<Value>":$mapOperands, "bool":$isWrite, "unsigned":$localityHint,
+      "bool":$isDataCache),
     [{
       assert(map.getNumInputs() == mapOperands.size()
              && "inconsistent index info");
@@ -830,9 +832,10 @@ def AffineStoreOp : AffineStoreOpBase<"store"> {
 
   let skipDefaultBuilders = 1;
   let builders = [
-    OpBuilder<"Value valueToStore, Value memref, ValueRange indices">,
-    OpBuilder<"Value valueToStore, Value memref, AffineMap map, "
-              "ValueRange mapOperands">
+    OpBuilderDAG<(ins "Value":$valueToStore, "Value":$memref,
+      "ValueRange":$indices)>,
+    OpBuilderDAG<(ins "Value":$valueToStore, "Value":$memref, "AffineMap":$map,
+      "ValueRange":$mapOperands)>
   ];
 
   let extraClassDeclaration = extraClassDeclarationBase;
@@ -859,7 +862,7 @@ def AffineYieldOp : Affine_Op<"yield", [NoSideEffect, Terminator, ReturnLike]> {
   let arguments = (ins Variadic<AnyType>:$operands);
 
   let builders = [
-    OpBuilder<"", [{ build($_builder, $_state, llvm::None); }]>
+    OpBuilderDAG<(ins), [{ build($_builder, $_state, llvm::None); }]>
   ];
 
   let assemblyFormat = "attr-dict ($operands^ `:` type($operands))?";

diff  --git a/mlir/include/mlir/Dialect/Async/IR/AsyncOps.td b/mlir/include/mlir/Dialect/Async/IR/AsyncOps.td
index 0cc0c7fe25a8..83f968fa6232 100644
--- a/mlir/include/mlir/Dialect/Async/IR/AsyncOps.td
+++ b/mlir/include/mlir/Dialect/Async/IR/AsyncOps.td
@@ -118,7 +118,8 @@ def Async_AwaitOp : Async_Op<"await", [NoSideEffect]> {
   let skipDefaultBuilders = 1;
 
   let builders = [
-    OpBuilder<"Value operand, ArrayRef<NamedAttribute> attrs = {}">,
+    OpBuilderDAG<(ins "Value":$operand,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs)>,
   ];
 
   let extraClassDeclaration = [{

diff  --git a/mlir/include/mlir/Dialect/GPU/GPUOps.td b/mlir/include/mlir/Dialect/GPU/GPUOps.td
index 180e9cf67d22..8ad3c9abe6cc 100644
--- a/mlir/include/mlir/Dialect/GPU/GPUOps.td
+++ b/mlir/include/mlir/Dialect/GPU/GPUOps.td
@@ -197,10 +197,10 @@ def GPU_GPUFuncOp : GPU_Op<"func", [HasParent<"GPUModuleOp">,
   let skipDefaultBuilders = 1;
 
   let builders = [
-    OpBuilder<"StringRef name, "
-              "FunctionType type, TypeRange workgroupAttributions = {}, "
-              "TypeRange privateAttributions = {}, "
-              "ArrayRef<NamedAttribute> attrs = {}">
+    OpBuilderDAG<(ins "StringRef":$name, "FunctionType":$type,
+      CArg<"TypeRange", "{}">:$workgroupAttributions,
+      CArg<"TypeRange", "{}">:$privateAttributions,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs)>
   ];
 
   let extraClassDeclaration = [{
@@ -363,9 +363,8 @@ def GPU_LaunchFuncOp : GPU_Op<"launch_func">,
   let skipDefaultBuilders = 1;
 
   let builders = [
-    OpBuilder<"GPUFuncOp kernelFunc, "
-              "KernelDim3 gridSize, KernelDim3 blockSize, "
-              "ValueRange kernelOperands">
+    OpBuilderDAG<(ins "GPUFuncOp":$kernelFunc, "KernelDim3":$gridSize,
+      "KernelDim3":$blockSize, "ValueRange":$kernelOperands)>
   ];
 
   let extraClassDeclaration = [{
@@ -482,9 +481,9 @@ def GPU_LaunchOp : GPU_Op<"launch">,
   let skipDefaultBuilders = 1;
 
   let builders = [
-    OpBuilder<"Value gridSizeX,"
-              "Value gridSizeY, Value gridSizeZ, Value blockSizeX,"
-              "Value blockSizeY, Value blockSizeZ">
+    OpBuilderDAG<(ins "Value":$gridSizeX, "Value":$gridSizeY,
+      "Value":$gridSizeZ, "Value":$blockSizeX, "Value":$blockSizeY,
+      "Value":$blockSizeZ)>
   ];
 
   let extraClassDeclaration = [{
@@ -529,7 +528,7 @@ def GPU_ReturnOp : GPU_Op<"return", [HasParent<"GPUFuncOp">, NoSideEffect,
     by an invocation of the `gpu.func`.
   }];
 
-  let builders = [OpBuilder<"", " // empty">];
+  let builders = [OpBuilderDAG<(ins), [{ // empty}]>];
 
   let parser = [{ return parseReturnOp(parser, result); }];
   let printer = [{ p << getOperationName(); }];
@@ -708,7 +707,7 @@ def GPU_GPUModuleOp : GPU_Op<"module", [
 
     ```
   }];
-  let builders = [OpBuilder<"StringRef name">];
+  let builders = [OpBuilderDAG<(ins "StringRef":$name)>];
   let parser = [{ return ::parseGPUModuleOp(parser, result); }];
   let printer = [{ return ::print(p, *this); }];
   let regions = (region SizedRegion<1>:$body);

diff  --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
index 1929ee48e32d..075df4938b90 100644
--- a/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
+++ b/mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td
@@ -22,9 +22,9 @@ class LLVM_Builder<string builder> {
   string llvmBuilder = builder;
 }
 
-def LLVM_OneResultOpBuilder : OpBuilder<
-  "Type resultType, ValueRange operands, "
-  "ArrayRef<NamedAttribute> attributes = {}",
+def LLVM_OneResultOpBuilder :
+  OpBuilderDAG<(ins "Type":$resultType, "ValueRange":$operands,
+    CArg<"ArrayRef<NamedAttribute>", "{}">:$attributes),
   [{
     if (resultType) $_state.addTypes(resultType);
     $_state.addOperands(operands);
@@ -33,8 +33,9 @@ def LLVM_OneResultOpBuilder : OpBuilder<
     }
   }]>;
 
-def LLVM_ZeroResultOpBuilder : OpBuilder<
-  "ValueRange operands, ArrayRef<NamedAttribute> attributes = {}",
+def LLVM_ZeroResultOpBuilder :
+  OpBuilderDAG<(ins "ValueRange":$operands,
+    CArg<"ArrayRef<NamedAttribute>", "{}">:$attributes),
   [{
     $_state.addOperands(operands);
     for (auto namedAttr : attributes) {
@@ -42,8 +43,8 @@ def LLVM_ZeroResultOpBuilder : OpBuilder<
     }
   }]>;
 
-class LLVM_TwoBuilders<OpBuilder b1, OpBuilder b2> {
-  list<OpBuilder> builders = [b1, b2];
+class LLVM_TwoBuilders<OpBuilderDAG b1, OpBuilderDAG b2> {
+  list<OpBuilderDAG> builders = [b1, b2];
 }
 
 // Base class for LLVM operations with one result.
@@ -54,8 +55,9 @@ class LLVM_OneResultOp<string mnemonic, list<OpTrait> traits = []> :
 
 // Compatibility builder that takes an instance of wrapped llvm::VoidType
 // to indicate no result.
-def LLVM_VoidResultTypeOpBuilder : OpBuilder<
-  "Type resultType, ValueRange operands, ArrayRef<NamedAttribute> attributes = {}",
+def LLVM_VoidResultTypeOpBuilder :
+  OpBuilderDAG<(ins "Type":$resultType, "ValueRange":$operands,
+    CArg<"ArrayRef<NamedAttribute>", "{}">:$attributes),
   [{
     auto llvmType = resultType.dyn_cast<LLVMType>(); (void)llvmType;
     assert(llvmType && "result must be an LLVM type");
@@ -70,9 +72,9 @@ class LLVM_ZeroResultOp<string mnemonic, list<OpTrait> traits = []> :
     LLVM_TwoBuilders<LLVM_VoidResultTypeOpBuilder, LLVM_ZeroResultOpBuilder>;
 
 // Opaque builder used for terminator operations that contain successors.
-def LLVM_TerminatorPassthroughOpBuilder : OpBuilder<
-  "ValueRange operands, SuccessorRange destinations, "
-  "ArrayRef<NamedAttribute> attributes = {}",
+def LLVM_TerminatorPassthroughOpBuilder :
+  OpBuilderDAG<(ins "ValueRange":$operands, "SuccessorRange":$destinations,
+    CArg<"ArrayRef<NamedAttribute>", "{}">:$attributes),
   [{
     $_state.addOperands(operands);
     $_state.addSuccessors(destinations);
@@ -158,8 +160,9 @@ def LLVM_ICmpOp : LLVM_OneResultOp<"icmp", [NoSideEffect]> {
   let llvmBuilder = [{
     $res = builder.CreateICmp(getLLVMCmpPredicate($predicate), $lhs, $rhs);
   }];
-  let builders = [OpBuilder<
-    "ICmpPredicate predicate, Value lhs, Value rhs", [{
+  let builders = [
+    OpBuilderDAG<(ins "ICmpPredicate":$predicate, "Value":$lhs, "Value":$rhs),
+    [{
       build($_builder, $_state, LLVMType::getInt1Ty(lhs.getType().getContext()),
             $_builder.getI64IntegerAttr(static_cast<int64_t>(predicate)), lhs, rhs);
     }]>];
@@ -204,8 +207,9 @@ def LLVM_FCmpOp : LLVM_OneResultOp<"fcmp", [NoSideEffect]> {
   let llvmBuilder = [{
     $res = builder.CreateFCmp(getLLVMCmpPredicate($predicate), $lhs, $rhs);
   }];
-  let builders = [OpBuilder<
-    "FCmpPredicate predicate, Value lhs, Value rhs", [{
+  let builders = [
+    OpBuilderDAG<(ins "FCmpPredicate":$predicate, "Value":$lhs, "Value":$rhs),
+    [{
       build($_builder, $_state, LLVMType::getInt1Ty(lhs.getType().getContext()),
             $_builder.getI64IntegerAttr(static_cast<int64_t>(predicate)), lhs, rhs);
     }]>];
@@ -259,8 +263,9 @@ def LLVM_AllocaOp :
     }] # setAlignmentCode # [{
     $res = inst;
   }];
-  let builders = [OpBuilder<
-    "Type resultType, Value arraySize, unsigned alignment",
+  let builders = [
+    OpBuilderDAG<(ins "Type":$resultType, "Value":$arraySize,
+      "unsigned":$alignment),
     [{
       if (alignment == 0)
         return build($_builder, $_state, resultType, arraySize, IntegerAttr());
@@ -291,16 +296,16 @@ def LLVM_LoadOp :
   }] # setAlignmentCode # setNonTemporalMetadataCode # [{
     $res = inst;
   }];
-  let builders = [OpBuilder<
-    "Value addr, unsigned alignment = 0, bool isVolatile = false, "
-    "bool isNonTemporal = false",
+  let builders = [
+    OpBuilderDAG<(ins "Value":$addr, CArg<"unsigned", "0">:$alignment,
+      CArg<"bool", "false">:$isVolatile, CArg<"bool", "false">:$isNonTemporal),
     [{
       auto type = addr.getType().cast<LLVMType>().getPointerElementTy();
       build($_builder, $_state, type, addr, alignment, isVolatile, isNonTemporal);
     }]>,
-    OpBuilder<
-    "Type t, Value addr, unsigned alignment = 0, bool isVolatile = false, "
-    "bool isNonTemporal = false">];
+    OpBuilderDAG<(ins "Type":$t, "Value":$addr,
+      CArg<"unsigned", "0">:$alignment, CArg<"bool", "false">:$isVolatile,
+      CArg<"bool", "false">:$isNonTemporal)>];
   let parser = [{ return parseLoadOp(parser, result); }];
   let printer = [{ printLoadOp(p, *this); }];
 }
@@ -314,9 +319,10 @@ def LLVM_StoreOp :
   string llvmBuilder = [{
     auto *inst = builder.CreateStore($value, $addr, $volatile_);
   }] # setAlignmentCode # setNonTemporalMetadataCode;
-  let builders = [OpBuilder<
-    "Value value, Value addr, unsigned alignment = 0, bool isVolatile = false, "
-    "bool isNonTemporal = false">
+  let builders = [
+    OpBuilderDAG<(ins "Value":$value, "Value":$addr,
+      CArg<"unsigned", "0">:$alignment, CArg<"bool", "false">:$isVolatile,
+      CArg<"bool", "false">:$isNonTemporal)>
     ];
   let parser = [{ return parseStoreOp(parser, result); }];
   let printer = [{ printStoreOp(p, *this); }];
@@ -373,16 +379,16 @@ def LLVM_InvokeOp : LLVM_Op<"invoke", [
   let successors = (successor AnySuccessor:$normalDest,
                               AnySuccessor:$unwindDest);
 
-  let builders = [OpBuilder<
-    "TypeRange tys, FlatSymbolRefAttr callee, ValueRange ops, Block* normal, "
-    "ValueRange normalOps, Block* unwind, ValueRange unwindOps",
+  let builders = [
+    OpBuilderDAG<(ins "TypeRange":$tys, "FlatSymbolRefAttr":$callee,
+      "ValueRange":$ops, "Block*":$normal, "ValueRange":$normalOps,
+      "Block*":$unwind, "ValueRange":$unwindOps),
     [{
       $_state.addAttribute("callee", callee);
       build($_builder, $_state, tys, ops, normal, normalOps, unwind, unwindOps);
     }]>,
-    OpBuilder<
-    "TypeRange tys, ValueRange ops, Block* normal, "
-    "ValueRange normalOps, Block* unwind, ValueRange unwindOps",
+    OpBuilderDAG<(ins "TypeRange":$tys, "ValueRange":$ops, "Block*":$normal,
+      "ValueRange":$normalOps, "Block*":$unwind, "ValueRange":$unwindOps),
     [{
       build($_builder, $_state, tys, /*callee=*/FlatSymbolRefAttr(), ops, normalOps,
             unwindOps, normal, unwind);
@@ -403,9 +409,9 @@ def LLVM_CallOp : LLVM_Op<"call">,
                   Results<(outs Variadic<LLVM_Type>)> {
   let arguments = (ins OptionalAttr<FlatSymbolRefAttr>:$callee,
                    Variadic<LLVM_Type>);
-  let builders = [OpBuilder<
-    "LLVMFuncOp func, ValueRange operands, "
-    "ArrayRef<NamedAttribute> attributes = {}",
+  let builders = [
+    OpBuilderDAG<(ins "LLVMFuncOp":$func, "ValueRange":$operands,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attributes),
     [{
       LLVMType resultType = func.getType().getFunctionResultType();
       if (!resultType.isVoidTy())
@@ -423,8 +429,9 @@ def LLVM_ExtractElementOp : LLVM_OneResultOp<"extractelement", [NoSideEffect]> {
   string llvmBuilder = [{
     $res = builder.CreateExtractElement($vector, $position);
   }];
-  let builders = [OpBuilder<
-    "Value vector, Value position, ArrayRef<NamedAttribute> attrs = {}">];
+  let builders = [
+    OpBuilderDAG<(ins "Value":$vector, "Value":$position,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs)>];
   let parser = [{ return parseExtractElementOp(parser, result); }];
   let printer = [{ printExtractElementOp(p, *this); }];
 }
@@ -452,8 +459,8 @@ def LLVM_InsertValueOp : LLVM_OneResultOp<"insertvalue", [NoSideEffect]> {
     $res = builder.CreateInsertValue($container, $value,
                                      extractPosition($position));
   }];
-  let builders = [OpBuilder<
-    "Value container, Value value, ArrayAttr position",
+  let builders = [
+    OpBuilderDAG<(ins "Value":$container, "Value":$value, "ArrayAttr":$position),
     [{
       build($_builder, $_state, container.getType(), container, value, position);
     }]>];
@@ -467,8 +474,9 @@ def LLVM_ShuffleVectorOp : LLVM_OneResultOp<"shufflevector", [NoSideEffect]> {
       SmallVector<int, 4> mask(position.begin(), position.end());
       $res = builder.CreateShuffleVector($v1, $v2, mask);
   }];
-  let builders = [OpBuilder<
-    "Value v1, Value v2, ArrayAttr mask, ArrayRef<NamedAttribute> attrs = {}">];
+  let builders = [
+    OpBuilderDAG<(ins "Value":$v1, "Value":$v2, "ArrayAttr":$mask,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs)>];
   let verifier = [{
     auto wrappedVectorType1 = v1().getType().cast<LLVMType>();
     auto wrappedVectorType2 = v2().getType().cast<LLVMType>();
@@ -491,8 +499,9 @@ def LLVM_SelectOp
           "$res = builder.CreateSelect($condition, $trueValue, $falseValue);"> {
   let arguments = (ins LLVM_ScalarOrVectorOf<LLVM_i1>:$condition,
                    LLVM_Type:$trueValue, LLVM_Type:$falseValue);
-  let builders = [OpBuilder<
-    "Value condition, Value lhs, Value rhs", [{
+  let builders = [
+    OpBuilderDAG<(ins "Value":$condition, "Value":$lhs, "Value":$rhs),
+    [{
       build($_builder, $_state, lhs.getType(), condition, lhs, rhs);
     }]>];
   let assemblyFormat = "operands attr-dict `:` type($condition) `,` type($res)";
@@ -528,10 +537,12 @@ def LLVM_CondBrOp : LLVM_TerminatorOp<"cond_br",
     attr-dict
   }];
 
-  let builders = [OpBuilder<
-     "Value condition, Block *trueDest, ValueRange trueOperands,"
-     "Block *falseDest, ValueRange falseOperands,"
-     "Optional<std::pair<uint32_t, uint32_t>> weights = {}", [{
+  let builders = [
+    OpBuilderDAG<(ins "Value":$condition, "Block *":$trueDest,
+      "ValueRange":$trueOperands, "Block *":$falseDest,
+      "ValueRange":$falseOperands,
+      CArg<"Optional<std::pair<uint32_t, uint32_t>>", "{}">:$weights),
+    [{
         ElementsAttr weightsAttr;
         if (weights) {
           weightsAttr =
@@ -540,9 +551,10 @@ def LLVM_CondBrOp : LLVM_TerminatorOp<"cond_br",
         }
         build($_builder, $_state, condition, trueOperands, falseOperands, weightsAttr,
               trueDest, falseDest);
-  }]>, OpBuilder<
-    "Value condition, Block *trueDest, Block *falseDest, "
-    "ValueRange falseOperands = {}", [{
+  }]>,
+  OpBuilderDAG<(ins "Value":$condition, "Block *":$trueDest,
+    "Block *":$falseDest, CArg<"ValueRange", "{}">:$falseOperands),
+  [{
       build($_builder, $_state, condition, trueDest, ValueRange(), falseDest,
             falseOperands);
   }]>, LLVM_TerminatorPassthroughOpBuilder];
@@ -633,20 +645,21 @@ def LLVM_AddressOfOp : LLVM_OneResultOp<"mlir.addressof"> {
   let summary = "Creates a pointer pointing to a global or a function";
 
   let builders = [
-    OpBuilder<"LLVMType resType, "
-              "StringRef name, ArrayRef<NamedAttribute> attrs = {}", [{
+    OpBuilderDAG<(ins "LLVMType":$resType, "StringRef":$name,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs),
+    [{
       $_state.addAttribute("global_name",$_builder.getSymbolRefAttr(name));
       $_state.addAttributes(attrs);
       $_state.addTypes(resType);}]>,
-
-    OpBuilder<"GlobalOp global, "
-              "ArrayRef<NamedAttribute> attrs = {}", [{
+    OpBuilderDAG<(ins "GlobalOp":$global,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs),
+    [{
       build($_builder, $_state,
             global.getType().getPointerTo(global.addr_space()),
             global.sym_name(), attrs);}]>,
-
-    OpBuilder<"LLVMFuncOp func, "
-              "ArrayRef<NamedAttribute> attrs = {}", [{
+    OpBuilderDAG<(ins "LLVMFuncOp":$func,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs),
+    [{
       build($_builder, $_state,
             func.getType().getPointerTo(), func.getName(), attrs);}]>
   ];
@@ -694,10 +707,9 @@ def LLVM_GlobalOp
   let regions = (region AnyRegion:$initializer);
 
   let builders = [
-    OpBuilder<"LLVMType type, "
-              "bool isConstant, Linkage linkage, StringRef name, "
-              "Attribute value, unsigned addrSpace = 0, "
-              "ArrayRef<NamedAttribute> attrs = {}">
+    OpBuilderDAG<(ins "LLVMType":$type, "bool":$isConstant, "Linkage":$linkage,
+      "StringRef":$name, "Attribute":$value, CArg<"unsigned", "0">:$addrSpace,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs)>
   ];
 
   let extraClassDeclaration = [{
@@ -742,10 +754,10 @@ def LLVM_LLVMFuncOp
   let skipDefaultBuilders = 1;
 
   let builders = [
-    OpBuilder<"StringRef name, "
-              "LLVMType type, Linkage linkage = Linkage::External, "
-              "ArrayRef<NamedAttribute> attrs = {}, "
-              "ArrayRef<MutableDictionaryAttr> argAttrs = {}">
+    OpBuilderDAG<(ins "StringRef":$name, "LLVMType":$type,
+      CArg<"Linkage", "Linkage::External">:$linkage,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs,
+      CArg<"ArrayRef<MutableDictionaryAttr>", "{}">:$argAttrs)>
   ];
 
   let extraClassDeclaration = [{

diff  --git a/mlir/include/mlir/Dialect/Linalg/IR/LinalgOps.td b/mlir/include/mlir/Dialect/Linalg/IR/LinalgOps.td
index 23e221d0b237..6a78b657aae0 100644
--- a/mlir/include/mlir/Dialect/Linalg/IR/LinalgOps.td
+++ b/mlir/include/mlir/Dialect/Linalg/IR/LinalgOps.td
@@ -47,8 +47,8 @@ def Linalg_RangeOp :
     %3 = linalg.range %0:%1:%2 : !linalg.range
     ````
   }];
-  let builders = [OpBuilder<
-    "Value min, Value max, Value step",
+  let builders = [
+    OpBuilderDAG<(ins "Value":$min, "Value":$max, "Value":$step),
     [{
       auto rangeType = RangeType::get($_builder.getContext());
       build($_builder, $_state, rangeType, min, max, step);
@@ -64,12 +64,13 @@ class Linalg_ReshapeLikeOp<string mnemonic, list<OpTrait> traits = []> :
   let builders = [
     // Builders for a contracting reshape whose result type is computed from
     // `src` and `reassociation`.
-    OpBuilder<"Value src, "
-              "ArrayRef<ReassociationExprs> reassociation, "
-              "ArrayRef<NamedAttribute> attrs = {}">,
-    OpBuilder<"Value src, "
-              "ArrayRef<ReassociationIndices> reassociation, "
-              "ArrayRef<NamedAttribute> attrs = {}", [{
+    OpBuilderDAG<(ins "Value":$src,
+      "ArrayRef<ReassociationExprs>":$reassociation,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs)>,
+    OpBuilderDAG<(ins "Value":$src,
+      "ArrayRef<ReassociationIndices>":$reassociation,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs),
+    [{
       auto reassociationMaps =
           convertReassociationIndicesToMaps($_builder, reassociation);
       build($_builder, $_state, src, reassociationMaps, attrs);
@@ -77,12 +78,13 @@ class Linalg_ReshapeLikeOp<string mnemonic, list<OpTrait> traits = []> :
 
     // Builders for a reshape whose result type is passed explicitly. This may
     // be either a contracting or expanding reshape.
-    OpBuilder<"Type resultType, Value src, "
-              "ArrayRef<ReassociationExprs> reassociation, "
-              "ArrayRef<NamedAttribute> attrs = {}">,
-    OpBuilder<"Type resultType, Value src, "
-              "ArrayRef<ReassociationIndices> reassociation, "
-              "ArrayRef<NamedAttribute> attrs = {}", [{
+    OpBuilderDAG<(ins "Type":$resultType, "Value":$src,
+      "ArrayRef<ReassociationExprs>":$reassociation,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs)>,
+    OpBuilderDAG<(ins "Type":$resultType, "Value":$src,
+      "ArrayRef<ReassociationIndices>":$reassociation,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs),
+    [{
       auto reassociationMaps =
           convertReassociationIndicesToMaps($_builder, reassociation);
       build($_builder, $_state, resultType, src, reassociationMaps, attrs);
@@ -258,7 +260,7 @@ def Linalg_SliceOp : Linalg_Op<"slice", [
       ```
   }];
 
-  let builders = [OpBuilder<"Value base, ValueRange indexings">];
+  let builders = [OpBuilderDAG<(ins "Value":$base, "ValueRange":$indexings)>];
 
   let extraClassDeclaration = [{
     enum { FirstIndexingOperand = 1 };

diff  --git a/mlir/include/mlir/Dialect/Linalg/IR/LinalgStructuredOps.td b/mlir/include/mlir/Dialect/Linalg/IR/LinalgStructuredOps.td
index ba8fa644c1fb..6338dae1af08 100644
--- a/mlir/include/mlir/Dialect/Linalg/IR/LinalgStructuredOps.td
+++ b/mlir/include/mlir/Dialect/Linalg/IR/LinalgStructuredOps.td
@@ -128,11 +128,11 @@ def CopyOp : LinalgStructured_Op<"copy", [
 
   // TODO: this should go away once the usage of OptionalAttr triggers emission
   // of builders with default arguments left unspecified.
-  let builders = [OpBuilder<
-    "Value input, Value output", [{
-    return build(
-      $_builder, $_state, input, output, AffineMapAttr(), AffineMapAttr());
-  }]>];
+  let builders = [OpBuilderDAG<(ins "Value":$input, "Value":$output),
+    [{
+      return build(
+        $_builder, $_state, input, output, AffineMapAttr(), AffineMapAttr());
+    }]>];
 
   let extraClassDeclaration = libraryCallName # [{
     // Rank-polymorphic.
@@ -662,27 +662,22 @@ def GenericOp : GenericOpBase<"generic"> {
   }];
 
   let builders = [
-    OpBuilder<
-      "TypeRange resultTensorTypes,"
-      "ValueRange inputs, ValueRange outputBuffers, ValueRange initTensors, "
-      "ArrayRef<AffineMap> indexingMaps, ArrayRef<StringRef> iteratorTypes, "
-      "StringRef doc, StringRef libraryCall, IntegerAttr symbolSource, "
-      "function_ref<void(OpBuilder &, Location, ValueRange)> = nullptr">,
-    OpBuilder<
-      "ValueRange inputs, ValueRange outputBuffers, "
-      "ArrayRef<AffineMap> indexingMaps, ArrayRef<StringRef> iteratorTypes, "
-      "StringRef doc, StringRef libraryCall, IntegerAttr symbolSource, "
-      "function_ref<void(OpBuilder &, Location, ValueRange)> = nullptr">,
-    OpBuilder<
-      "TypeRange resultTensorTypes,"
-      "ValueRange inputs, ValueRange outputBuffers, ValueRange initTensors, "
-      "ArrayRef<AffineMap> indexingMaps, ArrayRef<StringRef> iteratorTypes, "
-      "function_ref<void(OpBuilder &, Location, ValueRange)> = nullptr">,
-    OpBuilder<
-      "ValueRange inputs, "
-      "ValueRange outputBuffers, ArrayRef<AffineMap> indexingMaps, "
-      "ArrayRef<StringRef> iteratorTypes, "
-      "function_ref<void(OpBuilder &, Location, ValueRange)> = nullptr">
+    OpBuilderDAG<(ins "TypeRange":$resultTensorTypes, "ValueRange":$inputs,
+      "ValueRange":$outputBuffers, "ValueRange":$initTensors,
+      "ArrayRef<AffineMap>":$indexingMaps, "ArrayRef<StringRef>":$iteratorTypes,
+      "StringRef":$doc, "StringRef":$libraryCall, "IntegerAttr":$symbolSource,
+      CArg<"function_ref<void(OpBuilder &, Location, ValueRange)>", "nullptr">)>,
+    OpBuilderDAG<(ins "ValueRange":$inputs, "ValueRange":$outputBuffers,
+      "ArrayRef<AffineMap>":$indexingMaps, "ArrayRef<StringRef>":$iteratorTypes,
+      "StringRef":$doc, "StringRef":$libraryCall, "IntegerAttr":$symbolSource,
+      CArg<"function_ref<void(OpBuilder &, Location, ValueRange)>", "nullptr">)>,
+    OpBuilderDAG<(ins "TypeRange":$resultTensorTypes, "ValueRange":$inputs,
+      "ValueRange":$outputBuffers, "ValueRange":$initTensors,
+      "ArrayRef<AffineMap>":$indexingMaps, "ArrayRef<StringRef>":$iteratorTypes,
+      CArg<"function_ref<void(OpBuilder &, Location, ValueRange)>", "nullptr">)>,
+    OpBuilderDAG<(ins "ValueRange":$inputs, "ValueRange":$outputBuffers,
+      "ArrayRef<AffineMap>":$indexingMaps, "ArrayRef<StringRef>":$iteratorTypes,
+      CArg<"function_ref<void(OpBuilder &, Location, ValueRange)>", "nullptr">)>
   ];
   let verifier = [{ return ::verify(*this); }];
 
@@ -840,27 +835,26 @@ def IndexedGenericOp : GenericOpBase<"indexed_generic"> {
   }];
 
   let builders = [
-    OpBuilder<
-      "TypeRange resultTensorTypes,"
-      "ValueRange inputs, ValueRange outputBuffers, ValueRange initTensors, "
-      "ArrayRef<AffineMap> indexingMaps, ArrayRef<StringRef> iteratorTypes, "
-      "StringRef doc, StringRef libraryCall, IntegerAttr symbolSource, "
-      "function_ref<void(OpBuilder &, Location, ValueRange, ValueRange)> = nullptr">,
-    OpBuilder<
-      "ValueRange inputs, ValueRange outputBuffers, "
-      "ArrayRef<AffineMap> indexingMaps, ArrayRef<StringRef> iteratorTypes, "
-      "StringRef doc, StringRef libraryCall, IntegerAttr symbolSource, "
-      "function_ref<void(OpBuilder &, Location, ValueRange, ValueRange)> = nullptr">,
-    OpBuilder<
-      "TypeRange resultTensorTypes,"
-      "ValueRange inputs, ValueRange outputBuffers, ValueRange initTensors, "
-      "ArrayRef<AffineMap> indexingMaps, ArrayRef<StringRef> iteratorTypes, "
-      "function_ref<void(OpBuilder &, Location, ValueRange, ValueRange)> = nullptr">,
-    OpBuilder<
-      "ValueRange inputs, "
-      "ValueRange outputBuffers, ArrayRef<AffineMap> indexingMaps, "
-      "ArrayRef<StringRef> iteratorTypes, "
-      "function_ref<void(OpBuilder &, Location, ValueRange, ValueRange)> = nullptr">
+    OpBuilderDAG<(ins "TypeRange":$resultTensorTypes, "ValueRange":$inputs,
+      "ValueRange":$outputBuffers, "ValueRange":$initTensors,
+      "ArrayRef<AffineMap>":$indexingMaps, "ArrayRef<StringRef>":$iteratorTypes,
+      "StringRef":$doc, "StringRef":$libraryCall, "IntegerAttr":$symbolSource,
+      CArg<"function_ref<void(OpBuilder &, Location, ValueRange, ValueRange)>",
+           "nullptr">)>,
+    OpBuilderDAG<(ins "ValueRange":$inputs, "ValueRange":$outputBuffers,
+      "ArrayRef<AffineMap>":$indexingMaps, "ArrayRef<StringRef>":$iteratorTypes,
+      "StringRef":$doc, "StringRef":$libraryCall, "IntegerAttr":$symbolSource,
+      CArg<"function_ref<void(OpBuilder &, Location, ValueRange, ValueRange)>",
+           "nullptr">)>,
+    OpBuilderDAG<(ins "TypeRange":$resultTensorTypes, "ValueRange":$inputs,
+      "ValueRange":$outputBuffers, "ValueRange":$initTensors,
+      "ArrayRef<AffineMap>":$indexingMaps, "ArrayRef<StringRef>":$iteratorTypes,
+      CArg<"function_ref<void(OpBuilder &, Location, ValueRange, ValueRange)>",
+           "nullptr">)>,
+    OpBuilderDAG<(ins "ValueRange":$inputs, "ValueRange":$outputBuffers,
+      "ArrayRef<AffineMap>":$indexingMaps, "ArrayRef<StringRef>":$iteratorTypes,
+      CArg<"function_ref<void(OpBuilder &, Location, ValueRange, ValueRange)>",
+           "nullptr">)>
   ];
   let verifier = [{ return ::verify(*this); }];
 

diff  --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
index 24dc01d7e3e9..7ed84000a694 100644
--- a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
+++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
@@ -390,9 +390,7 @@ def OpenACC_YieldOp : OpenACC_Op<"yield", [Terminator,
 
   let arguments = (ins Variadic<AnyType>:$operands);
 
-  let builders = [
-    OpBuilder<"", [{ /* nothing to do */ }]>
-  ];
+  let builders = [OpBuilderDAG<(ins), [{ /* nothing to do */ }]>];
 
   let verifier = ?;
 

diff  --git a/mlir/include/mlir/Dialect/PDL/IR/PDLOps.td b/mlir/include/mlir/Dialect/PDL/IR/PDLOps.td
index 02ccf8b8638d..1cbc044680e3 100644
--- a/mlir/include/mlir/Dialect/PDL/IR/PDLOps.td
+++ b/mlir/include/mlir/Dialect/PDL/IR/PDLOps.td
@@ -59,8 +59,8 @@ def PDL_ApplyConstraintOp
   }];
 
   let builders = [
-    OpBuilder<"StringRef name, "
-              "ValueRange args = {}, ArrayRef<Attribute> params = {}", [{
+    OpBuilderDAG<(ins "StringRef":$name, CArg<"ValueRange", "{}">:$args,
+      CArg<"ArrayRef<Attribute>", "{}">:$params), [{
       build($_builder, $_state, $_builder.getStringAttr(name), args,
             params.empty() ? ArrayAttr() : $_builder.getArrayAttr(params));
     }]>,
@@ -103,11 +103,11 @@ def PDL_AttributeOp : PDL_Op<"attribute"> {
   let assemblyFormat = "attr-dict (`:` $type^)? ($value^)?";
 
   let builders = [
-    OpBuilder<"Value type = Value()", [{
+    OpBuilderDAG<(ins CArg<"Value", "Value()">:$type), [{
       build($_builder, $_state, $_builder.getType<AttributeType>(), type,
             Attribute());
     }]>,
-    OpBuilder<"Attribute attr", [{
+    OpBuilderDAG<(ins "Attribute":$attr), [{
       build($_builder, $_state, $_builder.getType<AttributeType>(), Value(), attr);
     }]>,
   ];
@@ -199,7 +199,7 @@ def PDL_InputOp : PDL_Op<"input", [HasParent<"pdl::PatternOp">]> {
   let assemblyFormat = "(`:` $type^)? attr-dict";
 
   let builders = [
-    OpBuilder<"", [{
+    OpBuilderDAG<(ins), [{
       build($_builder, $_state, $_builder.getType<ValueType>(), Value());
     }]>,
   ];
@@ -253,11 +253,11 @@ def PDL_OperationOp
   let results = (outs PDL_Operation:$op,
                       Variadic<PDL_Value>:$results);
   let builders = [
-    OpBuilder<"Optional<StringRef> name  = llvm::None, "
-              "ValueRange operandValues = llvm::None, "
-              "ArrayRef<StringRef> attrNames = llvm::None, "
-              "ValueRange attrValues  = llvm::None, "
-              "ValueRange resultTypes = llvm::None", [{
+    OpBuilderDAG<(ins CArg<"Optional<StringRef>", "llvm::None">:$name,
+      CArg<"ValueRange", "llvm::None">:$operandValues,
+      CArg<"ArrayRef<StringRef>", "llvm::None">:$attrNames,
+      CArg<"ValueRange", "llvm::None">:$attrValues,
+      CArg<"ValueRange", "llvm::None">:$resultTypes), [{
       auto nameAttr = name ? StringAttr() : $_builder.getStringAttr(*name);
       build($_builder, $_state, $_builder.getType<OperationType>(), {}, nameAttr,
             operandValues, attrValues, $_builder.getStrArrayAttr(attrNames),
@@ -311,9 +311,9 @@ def PDL_PatternOp : PDL_Op<"pattern", [IsolatedFromAbove, Symbol]> {
   }];
 
   let builders = [
-    OpBuilder<"Optional<StringRef> rootKind = llvm::None, "
-              "Optional<uint16_t> benefit = 1, "
-              "Optional<StringRef> name = llvm::None">,
+    OpBuilderDAG<(ins CArg<"Optional<StringRef>", "llvm::None">:$rootKind,
+      CArg<"Optional<uint16_t>", "1">:$benefit,
+      CArg<"Optional<StringRef>", "llvm::None">:$name)>,
   ];
   let extraClassDeclaration = [{
     //===------------------------------------------------------------------===//
@@ -452,7 +452,7 @@ def PDL_TypeOp : PDL_Op<"type"> {
   let assemblyFormat = "attr-dict (`:` $type^)?";
 
   let builders = [
-    OpBuilder<"Type ty = Type()", [{
+    OpBuilderDAG<(ins CArg<"Type", "Type()">:$ty), [{
       build($_builder, $_state, $_builder.getType<AttributeType>(),
             ty ? TypeAttr::get(ty) : TypeAttr());
     }]>,

diff  --git a/mlir/include/mlir/Dialect/PDLInterp/IR/PDLInterpOps.td b/mlir/include/mlir/Dialect/PDLInterp/IR/PDLInterpOps.td
index 2873a4685936..df49eb37b2a5 100644
--- a/mlir/include/mlir/Dialect/PDLInterp/IR/PDLInterpOps.td
+++ b/mlir/include/mlir/Dialect/PDLInterp/IR/PDLInterpOps.td
@@ -347,9 +347,9 @@ def PDLInterp_CreateAttributeOp
   let assemblyFormat = "$value attr-dict";
 
   let builders = [
-    OpBuilder<"Attribute value", [{
-    build($_builder, $_state, $_builder.getType<pdl::AttributeType>(), value);
-  }]>];
+    OpBuilderDAG<(ins "Attribute":$value), [{
+      build($_builder, $_state, $_builder.getType<pdl::AttributeType>(), value);
+    }]>];
 }
 
 //===----------------------------------------------------------------------===//
@@ -411,11 +411,12 @@ def PDLInterp_CreateOperationOp
   let results = (outs PDL_Operation:$operation);
 
   let builders = [
-    OpBuilder<"StringRef name, ValueRange types, ValueRange operands, "
-              "ValueRange attributes, ArrayAttr attributeNames", [{
-    build($_builder, $_state, $_builder.getType<pdl::OperationType>(), name,
-          operands, attributes, attributeNames, types);
-  }]>];
+    OpBuilderDAG<(ins "StringRef":$name, "ValueRange":$types,
+      "ValueRange":$operands, "ValueRange":$attributes,
+      "ArrayAttr":$attributeNames), [{
+      build($_builder, $_state, $_builder.getType<pdl::OperationType>(), name,
+            operands, attributes, attributeNames, types);
+    }]>];
   let parser = [{ return ::parseCreateOperationOp(parser, result); }];
   let printer = [{ ::print(p, *this); }];
 }
@@ -442,7 +443,7 @@ def PDLInterp_CreateTypeOp : PDLInterp_Op<"create_type", [NoSideEffect]> {
   let assemblyFormat = "$value attr-dict";
 
   let builders = [
-    OpBuilder<"TypeAttr type", [{
+    OpBuilderDAG<(ins "TypeAttr":$type), [{
       build($_builder, $_state, $_builder.getType<pdl::TypeType>(), type);
     }]>
   ];
@@ -537,7 +538,7 @@ def PDLInterp_GetAttributeTypeOp
   let assemblyFormat = "`of` $value attr-dict";
 
   let builders = [
-    OpBuilder<"Value value", [{
+    OpBuilderDAG<(ins "Value":$value), [{
       build($_builder, $_state, $_builder.getType<pdl::TypeType>(), value);
     }]>
   ];
@@ -638,7 +639,7 @@ def PDLInterp_GetValueTypeOp : PDLInterp_Op<"get_value_type", [NoSideEffect]> {
   let assemblyFormat = "`of` $value attr-dict";
 
   let builders = [
-    OpBuilder<"Value value", [{
+    OpBuilderDAG<(ins "Value":$value), [{
       build($_builder, $_state, $_builder.getType<pdl::TypeType>(), value);
     }]>
   ];
@@ -665,7 +666,7 @@ def PDLInterp_InferredTypeOp : PDLInterp_Op<"inferred_type"> {
   let assemblyFormat = "attr-dict";
 
   let builders = [
-    OpBuilder<"", [{
+    OpBuilderDAG<(ins), [{
       build($_builder, $_state, $_builder.getType<pdl::TypeType>());
     }]>,
   ];
@@ -780,8 +781,8 @@ def PDLInterp_SwitchAttributeOp
   }];
 
   let builders = [
-    OpBuilder<"Value attribute, ArrayRef<Attribute> caseValues,"
-              "Block *defaultDest, BlockRange dests", [{
+    OpBuilderDAG<(ins "Value":$attribute, "ArrayRef<Attribute>":$caseValues,
+      "Block *":$defaultDest, "BlockRange":$dests), [{
     build($_builder, $_state, attribute, $_builder.getArrayAttr(caseValues),
           defaultDest, dests);
   }]>];
@@ -813,8 +814,8 @@ def PDLInterp_SwitchOperandCountOp
   }];
 
   let builders = [
-    OpBuilder<"Value operation, ArrayRef<int32_t> counts, "
-              "Block *defaultDest, BlockRange dests", [{
+    OpBuilderDAG<(ins "Value":$operation, "ArrayRef<int32_t>":$counts,
+      "Block *":$defaultDest, "BlockRange":$dests), [{
     build($_builder, $_state, operation, $_builder.getI32VectorAttr(counts),
           defaultDest, dests);
   }]>];
@@ -847,8 +848,8 @@ def PDLInterp_SwitchOperationNameOp
   }];
 
   let builders = [
-    OpBuilder<"Value operation, ArrayRef<OperationName> names, "
-              "Block *defaultDest, BlockRange dests", [{
+    OpBuilderDAG<(ins "Value":$operation, "ArrayRef<OperationName>":$names,
+      "Block *":$defaultDest, "BlockRange":$dests), [{
       auto stringNames = llvm::to_vector<8>(llvm::map_range(names,
           [](OperationName name) { return name.getStringRef(); }));
       build($_builder, $_state, operation, $_builder.getStrArrayAttr(stringNames),
@@ -883,8 +884,8 @@ def PDLInterp_SwitchResultCountOp
   }];
 
   let builders = [
-    OpBuilder<"Value operation, ArrayRef<int32_t> counts, Block *defaultDest, "
-              "BlockRange dests", [{
+    OpBuilderDAG<(ins "Value":$operation, "ArrayRef<int32_t>":$counts,
+      "Block *":$defaultDest, "BlockRange":$dests), [{
     build($_builder, $_state, operation, $_builder.getI32VectorAttr(counts),
           defaultDest, dests);
   }]>];
@@ -915,8 +916,8 @@ def PDLInterp_SwitchTypeOp : PDLInterp_SwitchOp<"switch_type", [NoSideEffect]> {
   }];
 
   let builders = [
-    OpBuilder<"Value edge, TypeRange types, Block *defaultDest, "
-              "BlockRange dests", [{
+    OpBuilderDAG<(ins "Value":$edge, "TypeRange":$types, "Block *":$defaultDest,
+      "BlockRange":$dests), [{
       build($_builder, $_state, edge, $_builder.getTypeArrayAttr(types),
             defaultDest, dests);
     }]>,

diff  --git a/mlir/include/mlir/Dialect/SCF/SCFOps.td b/mlir/include/mlir/Dialect/SCF/SCFOps.td
index 3e7623cda0a0..a58af941965c 100644
--- a/mlir/include/mlir/Dialect/SCF/SCFOps.td
+++ b/mlir/include/mlir/Dialect/SCF/SCFOps.td
@@ -135,10 +135,10 @@ def ForOp : SCF_Op<"for",
 
   let skipDefaultBuilders = 1;
   let builders = [
-    OpBuilder<"Value lowerBound, Value upperBound, Value step, "
-              "ValueRange iterArgs = llvm::None, "
-              "function_ref<void(OpBuilder &, Location, Value, ValueRange)>"
-              "    = nullptr">
+    OpBuilderDAG<(ins "Value":$lowerBound, "Value":$upperBound, "Value":$step,
+      CArg<"ValueRange", "llvm::None">:$iterArgs,
+      CArg<"function_ref<void(OpBuilder &, Location, Value, ValueRange)>",
+           "nullptr">)>
   ];
 
   let extraClassDeclaration = [{
@@ -235,18 +235,19 @@ def IfOp : SCF_Op<"if",
 
   let skipDefaultBuilders = 1;
   let builders = [
-    OpBuilder<"Value cond, bool withElseRegion">,
-    OpBuilder<"TypeRange resultTypes, Value cond, bool withElseRegion">,
-    OpBuilder<
-        "TypeRange resultTypes, Value cond, "
-        "function_ref<void(OpBuilder &, Location)> thenBuilder "
-        "    = buildTerminatedBody, "
-        "function_ref<void(OpBuilder &, Location)> elseBuilder = nullptr">,
-    OpBuilder<
-        "Value cond, "
-        "function_ref<void(OpBuilder &, Location)> thenBuilder "
-        "    = buildTerminatedBody, "
-        "function_ref<void(OpBuilder &, Location)> elseBuilder = nullptr">
+    OpBuilderDAG<(ins "Value":$cond, "bool":$withElseRegion)>,
+    OpBuilderDAG<(ins "TypeRange":$resultTypes, "Value":$cond,
+      "bool":$withElseRegion)>,
+    OpBuilderDAG<(ins "TypeRange":$resultTypes, "Value":$cond,
+      CArg<"function_ref<void(OpBuilder &, Location)>",
+           "buildTerminatedBody">:$thenBuilder,
+      CArg<"function_ref<void(OpBuilder &, Location)>",
+           "nullptr">:$elseBuilder)>,
+    OpBuilderDAG<(ins "Value":$cond,
+      CArg<"function_ref<void(OpBuilder &, Location)>",
+           "buildTerminatedBody">:$thenBuilder,
+      CArg<"function_ref<void(OpBuilder &, Location)>",
+           "nullptr">:$elseBuilder)>
   ];
 
   let extraClassDeclaration = [{
@@ -325,15 +326,14 @@ def ParallelOp : SCF_Op<"parallel",
 
   let skipDefaultBuilders = 1;
   let builders = [
-    OpBuilder<"ValueRange lowerBounds, ValueRange upperBounds, "
-              "ValueRange steps, ValueRange initVals, "
-              "function_ref<void (OpBuilder &, Location, "
-                                 "ValueRange, ValueRange)>"
-              "  bodyBuilderFn = nullptr">,
-    OpBuilder<"ValueRange lowerBounds, ValueRange upperBounds, "
-              "ValueRange steps, "
-              "function_ref<void (OpBuilder &, Location, ValueRange)>"
-              "  bodyBuilderFn = nullptr">,
+    OpBuilderDAG<(ins "ValueRange":$lowerBounds, "ValueRange":$upperBounds,
+      "ValueRange":$steps, "ValueRange":$initVals,
+      CArg<"function_ref<void (OpBuilder &, Location, ValueRange, ValueRange)>",
+           "nullptr">:$bodyBuilderFn)>,
+    OpBuilderDAG<(ins "ValueRange":$lowerBounds, "ValueRange":$upperBounds,
+      "ValueRange":$steps,
+      CArg<"function_ref<void (OpBuilder &, Location, ValueRange)>",
+           "nullptr">:$bodyBuilderFn)>,
   ];
 
   let extraClassDeclaration = [{
@@ -386,9 +386,9 @@ def ReduceOp : SCF_Op<"reduce", [HasParent<"ParallelOp">]> {
 
   let skipDefaultBuilders = 1;
   let builders = [
-    OpBuilder<"Value operand, "
-              "function_ref<void (OpBuilder &, Location, Value, Value)>"
-              "  bodyBuilderFn = nullptr">
+    OpBuilderDAG<(ins "Value":$operand,
+      CArg<"function_ref<void (OpBuilder &, Location, Value, Value)>",
+           "nullptr">:$bodyBuilderFn)>
   ];
 
   let arguments = (ins AnyType:$operand);
@@ -429,9 +429,7 @@ def YieldOp : SCF_Op<"yield", [NoSideEffect, ReturnLike, Terminator,
   }];
 
   let arguments = (ins Variadic<AnyType>:$results);
-  let builders = [
-    OpBuilder<"", [{ /* nothing to do */ }]>
-  ];
+  let builders = [OpBuilderDAG<(ins), [{ /* nothing to do */ }]>];
   // Override default verifier (defined in SCF_Op), no custom verification
   // needed.
   let verifier = ?;

diff  --git a/mlir/include/mlir/Dialect/SPIRV/SPIRVAtomicOps.td b/mlir/include/mlir/Dialect/SPIRV/SPIRVAtomicOps.td
index 6b82a8d79a7c..69d57ad0125d 100644
--- a/mlir/include/mlir/Dialect/SPIRV/SPIRVAtomicOps.td
+++ b/mlir/include/mlir/Dialect/SPIRV/SPIRVAtomicOps.td
@@ -49,11 +49,9 @@ class SPV_AtomicUpdateWithValueOp<string mnemonic, list<OpTrait> traits = []> :
   );
 
   let builders = [
-    OpBuilder<
-      [{Value pointer, ::mlir::spirv::Scope scope,
-        ::mlir::spirv::MemorySemantics memory, Value value}],
-      [{build($_builder, $_state, value.getType(), pointer, scope, memory, value);}]
-    >
+    OpBuilderDAG<(ins "Value":$pointer, "::mlir::spirv::Scope":$scope,
+      "::mlir::spirv::MemorySemantics":$memory, "Value":$value),
+    [{build($_builder, $_state, value.getType(), pointer, scope, memory, value);}]>
   ];
 }
 

diff  --git a/mlir/include/mlir/Dialect/SPIRV/SPIRVCompositeOps.td b/mlir/include/mlir/Dialect/SPIRV/SPIRVCompositeOps.td
index 953fc50209b3..b824192c1309 100644
--- a/mlir/include/mlir/Dialect/SPIRV/SPIRVCompositeOps.td
+++ b/mlir/include/mlir/Dialect/SPIRV/SPIRVCompositeOps.td
@@ -111,7 +111,7 @@ def SPV_CompositeExtractOp : SPV_Op<"CompositeExtract", [NoSideEffect]> {
   );
 
   let builders = [
-    OpBuilder<[{Value composite, ArrayRef<int32_t> indices}]>
+    OpBuilderDAG<(ins "Value":$composite, "ArrayRef<int32_t>":$indices)>
   ];
 
   let hasFolder = 1;
@@ -163,7 +163,8 @@ def SPV_CompositeInsertOp : SPV_Op<"CompositeInsert", [NoSideEffect]> {
   );
 
   let builders = [
-    OpBuilder<[{Value object, Value composite, ArrayRef<int32_t> indices}]>
+    OpBuilderDAG<(ins "Value":$object, "Value":$composite,
+      "ArrayRef<int32_t>":$indices)>
   ];
 }
 

diff  --git a/mlir/include/mlir/Dialect/SPIRV/SPIRVControlFlowOps.td b/mlir/include/mlir/Dialect/SPIRV/SPIRVControlFlowOps.td
index 0f1a282ec942..dd1bc9ed3519 100644
--- a/mlir/include/mlir/Dialect/SPIRV/SPIRVControlFlowOps.td
+++ b/mlir/include/mlir/Dialect/SPIRV/SPIRVControlFlowOps.td
@@ -54,12 +54,11 @@ def SPV_BranchOp : SPV_Op<"Branch", [
   let verifier = [{ return success(); }];
 
   let builders = [
-    OpBuilder<
-      "Block *successor, ValueRange arguments = {}", [{
-        $_state.addSuccessors(successor);
-        $_state.addOperands(arguments);
-      }]
-    >
+    OpBuilderDAG<(ins "Block *":$successor, CArg<"ValueRange", "{}">:$arguments),
+    [{
+      $_state.addSuccessors(successor);
+      $_state.addOperands(arguments);
+    }]>
   ];
 
   let skipDefaultBuilders = 1;
@@ -135,22 +134,20 @@ def SPV_BranchConditionalOp : SPV_Op<"BranchConditional", [
                               AnySuccessor:$falseTarget);
 
   let builders = [
-    OpBuilder<
-      "Value condition, "
-      "Block *trueBlock, ValueRange trueArguments, "
-      "Block *falseBlock, ValueRange falseArguments, "
-      "Optional<std::pair<uint32_t, uint32_t>> weights = {}",
-      [{
-        ArrayAttr weightsAttr;
-        if (weights) {
-          weightsAttr =
-              $_builder.getI32ArrayAttr({static_cast<int32_t>(weights->first),
-                                       static_cast<int32_t>(weights->second)});
-        }
-        build($_builder, $_state, condition, trueArguments, falseArguments,
-              weightsAttr, trueBlock, falseBlock);
-      }]
-    >
+    OpBuilderDAG<(ins "Value":$condition, "Block *":$trueBlock,
+      "ValueRange":$trueArguments, "Block *":$falseBlock,
+      "ValueRange":$falseArguments,
+      CArg<"Optional<std::pair<uint32_t, uint32_t>>", "{}">:$weights),
+    [{
+      ArrayAttr weightsAttr;
+      if (weights) {
+        weightsAttr =
+            $_builder.getI32ArrayAttr({static_cast<int32_t>(weights->first),
+                                     static_cast<int32_t>(weights->second)});
+      }
+      build($_builder, $_state, condition, trueArguments, falseArguments,
+            weightsAttr, trueBlock, falseBlock);
+    }]>
   ];
 
   let autogenSerialization = 0;
@@ -289,7 +286,7 @@ def SPV_LoopOp : SPV_Op<"loop", [InFunctionScope]> {
 
   let regions = (region AnyRegion:$body);
 
-  let builders = [OpBuilder<"">];
+  let builders = [OpBuilderDAG<(ins)>];
 
   let extraClassDeclaration = [{
     // Returns the entry block.

diff  --git a/mlir/include/mlir/Dialect/SPIRV/SPIRVLogicalOps.td b/mlir/include/mlir/Dialect/SPIRV/SPIRVLogicalOps.td
index 1df6f82ada55..1cb9cfe812df 100644
--- a/mlir/include/mlir/Dialect/SPIRV/SPIRVLogicalOps.td
+++ b/mlir/include/mlir/Dialect/SPIRV/SPIRVLogicalOps.td
@@ -28,9 +28,8 @@ class SPV_LogicalBinaryOp<string mnemonic, Type operandsType,
   let printer = [{ return ::printLogicalOp(getOperation(), p); }];
 
   let builders = [
-    OpBuilder<
-      "Value lhs, Value rhs",
-      "::buildLogicalBinaryOp($_builder, $_state, lhs, rhs);">
+    OpBuilderDAG<(ins "Value":$lhs, "Value":$rhs),
+    [{::buildLogicalBinaryOp($_builder, $_state, lhs, rhs);}]>
   ];
 }
 
@@ -860,8 +859,8 @@ def SPV_SelectOp : SPV_Op<"Select",
     SPV_SelectType:$result
   );
 
-  let builders = [OpBuilder<[{Value cond, Value trueValue,
-                              Value falseValue}]>];
+  let builders = [
+    OpBuilderDAG<(ins "Value":$cond, "Value":$trueValue, "Value":$falseValue)>];
 
   let assemblyFormat = [{
     operands attr-dict `:` type($condition) `,` type($result)

diff  --git a/mlir/include/mlir/Dialect/SPIRV/SPIRVNonUniformOps.td b/mlir/include/mlir/Dialect/SPIRV/SPIRVNonUniformOps.td
index d7168d3a292b..7d75f7b87452 100644
--- a/mlir/include/mlir/Dialect/SPIRV/SPIRVNonUniformOps.td
+++ b/mlir/include/mlir/Dialect/SPIRV/SPIRVNonUniformOps.td
@@ -217,9 +217,7 @@ def SPV_GroupNonUniformElectOp : SPV_Op<"GroupNonUniformElect", []> {
     SPV_Bool:$result
   );
 
-  let builders = [
-    OpBuilder<[{spirv::Scope}]>
-  ];
+  let builders = [OpBuilderDAG<(ins "spirv::Scope")>];
 
   let assemblyFormat = "$execution_scope attr-dict `:` type($result)";
 }

diff  --git a/mlir/include/mlir/Dialect/SPIRV/SPIRVOps.td b/mlir/include/mlir/Dialect/SPIRV/SPIRVOps.td
index e4bb134496f6..3fc60d018cce 100644
--- a/mlir/include/mlir/Dialect/SPIRV/SPIRVOps.td
+++ b/mlir/include/mlir/Dialect/SPIRV/SPIRVOps.td
@@ -96,7 +96,7 @@ def SPV_AccessChainOp : SPV_Op<"AccessChain", [NoSideEffect]> {
     SPV_AnyPtr:$component_ptr
   );
 
-  let builders = [OpBuilder<[{Value basePtr, ValueRange indices}]>];
+  let builders = [OpBuilderDAG<(ins "Value":$basePtr, "ValueRange":$indices)>];
 
   let hasCanonicalizer = 1;
 }
@@ -272,9 +272,9 @@ def SPV_ExecutionModeOp : SPV_Op<"ExecutionMode", [InModuleScope]> {
 
   let autogenSerialization = 0;
 
-  let builders = [OpBuilder<[{spirv::FuncOp function,
-                              spirv::ExecutionMode executionMode,
-                              ArrayRef<int32_t> params}]>];
+  let builders = [
+    OpBuilderDAG<(ins "spirv::FuncOp":$function,
+      "spirv::ExecutionMode":$executionMode, "ArrayRef<int32_t>":$params)>];
 }
 
 // -----
@@ -325,10 +325,9 @@ def SPV_LoadOp : SPV_Op<"Load", []> {
   );
 
   let builders = [
-    OpBuilder<[{
-      Value basePtr, IntegerAttr memory_access = {},
-      IntegerAttr alignment = {}
-    }]>
+    OpBuilderDAG<(ins "Value":$basePtr,
+      CArg<"IntegerAttr", "{}">:$memory_access,
+      CArg<"IntegerAttr", "{}">:$alignment)>
   ];
 }
 
@@ -427,8 +426,9 @@ def SPV_StoreOp : SPV_Op<"Store", []> {
   let results = (outs);
 
   let builders = [
-    OpBuilder<
-      "Value ptr, Value value, ArrayRef<NamedAttribute> namedAttrs = {}", [{
+    OpBuilderDAG<(ins "Value":$ptr, "Value":$value,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$namedAttrs),
+    [{
       $_state.addOperands(ptr);
       $_state.addOperands(value);
       $_state.addAttributes(namedAttrs);

diff  --git a/mlir/include/mlir/Dialect/SPIRV/SPIRVStructureOps.td b/mlir/include/mlir/Dialect/SPIRV/SPIRVStructureOps.td
index c64606bc50f9..a539737b75ab 100644
--- a/mlir/include/mlir/Dialect/SPIRV/SPIRVStructureOps.td
+++ b/mlir/include/mlir/Dialect/SPIRV/SPIRVStructureOps.td
@@ -60,7 +60,7 @@ def SPV_AddressOfOp : SPV_Op<"_address_of", [InFunctionScope, NoSideEffect]> {
 
   let autogenSerialization = 0;
 
-  let builders = [OpBuilder<[{spirv::GlobalVariableOp var}]>];
+  let builders = [OpBuilderDAG<(ins "spirv::GlobalVariableOp":$var)>];
 
   let assemblyFormat = "$variable attr-dict `:` type($pointer)";
 }
@@ -188,9 +188,9 @@ def SPV_EntryPointOp : SPV_Op<"EntryPoint", [InModuleScope]> {
 
   let autogenSerialization = 0;
 
-  let builders = [OpBuilder<[{spirv::ExecutionModel executionModel,
-                              spirv::FuncOp function,
-                              ArrayRef<Attribute> interfaceVars}]>];
+  let builders = [
+    OpBuilderDAG<(ins "spirv::ExecutionModel":$executionModel,
+      "spirv::FuncOp":$function, "ArrayRef<Attribute>":$interfaceVars)>];
 }
 
 // -----
@@ -241,11 +241,10 @@ def SPV_FuncOp : SPV_Op<"func", [
 
   let verifier = [{ return success(); }];
 
-  let builders = [OpBuilder<[{
-    StringRef name, FunctionType type,
-    spirv::FunctionControl control = spirv::FunctionControl::None,
-    ArrayRef<NamedAttribute> attrs = {}
-  }]>];
+  let builders = [
+    OpBuilderDAG<(ins "StringRef":$name, "FunctionType":$type,
+      CArg<"spirv::FunctionControl", "spirv::FunctionControl::None">:$control,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs)>];
 
   let hasOpcode = 0;
 
@@ -330,14 +329,15 @@ def SPV_GlobalVariableOp : SPV_Op<"globalVariable", [InModuleScope, Symbol]> {
   let results = (outs);
 
   let builders = [
-    OpBuilder<
-      "TypeAttr type, ArrayRef<NamedAttribute> namedAttrs", [{
+    OpBuilderDAG<(ins "TypeAttr":$type, "ArrayRef<NamedAttribute>":$namedAttrs),
+    [{
       $_state.addAttribute("type", type);
       $_state.addAttributes(namedAttrs);
     }]>,
-    OpBuilder<[{Type type, StringRef name, unsigned descriptorSet,
-                unsigned binding}]>,
-    OpBuilder<[{Type type, StringRef name, spirv::BuiltIn builtin}]>
+    OpBuilderDAG<(ins "Type":$type, "StringRef":$name,
+      "unsigned":$descriptorSet, "unsigned":$binding)>,
+    OpBuilderDAG<(ins "Type":$type, "StringRef":$name,
+      "spirv::BuiltIn":$builtin)>
   ];
 
   let hasOpcode = 0;
@@ -413,10 +413,10 @@ def SPV_ModuleOp : SPV_Op<"module",
   let regions = (region SizedRegion<1>:$body);
 
   let builders = [
-    OpBuilder<[{Optional<StringRef> name = llvm::None}]>,
-    OpBuilder<[{spirv::AddressingModel addressing_model,
-                spirv::MemoryModel memory_model,
-                Optional<StringRef> name = llvm::None}]>
+    OpBuilderDAG<(ins CArg<"Optional<StringRef>", "llvm::None">:$name)>,
+    OpBuilderDAG<(ins "spirv::AddressingModel":$addressing_model,
+      "spirv::MemoryModel":$memory_model,
+      CArg<"Optional<StringRef>", "llvm::None">:$name)>
   ];
 
   // We need to ensure the block inside the region is properly terminated;

diff  --git a/mlir/include/mlir/Dialect/Shape/IR/ShapeOps.td b/mlir/include/mlir/Dialect/Shape/IR/ShapeOps.td
index 6541cfadfc1b..2bc4329db192 100644
--- a/mlir/include/mlir/Dialect/Shape/IR/ShapeOps.td
+++ b/mlir/include/mlir/Dialect/Shape/IR/ShapeOps.td
@@ -123,9 +123,7 @@ def Shape_ConstSizeOp : Shape_Op<"const_size", [
   let arguments = (ins IndexAttr:$value);
   let results = (outs Shape_SizeType:$result);
 
-  let builders = [
-    OpBuilder<"int64_t value">
-  ];
+  let builders = [OpBuilderDAG<(ins "int64_t":$value)>];
 
   let assemblyFormat = "$value attr-dict";
   let hasFolder = 1;
@@ -231,8 +229,7 @@ def Shape_GetExtentOp : Shape_Op<"get_extent", [NoSideEffect]> {
 
   let builders = [
     // Builder that allows passing a constant dimension as a simple integer.
-    OpBuilder<"Value shape, "
-              "int64_t dim">
+    OpBuilderDAG<(ins "Value":$shape, "int64_t":$dim)>
   ];
 
   let extraClassDeclaration = [{
@@ -331,9 +328,7 @@ def Shape_NumElementsOp : Shape_Op<"num_elements", [NoSideEffect]> {
   let arguments = (ins Shape_ShapeOrExtentTensorType:$shape);
   let results = (outs Shape_SizeOrIndexType:$result);
 
-  let builders = [
-    OpBuilder<"Value shape">,
-  ];
+  let builders = [OpBuilderDAG<(ins "Value":$shape)>];
 
   let assemblyFormat = "$shape `:` type($shape) `->` type($result) attr-dict";
 
@@ -382,9 +377,7 @@ def Shape_ReduceOp : Shape_Op<"reduce",
   let results = (outs Variadic<AnyType>:$result);
   let regions = (region SizedRegion<1>:$region);
 
-  let builders = [
-    OpBuilder<"Value shape, ValueRange initVals">,
-  ];
+  let builders = [OpBuilderDAG<(ins "Value":$shape, "ValueRange":$initVals)>];
 
   let verifier = [{ return ::verify(*this); }];
   let printer = [{ return ::print(p, *this); }];
@@ -404,9 +397,7 @@ def Shape_ShapeOfOp : Shape_Op<"shape_of", [NoSideEffect]> {
 
   let assemblyFormat = "$arg `:` type($arg) `->` type($result) attr-dict";
 
-  let builders = [
-    OpBuilder<"Value arg">
-  ];
+  let builders = [OpBuilderDAG<(ins "Value":$arg)>];
 
   let verifier = [{ return ::verifyShapeOrExtentTensorOp(*this); }];
   let hasCanonicalizer = 1;
@@ -483,8 +474,8 @@ def Shape_YieldOp : Shape_Op<"yield",
 
   let arguments = (ins Variadic<AnyType>:$operands);
 
-  let builders = [
-    OpBuilder<"", [{ build($_builder, $_state, llvm::None); }]>
+  let builders = [OpBuilderDAG<(ins),
+    [{ build($_builder, $_state, llvm::None); }]>
   ];
 
   let verifier = [{ return ::verify(*this); }];
@@ -660,9 +651,7 @@ def Shape_AssumingYieldOp : Shape_Op<"assuming_yield",
 
   let arguments = (ins Variadic<AnyType>:$operands);
 
-  let builders = [
-    OpBuilder<"", [{ /* nothing to do */ }]>
-  ];
+  let builders = [OpBuilderDAG<(ins), [{ /* nothing to do */ }]>];
 
   let assemblyFormat = "attr-dict ($operands^ `:` type($operands))?";
 }

diff  --git a/mlir/include/mlir/Dialect/StandardOps/IR/Ops.td b/mlir/include/mlir/Dialect/StandardOps/IR/Ops.td
index e3e1930580b4..b7c66f4d20f8 100644
--- a/mlir/include/mlir/Dialect/StandardOps/IR/Ops.td
+++ b/mlir/include/mlir/Dialect/StandardOps/IR/Ops.td
@@ -50,10 +50,11 @@ class CastOp<string mnemonic, list<OpTrait> traits = []> :
 
   let results = (outs AnyType);
 
-  let builders = [OpBuilder<
-    "Value source, Type destType", [{
+  let builders = [
+    OpBuilderDAG<(ins "Value":$source, "Type":$destType), [{
        impl::buildCastOp($_builder, $_state, source, destType);
-  }]>];
+    }]>
+  ];
 
   let parser = [{
     return impl::parseCastOp(parser, result);
@@ -162,18 +163,17 @@ class AllocLikeOp<string mnemonic,
                    Confined<OptionalAttr<I64Attr>, [IntMinValue<0>]>:$alignment);
   let results = (outs Res<AnyMemRef, "", [MemAlloc<resource>]>);
 
-  let builders = [OpBuilder<
-    "MemRefType memrefType", [{
-       $_state.types.push_back(memrefType);
-     }]>,
-    OpBuilder<
-    "MemRefType memrefType, ValueRange operands, "
-    "IntegerAttr alignment = IntegerAttr()", [{
-       $_state.addOperands(operands);
-       $_state.types.push_back(memrefType);
-       if (alignment)
-         $_state.addAttribute(getAlignmentAttrName(), alignment);
-     }]>];
+  let builders = [
+    OpBuilderDAG<(ins "MemRefType":$memrefType), [{
+      $_state.types.push_back(memrefType);
+    }]>,
+    OpBuilderDAG<(ins "MemRefType":$memrefType, "ValueRange":$operands,
+      CArg<"IntegerAttr", "IntegerAttr()">:$alignment), [{
+      $_state.addOperands(operands);
+      $_state.types.push_back(memrefType);
+      if (alignment)
+        $_state.addAttribute(getAlignmentAttrName(), alignment);
+    }]>];
 
   let extraClassDeclaration = [{
     static StringRef getAlignmentAttrName() { return "alignment"; }
@@ -847,9 +847,7 @@ def GenericAtomicRMWOp : Std_Op<"generic_atomic_rmw", [
   let regions = (region AnyRegion:$body);
 
   let skipDefaultBuilders = 1;
-  let builders = [
-    OpBuilder<"Value memref, ValueRange ivs">
-  ];
+  let builders = [OpBuilderDAG<(ins "Value":$memref, "ValueRange":$ivs)>];
 
   let extraClassDeclaration = [{
     // The value stored in memref[ivs].
@@ -903,10 +901,12 @@ def BranchOp : Std_Op<"br",
   let arguments = (ins Variadic<AnyType>:$destOperands);
   let successors = (successor AnySuccessor:$dest);
 
-  let builders = [OpBuilder<"Block *dest, ValueRange destOperands = {}", [{
-    $_state.addSuccessors(dest);
-    $_state.addOperands(destOperands);
-  }]>];
+  let builders = [
+    OpBuilderDAG<(ins "Block *":$dest,
+                  CArg<"ValueRange", "{}">:$destOperands), [{
+      $_state.addSuccessors(dest);
+      $_state.addOperands(destOperands);
+    }]>];
 
   // BranchOp is fully verified by traits.
   let verifier = ?;
@@ -949,21 +949,23 @@ def CallOp : Std_Op<"call",
   let arguments = (ins FlatSymbolRefAttr:$callee, Variadic<AnyType>:$operands);
   let results = (outs Variadic<AnyType>);
 
-  let builders = [OpBuilder<
-    "FuncOp callee, ValueRange operands = {}", [{
+  let builders = [
+    OpBuilderDAG<(ins "FuncOp":$callee, CArg<"ValueRange", "{}">:$operands), [{
       $_state.addOperands(operands);
       $_state.addAttribute("callee",$_builder.getSymbolRefAttr(callee));
       $_state.addTypes(callee.getType().getResults());
-  }]>, OpBuilder<
-    "SymbolRefAttr callee, TypeRange results, ValueRange operands = {}", [{
+    }]>,
+    OpBuilderDAG<(ins "SymbolRefAttr":$callee, "TypeRange":$results,
+      CArg<"ValueRange", "{}">:$operands), [{
       $_state.addOperands(operands);
       $_state.addAttribute("callee", callee);
       $_state.addTypes(results);
-  }]>, OpBuilder<
-    "StringRef callee, TypeRange results, ValueRange operands = {}", [{
+    }]>,
+    OpBuilderDAG<(ins "StringRef":$callee, "TypeRange":$results,
+      CArg<"ValueRange", "{}">:$operands), [{
       build($_builder, $_state, $_builder.getSymbolRefAttr(callee), results,
             operands);
-  }]>];
+    }]>];
 
   let extraClassDeclaration = [{
     StringRef getCallee() { return callee(); }
@@ -1023,12 +1025,12 @@ def CallIndirectOp : Std_Op<"call_indirect", [
   let arguments = (ins FunctionType:$callee, Variadic<AnyType>:$operands);
   let results = (outs Variadic<AnyType>:$results);
 
-  let builders = [OpBuilder<
-    "Value callee, ValueRange operands = {}", [{
+  let builders = [
+    OpBuilderDAG<(ins "Value":$callee, CArg<"ValueRange", "{}">:$operands), [{
       $_state.operands.push_back(callee);
       $_state.addOperands(operands);
       $_state.addTypes(callee.getType().cast<FunctionType>().getResults());
-  }]>];
+    }]>];
 
   let extraClassDeclaration = [{
     Value getCallee() { return getOperand(0); }
@@ -1188,10 +1190,11 @@ def CmpFOp : Std_Op<"cmpf",
   );
   let results = (outs BoolLike:$result);
 
-  let builders = [OpBuilder<
-    "CmpFPredicate predicate, Value lhs, Value rhs", [{
+  let builders = [
+    OpBuilderDAG<(ins "CmpFPredicate":$predicate, "Value":$lhs,
+                  "Value":$rhs), [{
       ::buildCmpFOp($_builder, $_state, predicate, lhs, rhs);
-  }]>];
+    }]>];
 
   let extraClassDeclaration = [{
     static StringRef getPredicateAttrName() { return "predicate"; }
@@ -1309,10 +1312,11 @@ def CmpIOp : Std_Op<"cmpi",
   );
   let results = (outs BoolLike:$result);
 
-  let builders = [OpBuilder<
-    "CmpIPredicate predicate, Value lhs, Value rhs", [{
+  let builders = [
+    OpBuilderDAG<(ins "CmpIPredicate":$predicate, "Value":$lhs,
+                 "Value":$rhs), [{
       ::buildCmpIOp($_builder, $_state, predicate, lhs, rhs);
-  }]>];
+    }]>];
 
   let extraClassDeclaration = [{
     static StringRef getPredicateAttrName() { return "predicate"; }
@@ -1406,17 +1410,18 @@ def CondBranchOp : Std_Op<"cond_br",
                        Variadic<AnyType>:$falseDestOperands);
   let successors = (successor AnySuccessor:$trueDest, AnySuccessor:$falseDest);
 
-  let builders = [OpBuilder<
-    "Value condition, Block *trueDest, ValueRange trueOperands,"
-    "Block *falseDest, ValueRange falseOperands", [{
+  let builders = [
+    OpBuilderDAG<(ins "Value":$condition, "Block *":$trueDest,
+      "ValueRange":$trueOperands, "Block *":$falseDest,
+      "ValueRange":$falseOperands), [{
       build($_builder, $_state, condition, trueOperands, falseOperands, trueDest,
             falseDest);
-  }]>, OpBuilder<
-    "Value condition, Block *trueDest, Block *falseDest, "
-    "ValueRange falseOperands = {}", [{
+    }]>,
+    OpBuilderDAG<(ins "Value":$condition, "Block *":$trueDest,
+      "Block *":$falseDest, CArg<"ValueRange", "{}">:$falseOperands), [{
       build($_builder, $_state, condition, trueDest, ValueRange(), falseDest,
             falseOperands);
-  }]>];
+    }]>];
 
   // CondBranchOp is fully verified by traits.
   let verifier = ?;
@@ -1539,7 +1544,8 @@ def ConstantOp : Std_Op<"constant",
   let arguments = (ins AnyAttr:$value);
   let results = (outs AnyType);
 
-  let builders = [OpBuilder<"Attribute value",
+  let builders = [
+    OpBuilderDAG<(ins "Attribute":$value),
     [{ build($_builder, $_state, value.getType(), value); }]>];
 
   let extraClassDeclaration = [{
@@ -1722,8 +1728,8 @@ def DimOp : Std_Op<"dim", [NoSideEffect]> {
   }];
 
   let builders = [
-    OpBuilder<"Value memrefOrTensor, int64_t index">,
-    OpBuilder<"Value memrefOrTensor, Value index">
+    OpBuilderDAG<(ins "Value":$memrefOrTensor, "int64_t":$index)>,
+    OpBuilderDAG<(ins "Value":$memrefOrTensor, "Value":$index)>
   ];
 
   let extraClassDeclaration = [{
@@ -1776,8 +1782,8 @@ def DynamicTensorFromElementsOp : Std_Op<"dynamic_tensor_from_elements",
 
   let builders = [
     // Build op and populate its body per callback function.
-    OpBuilder<"Type resultTy, ValueRange dynamicExtents, "
-              "function_ref<void(OpBuilder &, Location, ValueRange)>">,
+    OpBuilderDAG<(ins "Type":$resultTy, "ValueRange":$dynamicExtents,
+      "function_ref<void(OpBuilder &, Location, ValueRange)>")>,
   ];
 
   let hasCanonicalizer = 1;
@@ -1854,8 +1860,8 @@ def ExtractElementOp : Std_Op<"extract_element",
                        Variadic<Index>:$indices);
   let results = (outs AnyType:$result);
 
-  let builders = [OpBuilder<
-    "Value aggregate, ValueRange indices = {}", [{
+  let builders = [
+    OpBuilderDAG<(ins "Value":$aggregate, CArg<"ValueRange", "{}">:$indices), [{
       auto resType = aggregate.getType().cast<ShapedType>()
                                          .getElementType();
       build($_builder, $_state, resType, aggregate, indices);
@@ -1908,9 +1914,9 @@ def TensorFromElementsOp : Std_Op<"tensor_from_elements", [
 
   let skipDefaultBuilders = 1;
   let builders = [
-    OpBuilder<"Type elementType, ValueRange elements">,
+    OpBuilderDAG<(ins "Type":$elementType, "ValueRange":$elements)>,
     // Special case builder for when `elements` has size >=1.
-    OpBuilder<"ValueRange elements">
+    OpBuilderDAG<(ins "ValueRange":$elements)>
   ];
 
   let hasCanonicalizer = 1;
@@ -2102,13 +2108,13 @@ def LoadOp : Std_Op<"load",
                        Variadic<Index>:$indices);
   let results = (outs AnyType:$result);
 
-  let builders = [OpBuilder<
-    "Value memref, ValueRange indices = {}", [{
+  let builders = [
+    OpBuilderDAG<(ins "Value":$memref, CArg<"ValueRange", "{}">:$indices), [{
       auto memrefType = memref.getType().cast<MemRefType>();
       $_state.addOperands(memref);
       $_state.addOperands(indices);
       $_state.types.push_back(memrefType.getElementType());
-  }]>];
+    }]>];
 
   let extraClassDeclaration = [{
     Value getMemRef() { return getOperand(0); }
@@ -2310,8 +2316,8 @@ def MemRefReshapeOp: Std_Op<"memref_reshape", [
   );
   let results = (outs AnyRankedOrUnrankedMemRef:$result);
 
-  let builders = [OpBuilder<
-     "MemRefType resultType, Value operand, Value shape", [{
+  let builders = [OpBuilderDAG<
+     (ins "MemRefType":$resultType, "Value":$operand, "Value":$shape), [{
        $_state.addOperands(operand);
        $_state.addOperands(shape);
        $_state.addTypes(resultType);
@@ -2503,8 +2509,8 @@ def RankOp : Std_Op<"rank", [NoSideEffect]> {
   let results = (outs Index);
   let verifier = ?;
 
-  let builders = [OpBuilder<
-    "Value tensor", [{
+  let builders = [
+    OpBuilderDAG<(ins "Value":$tensor), [{
       auto indexType = $_builder.getIndexType();
       build($_builder, $_state, indexType, tensor);
     }]>];
@@ -2576,7 +2582,9 @@ def ReturnOp : Std_Op<"return", [NoSideEffect, HasParent<"FuncOp">,
 
   let arguments = (ins Variadic<AnyType>:$operands);
 
-  let builders = [OpBuilder<"", [{ build($_builder, $_state, llvm::None); }]>];
+  let builders = [
+    OpBuilderDAG<(ins),
+    [{ build($_builder, $_state, llvm::None); }]>];
 
   let assemblyFormat = "attr-dict ($operands^ `:` type($operands))?";
 }
@@ -2639,11 +2647,12 @@ def SelectOp : Std_Op<"select", [NoSideEffect,
                        AnyType:$false_value);
   let results = (outs AnyType:$result);
 
-  let builders = [OpBuilder<
-    "Value condition, Value trueValue, Value falseValue", [{
+  let builders = [
+    OpBuilderDAG<(ins "Value":$condition, "Value":$trueValue,
+      "Value":$falseValue), [{
       $_state.addOperands({condition, trueValue, falseValue});
       $_state.addTypes(trueValue.getType());
-  }]>];
+    }]>];
 
   let extraClassDeclaration = [{
       Value getCondition() { return condition(); }
@@ -2797,10 +2806,11 @@ def SignExtendIOp : Std_Op<"sexti",
   let arguments = (ins SignlessIntegerLike:$value);
   let results = (outs SignlessIntegerLike);
 
-  let builders = [OpBuilder<"Value value, Type destType", [{
+  let builders = [
+    OpBuilderDAG<(ins "Value":$value, "Type":$destType), [{
       $_state.addOperands(value);
       $_state.addTypes(destType);
-  }]>];
+    }]>];
 
   let parser = [{
     return impl::parseCastOp(parser, result);
@@ -2870,9 +2880,9 @@ def SplatOp : Std_Op<"splat", [NoSideEffect,
                                  "integer or float type">:$input);
   let results = (outs AnyTypeOf<[AnyVector, AnyStaticShapeTensor]>:$aggregate);
 
-  let builders =
-      [OpBuilder<"Value element, Type aggregateType",
-                  [{ build($_builder, $_state, aggregateType, element); }]>];
+  let builders = [
+    OpBuilderDAG<(ins "Value":$element, "Type":$aggregateType),
+    [{ build($_builder, $_state, aggregateType, element); }]>];
 
   let hasFolder = 1;
 
@@ -2948,11 +2958,11 @@ def StoreOp : Std_Op<"store",
                            [MemWrite]>:$memref,
                        Variadic<Index>:$indices);
 
-  let builders = [OpBuilder<
-    "Value valueToStore, Value memref", [{
+  let builders = [
+    OpBuilderDAG<(ins "Value":$valueToStore, "Value":$memref), [{
       $_state.addOperands(valueToStore);
       $_state.addOperands(memref);
-  }]>];
+    }]>];
 
   let extraClassDeclaration = [{
       Value getValueToStore() { return getOperand(0); }
@@ -3160,27 +3170,25 @@ def SubViewOp : BaseOpWithOffsetSizesAndStrides<
 
   let builders = [
     // Build a SubViewOp with mixed static and dynamic entries.
-    OpBuilder<
-      "Value source, ArrayRef<int64_t> staticOffsets, "
-      "ArrayRef<int64_t> staticSizes, ArrayRef<int64_t> staticStrides, "
-      "ValueRange offsets, ValueRange sizes, ValueRange strides, "
-      "ArrayRef<NamedAttribute> attrs = {}">,
+    OpBuilderDAG<(ins "Value":$source, "ArrayRef<int64_t>":$staticOffsets,
+      "ArrayRef<int64_t>":$staticSizes, "ArrayRef<int64_t>":$staticStrides,
+      "ValueRange":$offsets, "ValueRange":$sizes, "ValueRange":$strides,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs)>,
     // Build a SubViewOp with all dynamic entries.
-    OpBuilder<
-      "Value source, ValueRange offsets, ValueRange sizes, ValueRange strides, "
-      "ArrayRef<NamedAttribute> attrs = {}">,
+    OpBuilderDAG<(ins "Value":$source, "ValueRange":$offsets,
+      "ValueRange":$sizes, "ValueRange":$strides,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs)>,
     // Build a SubViewOp with mixed static and dynamic entries
     // and custom result type.
-    OpBuilder<
-      "MemRefType resultType, Value source, ArrayRef<int64_t> staticOffsets, "
-      "ArrayRef<int64_t> staticSizes, ArrayRef<int64_t> staticStrides, "
-      "ValueRange offsets, ValueRange sizes, "
-      "ValueRange strides, ArrayRef<NamedAttribute> attrs = {}">,
+    OpBuilderDAG<(ins "MemRefType":$resultType, "Value":$source,
+      "ArrayRef<int64_t>":$staticOffsets, "ArrayRef<int64_t>":$staticSizes,
+      "ArrayRef<int64_t>":$staticStrides, "ValueRange":$offsets,
+      "ValueRange":$sizes, "ValueRange":$strides,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs)>,
     // Build a SubViewOp with all dynamic entries and custom result type.
-    OpBuilder<
-      "MemRefType resultType, Value source, ValueRange offsets, "
-      "ValueRange sizes, ValueRange strides, "
-      "ArrayRef<NamedAttribute> attrs = {}">
+    OpBuilderDAG<(ins "MemRefType":$resultType, "Value":$source,
+      "ValueRange":$offsets, "ValueRange":$sizes, "ValueRange":$strides,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs)>
   ];
 
   let extraClassDeclaration = extraBaseClassDeclaration # [{
@@ -3262,15 +3270,14 @@ def SubTensorOp : BaseOpWithOffsetSizesAndStrides<"subtensor"> {
 
   let builders = [
     // Build a SubViewOp with mixed static and dynamic entries.
-    OpBuilder<
-      "Value source, ArrayRef<int64_t> staticOffsets, "
-      "ArrayRef<int64_t> staticSizes, ArrayRef<int64_t> staticStrides, "
-      "ValueRange offsets, ValueRange sizes, ValueRange strides, "
-      "ArrayRef<NamedAttribute> attrs = {}">,
+    OpBuilderDAG<(ins "Value":$source, "ArrayRef<int64_t>":$staticOffsets,
+      "ArrayRef<int64_t>":$staticSizes, "ArrayRef<int64_t>":$staticStrides,
+      "ValueRange":$offsets, "ValueRange":$sizes, "ValueRange":$strides,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs)>,
     // Build a SubViewOp with all dynamic entries.
-    OpBuilder<
-      "Value source, ValueRange offsets, ValueRange sizes, ValueRange strides, "
-      "ArrayRef<NamedAttribute> attrs = {}">
+    OpBuilderDAG<(ins "Value":$source, "ValueRange":$offsets,
+      "ValueRange":$sizes, "ValueRange":$strides,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs)>
   ];
 
   let extraClassDeclaration = extraBaseClassDeclaration # [{
@@ -3346,15 +3353,15 @@ def SubTensorInsertOp : BaseOpWithOffsetSizesAndStrides<"subtensor_insert"> {
 
   let builders = [
     // Build a SubViewOp with mixed static and dynamic entries.
-    OpBuilder<
-      "Value source, Value dest, ArrayRef<int64_t> staticOffsets, "
-      "ArrayRef<int64_t> staticSizes, ArrayRef<int64_t> staticStrides, "
-      "ValueRange offsets, ValueRange sizes, ValueRange strides, "
-      "ArrayRef<NamedAttribute> attrs = {}">,
+    OpBuilderDAG<(ins "Value":$source, "Value":$dest,
+      "ArrayRef<int64_t>":$staticOffsets, "ArrayRef<int64_t>":$staticSizes,
+      "ArrayRef<int64_t>":$staticStrides, "ValueRange":$offsets,
+      "ValueRange":$sizes, "ValueRange":$strides,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs)>,
     // Build a SubViewOp with all dynamic entries.
-    OpBuilder<
-      "Value source, Value dest, ValueRange offsets, ValueRange sizes, "
-      "ValueRange strides, ArrayRef<NamedAttribute> attrs = {}">
+    OpBuilderDAG<(ins "Value":$source, "Value":$dest, "ValueRange":$offsets,
+      "ValueRange":$sizes, "ValueRange":$strides,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs)>
   ];
 
   let extraClassDeclaration = extraBaseClassDeclaration # [{
@@ -3486,11 +3493,11 @@ def TensorLoadOp : Std_Op<"tensor_load",
   // TensorLoadOp is fully verified by traits.
   let verifier = ?;
 
-  let builders = [OpBuilder<
-    "Value memref", [{
+  let builders = [
+    OpBuilderDAG<(ins "Value":$memref), [{
       $_state.addOperands(memref);
       $_state.addTypes(getTensorTypeFromMemRefType(memref.getType()));
-  }]>];
+    }]>];
 
   let extraClassDeclaration = [{
     /// The result of a tensor_load is always a tensor.
@@ -3600,9 +3607,9 @@ def TransposeOp : Std_Op<"transpose", [NoSideEffect]>,
     ```
   }];
 
-  let builders = [OpBuilder<
-    "Value in, AffineMapAttr permutation, "
-    "ArrayRef<NamedAttribute> attrs = {}">];
+  let builders = [
+    OpBuilderDAG<(ins "Value":$in, "AffineMapAttr":$permutation,
+      CArg<"ArrayRef<NamedAttribute>", "{}">:$attrs)>];
 
   let extraClassDeclaration = [{
     static StringRef getPermutationAttrName() { return "permutation"; }
@@ -3638,11 +3645,11 @@ def TruncateIOp : Std_Op<"trunci", [NoSideEffect, SameOperandsAndResultShape]> {
   let arguments = (ins SignlessIntegerLike:$value);
   let results = (outs SignlessIntegerLike);
 
-  let builders = [OpBuilder<
-    "Value value, Type destType", [{
+  let builders = [
+    OpBuilderDAG<(ins "Value":$value, "Type":$destType), [{
       $_state.addOperands(value);
       $_state.addTypes(destType);
-  }]>];
+    }]>];
 
   let parser = [{
     return impl::parseCastOp(parser, result);
@@ -3906,11 +3913,11 @@ def ZeroExtendIOp : Std_Op<"zexti", [NoSideEffect, SameOperandsAndResultShape]>
   let arguments = (ins SignlessIntegerLike:$value);
   let results = (outs SignlessIntegerLike);
 
-  let builders = [OpBuilder<
-    "Value value, Type destType", [{
+  let builders = [
+    OpBuilderDAG<(ins "Value":$value, "Type":$destType), [{
       $_state.addOperands(value);
       $_state.addTypes(destType);
-  }]>];
+    }]>];
 
   let parser = [{
     return impl::parseCastOp(parser, result);

diff  --git a/mlir/include/mlir/Dialect/Vector/VectorOps.td b/mlir/include/mlir/Dialect/Vector/VectorOps.td
index 8887dfd7dfc8..604c2994a059 100644
--- a/mlir/include/mlir/Dialect/Vector/VectorOps.td
+++ b/mlir/include/mlir/Dialect/Vector/VectorOps.td
@@ -149,11 +149,11 @@ def Vector_ContractionOp :
     ```
   }];
   let builders = [
-    OpBuilder<"Value lhs, Value rhs, Value acc, ArrayAttr indexingMaps, "
-              "ArrayAttr iteratorTypes">,
-    OpBuilder<"Value lhs, Value rhs, Value acc, "
-              "ArrayRef<ArrayRef<AffineExpr>> indexingExprs, "
-	      "ArrayRef<StringRef> iteratorTypes">
+    OpBuilderDAG<(ins "Value":$lhs, "Value":$rhs, "Value":$acc,
+      "ArrayAttr":$indexingMaps, "ArrayAttr":$iteratorTypes)>,
+    OpBuilderDAG<(ins "Value":$lhs, "Value":$rhs, "Value":$acc,
+      "ArrayRef<ArrayRef<AffineExpr>>":$indexingExprs,
+      "ArrayRef<StringRef>":$iteratorTypes)>
   ];
   let extraClassDeclaration = [{
     VectorType getLhsType() {
@@ -312,7 +312,7 @@ def Vector_ShuffleOp :
     ```
   }];
   let builders = [
-    OpBuilder<"Value v1, Value v2, ArrayRef<int64_t>">
+    OpBuilderDAG<(ins "Value":$v1, "Value":$v2, "ArrayRef<int64_t>")>
   ];
   let extraClassDeclaration = [{
     static StringRef getMaskAttrName() { return "mask"; }
@@ -355,8 +355,8 @@ def Vector_ExtractElementOp :
   }];
 
   let builders = [
-    OpBuilder<"Value source, int64_t position">,
-    OpBuilder<"Value source, Value position">
+    OpBuilderDAG<(ins "Value":$source, "int64_t":$position)>,
+    OpBuilderDAG<(ins "Value":$source, "Value":$position)>
   ];
   let extraClassDeclaration = [{
     VectorType getVectorType() {
@@ -384,10 +384,10 @@ def Vector_ExtractOp :
     ```
   }];
   let builders = [
-    OpBuilder<"Value source, ArrayRef<int64_t> position">,
+    OpBuilderDAG<(ins "Value":$source, "ArrayRef<int64_t>":$position)>,
     // Convenience builder which assumes the values in `position` are defined by
     // ConstantIndexOp.
-    OpBuilder<"Value source, ValueRange position">
+    OpBuilderDAG<(ins "Value":$source, "ValueRange":$position)>
   ];
   let extraClassDeclaration = [{
     static StringRef getPositionAttrName() { return "position"; }
@@ -434,8 +434,8 @@ def Vector_ExtractSlicesOp :
     ```
   }];
   let builders = [
-    OpBuilder<"TupleType tupleType, Value vector, ArrayRef<int64_t> sizes, "
-              "ArrayRef<int64_t> strides">
+    OpBuilderDAG<(ins "TupleType":$tupleType, "Value":$vector,
+      "ArrayRef<int64_t>":$sizes, "ArrayRef<int64_t>":$strides)>
   ];
   let extraClassDeclaration = [{
     VectorType getSourceVectorType() {
@@ -490,8 +490,8 @@ def Vector_ExtractMapOp :
     %ev = vector.extract_map %v[%id] : vector<32xf32> to vector<1xf32>
     ```
   }];
-  let builders = [OpBuilder<
-    "Value vector, Value id, int64_t multiplicity">];
+  let builders = [
+    OpBuilderDAG<(ins "Value":$vector, "Value":$id, "int64_t":$multiplicity)>];
   let extraClassDeclaration = [{
     VectorType getSourceVectorType() {
       return vector().getType().cast<VectorType>();
@@ -536,8 +536,8 @@ def Vector_FMAOp :
   let verifier = ?;
   let assemblyFormat = "$lhs `,` $rhs `,` $acc attr-dict `:` type($lhs)";
   let builders = [
-    OpBuilder<"Value lhs, Value rhs, Value acc",
-      "build($_builder, $_state, lhs.getType(), lhs, rhs, acc);">
+    OpBuilderDAG<(ins "Value":$lhs, "Value":$rhs, "Value":$acc),
+    [{build($_builder, $_state, lhs.getType(), lhs, rhs, acc);}]>
   ];
   let extraClassDeclaration = [{
     VectorType getVectorType() { return lhs().getType().cast<VectorType>(); }
@@ -576,8 +576,8 @@ def Vector_InsertElementOp :
   }];
 
   let builders = [
-    OpBuilder<"Value source, Value dest, int64_t position">,
-    OpBuilder<"Value source, Value dest, Value position">
+    OpBuilderDAG<(ins "Value":$source, "Value":$dest, "int64_t":$position)>,
+    OpBuilderDAG<(ins "Value":$source, "Value":$dest, "Value":$position)>
   ];
   let extraClassDeclaration = [{
     Type getSourceType() { return source().getType(); }
@@ -613,9 +613,10 @@ def Vector_InsertOp :
   }];
 
   let builders = [
-    OpBuilder<"Value source, Value dest, ArrayRef<int64_t> position">,
+    OpBuilderDAG<(ins "Value":$source, "Value":$dest,
+      "ArrayRef<int64_t>":$position)>,
     // Convenience builder which assumes all values are constant indices.
-    OpBuilder<"Value source, Value dest, ValueRange position">
+    OpBuilderDAG<(ins "Value":$source, "Value":$dest, "ValueRange":$position)>
   ];
   let extraClassDeclaration = [{
     static StringRef getPositionAttrName() { return "position"; }
@@ -724,8 +725,8 @@ def Vector_InsertMapOp :
     %v = vector.insert_map %ev %v[%id] : vector<1xf32> into vector<32xf32>
     ```
   }];
-  let builders = [OpBuilder<
-    "Value vector, Value dest, Value id, int64_t multiplicity">];
+  let builders = [OpBuilderDAG<(ins "Value":$vector, "Value":$dest,
+                                "Value":$id, "int64_t":$multiplicity)>];
   let extraClassDeclaration = [{
     VectorType getSourceVectorType() {
       return vector().getType().cast<VectorType>();
@@ -779,8 +780,8 @@ def Vector_InsertStridedSliceOp :
   }];
 
   let builders = [
-    OpBuilder<"Value source, Value dest, ArrayRef<int64_t> offsets, "
-              "ArrayRef<int64_t> strides">
+    OpBuilderDAG<(ins "Value":$source, "Value":$dest,
+      "ArrayRef<int64_t>":$offsets, "ArrayRef<int64_t>":$strides)>
   ];
   let extraClassDeclaration = [{
     static StringRef getOffsetsAttrName() { return "offsets"; }
@@ -843,7 +844,7 @@ def Vector_OuterProductOp :
   }];
   let builders = [
     // Build an op without mask, use the type of `acc` as the return type.
-    OpBuilder<"Value lhs, Value rhs, Value acc">
+    OpBuilderDAG<(ins "Value":$lhs, "Value":$rhs, "Value":$acc)>
   ];
   let extraClassDeclaration = [{
     VectorType getOperandVectorTypeLHS() {
@@ -1017,8 +1018,8 @@ def Vector_ExtractStridedSliceOp :
     ```
   }];
   let builders = [
-    OpBuilder<"Value source, ArrayRef<int64_t> offsets, "
-              "ArrayRef<int64_t> sizes, ArrayRef<int64_t> strides">
+    OpBuilderDAG<(ins "Value":$source, "ArrayRef<int64_t>":$offsets,
+      "ArrayRef<int64_t>":$sizes, "ArrayRef<int64_t>":$strides)>
   ];
   let extraClassDeclaration = [{
     static StringRef getOffsetsAttrName() { return "offsets"; }
@@ -1182,12 +1183,13 @@ def Vector_TransferReadOp :
 
   let builders = [
     // Builder that sets padding to zero.
-    OpBuilder<"VectorType vector, Value memref, ValueRange indices, "
-              "AffineMap permutationMap, ArrayRef<bool> maybeMasked = {}">,
+    OpBuilderDAG<(ins "VectorType":$vector, "Value":$memref,
+      "ValueRange":$indices, "AffineMap":$permutationMap,
+      CArg<"ArrayRef<bool>", "{}">:$maybeMasked)>,
     // Builder that sets permutation map (resp. padding) to
     // 'getMinorIdentityMap' (resp. zero).
-    OpBuilder<"VectorType vector, Value memref, ValueRange indices, "
-              "ArrayRef<bool> maybeMasked = {}">
+    OpBuilderDAG<(ins "VectorType":$vector, "Value":$memref,
+      "ValueRange":$indices, CArg<"ArrayRef<bool>", "{}">:$maybeMasked)>
   ];
 
   let hasFolder = 1;
@@ -1265,10 +1267,10 @@ def Vector_TransferWriteOp :
 
   let builders = [
     // Builder that sets permutation map to 'getMinorIdentityMap'.
-    OpBuilder<"Value vector, Value memref, ValueRange indices, "
-              "ArrayRef<bool> maybeMasked = {}">,
-    OpBuilder<"Value vector, Value memref, ValueRange indices, "
-              "AffineMap permutationMap">,
+    OpBuilderDAG<(ins "Value":$vector, "Value":$memref, "ValueRange":$indices,
+      CArg<"ArrayRef<bool>", "{}">:$maybeMasked)>,
+    OpBuilderDAG<(ins "Value":$vector, "Value":$memref, "ValueRange":$indices,
+      "AffineMap":$permutationMap)>,
   ];
 
   let hasFolder = 1;
@@ -1712,9 +1714,7 @@ def Vector_TypeCastOp :
 
   /// Build the canonical memRefType with a single vector.
   /// E.g. memref<4 x 5 x vector<6 x f32>> -> memref<vector<4 x 5 x 6 x f32>>.
-  let builders = [
-    OpBuilder<"Value source">
-  ];
+  let builders = [OpBuilderDAG<(ins "Value":$source)>];
 
   let extraClassDeclaration = [{
     MemRefType getMemRefType() {
@@ -1870,7 +1870,7 @@ def Vector_TransposeOp :
     ```
   }];
   let builders = [
-    OpBuilder<"Value vector, ArrayRef<int64_t> transp">
+    OpBuilderDAG<(ins "Value":$vector, "ArrayRef<int64_t>":$transp)>
   ];
   let extraClassDeclaration = [{
     VectorType getVectorType() {
@@ -2015,8 +2015,8 @@ def Vector_MatmulOp : Vector_Op<"matrix_multiply", [NoSideEffect,
     ```
   }];
   let builders = [
-   OpBuilder<"Value lhs, Value rhs, unsigned lhsRows, unsigned lhsColumns, "
-             "unsigned rhsColumns",
+   OpBuilderDAG<(ins "Value":$lhs, "Value":$rhs, "unsigned":$lhsRows,
+     "unsigned":$lhsColumns, "unsigned":$rhsColumns),
    [{
      $_state.addOperands({lhs, rhs});
      $_state.addAttribute("lhs_rows",$_builder.getI32IntegerAttr(lhsRows));

diff  --git a/mlir/test/lib/Dialect/Test/TestOps.td b/mlir/test/lib/Dialect/Test/TestOps.td
index 20ae5b92e742..48b37719b0e3 100644
--- a/mlir/test/lib/Dialect/Test/TestOps.td
+++ b/mlir/test/lib/Dialect/Test/TestOps.td
@@ -661,7 +661,7 @@ def OpFuncRef : TEST_Op<"op_funcref"> {
   let description = [{
     The "test.op_funcref" is a test op with a reference to a function symbol.
   }];
-  let builders = [OpBuilder<[{FuncOp function}]>];
+  let builders = [OpBuilderDAG<(ins "FuncOp":$function)>];
 }
 
 // Pattern add the argument plus a increasing static number hidden in
@@ -1142,16 +1142,15 @@ def MixedVResultOp3 : TEST_Op<"mixed_variadic_out3",
   // We will use this op in a nested result pattern, where we cannot deduce the
   // result type. So need to provide a builder not requiring result types.
   let builders = [
-    OpBuilder<
-      "IntegerAttr count",
-      [{
-        auto i32Type = $_builder.getIntegerType(32);
-        $_state.addTypes(i32Type); // $output1
-        SmallVector<Type, 4> types(count.getInt(), i32Type);
-        $_state.addTypes(types); // $output2
-        $_state.addTypes(types); // $output3
-        $_state.addAttribute("count", count);
-      }]>
+    OpBuilderDAG<(ins "IntegerAttr":$count),
+    [{
+      auto i32Type = $_builder.getIntegerType(32);
+      $_state.addTypes(i32Type); // $output1
+      SmallVector<Type, 4> types(count.getInt(), i32Type);
+      $_state.addTypes(types); // $output2
+      $_state.addTypes(types); // $output3
+      $_state.addAttribute("count", count);
+    }]>
   ];
 }
 
@@ -1202,13 +1201,14 @@ def LegalOpB : TEST_Op<"legal_op_b">, Results<(outs I32)>;
 def IllegalOpTerminator : TEST_Op<"illegal_op_terminator", [Terminator]>;
 def IllegalOpWithRegion : TEST_Op<"illegal_op_with_region"> {
   let skipDefaultBuilders = 1;
-  let builders = [OpBuilder<"",
-                  [{ Region *bodyRegion = $_state.addRegion();
-                     OpBuilder::InsertionGuard g($_builder);
-                     Block *body = $_builder.createBlock(bodyRegion);
-                     $_builder.setInsertionPointToEnd(body);
-                     $_builder.create<IllegalOpTerminator>($_state.location);
-                  }]>];
+  let builders = [OpBuilderDAG<(ins),
+    [{
+       Region *bodyRegion = $_state.addRegion();
+       OpBuilder::InsertionGuard g($_builder);
+       Block *body = $_builder.createBlock(bodyRegion);
+       $_builder.setInsertionPointToEnd(body);
+       $_builder.create<IllegalOpTerminator>($_state.location);
+    }]>];
 }
 def IllegalOpWithRegionAnchor : TEST_Op<"illegal_op_with_region_anchor">;
 
@@ -1245,8 +1245,8 @@ def TestRecursiveRewriteOp : TEST_Op<"recursive_rewrite"> {
 def TestRegionBuilderOp : TEST_Op<"region_builder">;
 def TestReturnOp : TEST_Op<"return", [ReturnLike, Terminator]> {
   let arguments = (ins Variadic<AnyType>);
-  let builders = [
-    OpBuilder<"", [{ build($_builder, $_state, {}); }]>
+  let builders = [OpBuilderDAG<(ins),
+    [{ build($_builder, $_state, {}); }]>
   ];
 }
 def TestCastOp : TEST_Op<"cast">,

diff  --git a/mlir/tools/mlir-linalg-ods-gen/mlir-linalg-ods-gen.cpp b/mlir/tools/mlir-linalg-ods-gen/mlir-linalg-ods-gen.cpp
index 82b90ec53b26..4e7fa3ba7a34 100644
--- a/mlir/tools/mlir-linalg-ods-gen/mlir-linalg-ods-gen.cpp
+++ b/mlir/tools/mlir-linalg-ods-gen/mlir-linalg-ods-gen.cpp
@@ -1461,8 +1461,8 @@ void TCParser::printODS(llvm::raw_ostream &os, StringRef cppOpName,
       let regions = (region AnyRegion:$region);
 
       let skipDefaultBuilders = 1;
-      let builders = [ OpBuilder<
-        "ValueRange inputs, ValueRange outputBuffers",
+      let builders = [ OpBuilderDAG<
+        (ins "ValueRange":$inputs, "ValueRange":$outputBuffers),
         [{{
           $_state.addOperands(inputs);
           $_state.addOperands(outputBuffers);
@@ -1479,9 +1479,9 @@ void TCParser::printODS(llvm::raw_ostream &os, StringRef cppOpName,
             TypeRange(outputBuffers),
             TypeRange(),
             TypeRange());
-        }]>, OpBuilder<
-        "TypeRange resultTensorTypes, ValueRange inputs, "
-        "ValueRange outputBuffers, ValueRange initTensors",
+        }]>, OpBuilderDAG<
+        (ins "TypeRange":$resultTensorTypes, "ValueRange":$inputs,
+             "ValueRange":$outputBuffers, "ValueRange":$initTensors),
         [{{
           $_state.addOperands(inputs);
           $_state.addOperands(outputBuffers);
@@ -1500,8 +1500,9 @@ void TCParser::printODS(llvm::raw_ostream &os, StringRef cppOpName,
             TypeRange(outputBuffers),
             TypeRange(initTensors),
             resultTensorTypes);
-        }]>, OpBuilder<
-        "TypeRange resultTensorTypes, ValueRange operands, ArrayRef<NamedAttribute> attributes = {{}",
+        }]>, OpBuilderDAG<
+        (ins "TypeRange":$resultTensorTypes, "ValueRange":$operands,
+             CArg<"ArrayRef<NamedAttribute>", "{{}">:$attributes),
         [{{
           $_state.addOperands(operands);
           $_state.addAttributes(attributes);

diff  --git a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
index f296b3284907..e5cd9f560ddc 100644
--- a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
+++ b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
@@ -1232,6 +1232,11 @@ void OpEmitter::genBuilder() {
         llvm::Optional<StringRef> params =
             builderDef->getValueAsOptionalString("params");
         FmtContext fctx;
+        if (params.hasValue()) {
+          PrintWarning(op.getLoc(),
+                       "Op uses a deprecated, string-based OpBuilder format; "
+                       "use OpBuilderDAG with '(ins <...>)' instead");
+        }
         std::string paramStr =
             params.hasValue() ? builderSignatureFromString(params->trim(), fctx)
                               : builderSignatureFromDAG(


        


More information about the Mlir-commits mailing list