This PR introduces support for `emitc::LvalueType` in
`emitc::VerbatimOp`, providing a mechanism to reduce the number of
operations required when working with verbatim operations whose
arguments are of type `emitc::LvalueType`.
Before:
```mlir
emitc.func @foo() {
%a = "emitc.variable"() <{value = #emitc.opaque<"1">}> : () -> !emitc.lvalue<i32>
%loaded_a = load %a : !emitc.lvalue<i32>
emitc.verbatim "{} + {};" args %loaded_a, %loaded_a : i32, i32
return
}
```
After:
```mlir
emitc.func @bar() {
%a = "emitc.variable"() <{value = #emitc.opaque<"1">}> : () -> !emitc.lvalue<i32>
emitc.verbatim "{} + {};" args %a, %a : !emitc.lvalue<i32>, !emitc.lvalue<i32>
return
}
```
You can now write something like this:
```mlir
emitc.func @baz() {
%a = "emitc.variable"() <{value = #emitc.opaque<"1">}> : () -> !emitc.lvalue<i32>
emitc.verbatim "++{};" args %a : !emitc.lvalue<i32>
return
}
```
Multi-Level Intermediate Representation
See https://mlir.llvm.org/ for more information.