<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/145695>145695</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [mlir] prop-dict printout sometimes starts with `<{`, but sometimes with `< {`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            mlir
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          peledins-zimperium
      </td>
    </tr>
</table>

<pre>
    This happens, because:
```
void OpState::genericPrintProperties(OpAsmPrinter &p, Attribute properties,
 ArrayRef<StringRef> elidedProps) {
...
if (dictAttr && !elidedProps.empty()) {
...
    if (atLeastOneAttr) {
      p << "<";
 p.printOptionalAttrDict(dictAttr.getValue(), elidedProps); // "< {" - has space
      p << ">";
    }
  } else {
    p << "<" << properties << ">"; // "<{" - no space
  }
...
```

This depends on whether there are ellided properties being specified in printout or not:
In "< {" case the end result is:
```
AsmPrinter::Impl::printOptionalAttrDict
...
 // Otherwise, print them all out in braces.
    os << " {"; //// THE SPACE IS COMING FROM HERE
    interleaveComma(filteredAttrs,
 [&](NamedAttribute attr) { printNamedAttribute(attr); });
    os << '}';
```
But in other case

```
void AsmPrinter::Impl::printAttributeImpl(Attribute attr,
 AttrTypeElision typeElision) {
  if (!isa<BuiltinDialect>(attr.getDialect())) {
...
  } else if (auto dictAttr = llvm::dyn_cast<DictionaryAttr>(attr)) {
    os << '{';
 interleaveComma(dictAttr.getValue(),
                    [&](NamedAttribute attr) { printNamedAttribute(attr); });
    os << '}';
```

It would be great to be consistent.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzEVV2P6jgP_jXhxhpUUlrgohelwHtGes9hNDPa21XaGsgqTaLEnRH761dJ-eh8HO3lVqhYieM8th8_Fd7Lo0YsWLZm2WYiejoZV1hU2ErtH_6WnUUn-25Sm_ZcvJ6kh5OwFrVnvIIaG9F7ZGnJkpLlyeWXlG9GtrC3LyQo7qblETU62Tw5qenJGYuOJHrGl3tb-i4uowPGcxsCl0RO1j0h2JFvxZISSufE-RkPLK1eyEl9jPYWUMkW2xDaM74CtlizpJxOpywp5QEYX7ayoRA3XMJ4DozPRmem2Fk6M75kfPX5PADAEEPQ_1F42msMke5-EB8LLK1YWgHjPFjhHXft1IYE95ak0UKFsxvZ0AjU9Ij0h1A9XhFUnxJi6RoY3zG-u0SPN3MOD3ASHrwVDf4GyPYOBADYYhMtttgAKo-jDL7ivy7cu_Bd5I_Abri0GcEarh3qOWYKS8rIqhYt6taD0fB-Qjqhg_BCEA4BVazFGEaNUh_BW2zkQWILUkOssekJjANtaGDlo_5Ur0Z4DKEBdQsOfa8IpP9K4TsrBwI_dlYN1ve9vJHlUox9gP8uPYZexiPh1g6EUhBASg21Ew36K8PMuLYXtPfiXqK-_tjCy1NZbeHxBar9z8df_4Pd8_4n_Ng-b69UDaAVijesTNcJxpcHqQgdtgHsdY7CxPOcZRvGl79EN2wOMyfu3B6Qf9yPcxA9IrzFZrC-SWMRNxfD5ri466EAJvY5dGRgwhcJ-Zcm3CDFdb78nMIgGETu9Wxxq6SXRgPd7fEADwPO-Ex6wdJq3UtFUm-kUNhQpHrMOgzqdfEqFl_14jZcF9noycBdf9INKPXWDYm0Z_1nIzyxtAo8CqRy56gutzs_XPFNjde3Gn_T-98rzE0uPj7_KTHCxBK8m161UCMcHQoCMsFujPbSE2qaTtoibVfpSkywmC2yZJnlPJlNTkWWcZwtD7zm6SxPxeowb7IkmfN61S6bA68nsuAJz5KcZzOe5fPZFFeHusmX6WGVrObzhWDzBDsh1TR0aGrccSK977GYzbN8lU2UqFH5-LnkvFPShSHNNhNXBP-Huj96Nk-U9OTvEUiSip_YeCDbRB17CI25a5Y3HZLs0IMn4cjDu6QThKIMipon8YP7wXPkAoPPpHeqOBHZKGhRMo6STn09bUzH-C7Sbvh7sM78FVm8ixl6xneXJN8K_k8AAAD__7KhYHI">