[mlir] Add basic block arguments
This patch adds support for basic block arguments including parsing and printing.
In doing so noticed that `ssa-id-and-type` is undefined in the MLIR spec; suggested an implementation in the spec doc.
PiperOrigin-RevId: 205593369
diff --git a/include/mlir/IR/BasicBlock.h b/include/mlir/IR/BasicBlock.h
index 5b42a68..be64e4f 100644
--- a/include/mlir/IR/BasicBlock.h
+++ b/include/mlir/IR/BasicBlock.h
@@ -22,6 +22,7 @@
#include <memory>
namespace mlir {
+class BBArgument;
/// Each basic block in a CFG function contains a list of basic block arguments,
/// normal instructions, and a terminator instruction.
@@ -39,12 +40,34 @@
return function;
}
- // TODO: bb arguments
-
/// Unlink this BasicBlock from its CFGFunction and delete it.
void eraseFromFunction();
//===--------------------------------------------------------------------===//
+ // Block arguments management
+ //===--------------------------------------------------------------------===//
+
+ // This is the list of arguments to the block.
+ typedef ArrayRef<BBArgument *> BBArgListType;
+ BBArgListType getArguments() const { return arguments; }
+
+ using args_iterator = BBArgListType::iterator;
+ using reverse_args_iterator = BBArgListType::reverse_iterator;
+ args_iterator args_begin() const { return getArguments().begin(); }
+ args_iterator args_end() const { return getArguments().end(); }
+ reverse_args_iterator args_rbegin() const { return getArguments().rbegin(); }
+ reverse_args_iterator args_rend() const { return getArguments().rend(); }
+
+ bool args_empty() const { return arguments.empty(); }
+ BBArgument *addArgument(Type *type);
+ llvm::iterator_range<BBArgListType::iterator>
+ addArguments(ArrayRef<Type *> types);
+
+ unsigned getNumArguments() const { return arguments.size(); }
+ BBArgument *getArgument(unsigned i) { return arguments[i]; }
+ const BBArgument *getArgument(unsigned i) const { return arguments[i]; }
+
+ //===--------------------------------------------------------------------===//
// Operation list management
//===--------------------------------------------------------------------===//
@@ -105,6 +128,9 @@
/// This is the list of operations in the block.
OperationListType operations;
+ /// This is the list of arguments to the block.
+ std::vector<BBArgument *> arguments;
+
/// This is the owning reference to the terminator of the block.
TerminatorInst *terminator = nullptr;