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

    <tr>
        <th>Summary</th>
        <td>
            mlir: AffineScalarReplacement Pass does not remove all redundant loads
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          rohany
      </td>
    </tr>
</table>

<pre>
    The following MLIR file:

```
  func.func @legateMLIRKernel3(%arg0: memref<?xf64>, %arg1: memref<?xf64>) attributes {llvm.emit_c_interface} {
 %alloc = memref.alloc() : memref<1xf64>
    %alloc_0 = memref.alloc() : memref<1xf64>
    %c0 = arith.constant 0 : index
    %dim = memref.dim %arg0, %c0 : memref<?xf64>
    affine.for %arg2 = #map(%c0) to #map(%dim) {
      %0 = affine.load %arg0[%arg2] : memref<?xf64>
      %1 = arith.addf %0, %0 : f64
      affine.store %1, %alloc_0[0] : memref<1xf64>
      %2 = affine.load %alloc_0[0] : memref<1xf64>
 %3 = affine.load %arg0[%arg2] : memref<?xf64>
      %4 = arith.addf %2, %3 : f64
      affine.store %4, %alloc[0] : memref<1xf64>
      %5 = affine.load %alloc[0] : memref<1xf64>
      %6 = affine.load %arg0[%arg2] : memref<?xf64>
      %7 = arith.addf %5, %6 : f64
      affine.store %7, %arg1[%arg2] : memref<?xf64>
    }
    return
 }
```

Has some loads that should be eliminated once load-store forwarding is performed. Running the affine scalar replacement pass (either directly via a `PassManager` or `mlir-opt`) yields:

```
  func.func @legateMLIRKernel3(%arg0: memref<?xf64>, %arg1: memref<?xf64>) attributes {llvm.emit_c_interface} {
    %c0 = arith.constant 0 : index
    %dim = memref.dim %arg0, %c0 : memref<?xf64>
    affine.for %arg2 = #map(%c0) to #map(%dim) {
      %0 = affine.load %arg0[%arg2] : memref<?xf64>
 %1 = arith.addf %0, %0 : f64
      %2 = affine.load %arg0[%arg2] : memref<?xf64>
      %3 = arith.addf %1, %2 : f64
      %4 = affine.load %arg0[%arg2] : memref<?xf64>
      %5 = arith.addf %3, %4 : f64
 affine.store %5, %arg1[%arg2] : memref<?xf64>
    }
    return
 }
```

which still contains multiple redundant loads. Application of the pass again removes these loads, which is the desired result. Based on discussion at https://discourse.llvm.org/t/understanding-the-affine-loop-fusion-pass/69452/19?u=rohany, this is a bug, as the pass should not require multiple applications.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsVl9v47YT_DT0y8KCTP2zH_SQnH_Gr2gPKNK-B2tyZbGgSJWkksu3L0jJiZNL0OQQFChQIFAgijs7M0uNhd6rkyFqWXXNqv0Kp9Bb1zrbo3lYHa18aH_vCTqrtb1X5gRff_npBjqliRVXLN-z_Hyt8-Uv3QJ0kxFZvAArc00nDBRrfyZnSBeMbxmv0J1yVlzBQIOjjhVfWHH41tUlK_7H-BeYd2ze3LEDDMGp4xTIA2uutb4bMhpUuBW3ygRyHQpizT4-W2hFSK2tAFbsF9AsLSRCO3jWa3PutEiCx_Lb_McBxFyLToU-E9b4gCZAniqVkfTt2W6phstW6XYxbnZI5PCWQY842HXKUNZZtxTzhMl4MeA4j0LkkX2wzxalGpKmR_tgYbVImGG1RflIqrpeOrBq__fEEtjmwg-UsksNFnWzuFh2UbP09cE6SgDnwzKPhlXX-Xfdvx9F6s1fFfJ-HMar4jO9KF_xgi_yivd4UV568REnqjed-AhK_ZlmNK-YUS366veY0VymyMcIsGb_dOMoTM6cR35-8iLy5uv_0YO3A0EU7yH0GMD3dtISjgSk1aAMBpJgjZg3rWe6nXX36GTMWOVhJNdZN5DM4GYyJq6GnhaB4AVqdOBo1ChoIBNgRO-B8S2p0JMDqRyJoB_gTiEgsDr_Fb3_igZP5FidQ4yCOh-0cms7hiiC7-BBkZb-35ns_4Xry2D6cK6-mYc_-P4WrxA4ZzV_g0D5mQSqVwgUC4HyBYGX2VH989lx3yvRgw9KaxDWBFTGwzDpoEZN4EhORsbjnKIlg6tx1EpgUNaA7VI-pBTAEyoDjgZ7RzGByC9pFBXNPVRaB0leOZLgyE86ZHCNPiUTSOXF5H1ExgB9CGNKBX5g_BCf2cl5ytJbad2J8UNg_DAZSS6-cDHE1qGn9ezpWls7rrspwq0jQ8YP9a6Mv2uHzY4Vh4kV-_mLMzIMvfKRIMJxOsUF9E_alig1NoCjPyfl6MkgfPLDZyvZFnJX7HBF7abeFk2xbcrtqm9riTWR2BwlL8tj1Wy55DUeBVW7hrDuVqrlOS_yapNvmg3n26zmVSPqsqq2ZS1yXrMypwGVftS_Ut5P1Na8LnYrjUfS_vw97dq4aX2cTj6GpfLBP5UFFTS1MYPjkbpKZv2Wov3mItljcIO05BfVcayAWr88EKvJ6fb5qE4q9NMxE3Zg_BDbLv_Wo7N_kIhDS9TTRCL7vwIAAP__9N1vsA">