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

    <tr>
        <th>Summary</th>
        <td>
            [X86] [AMX] Misoptimized copy of a zero tile
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    When a zero AMX tile has multiple uses, it's copied using a `tileload` + `tilestore` pair instead of another `tilezero` instruction. Example:
```
; ModuleID = 'LLVMDialectModule'
source_filename = "LLVMDialectModule"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

define void @amx_phi(ptr %0, ptr %1, ptr %2, i1 %3) {
.entry:
  %zero_tile = tail call x86_amx @llvm.x86.tilezero.internal(i16 16, i16 64)
  br i1 %3, label %.comp, label %.exit

.comp:
  %lhs_1 = tail call x86_amx @llvm.x86.tileloadd64.internal(i16 16, i16 64, ptr %0, i64 128)
  %ptr_1 = getelementptr i8, ptr %0, i64 1024
  %lhs_2 = tail call x86_amx @llvm.x86.tileloadd64.internal(i16 16, i16 64, ptr %ptr_1, i64 128)
 %rhs_1 = tail call x86_amx @llvm.x86.tileloadd64.internal(i16 16, i16 64, ptr %1, i64 128)
  %acc_1 = tail call x86_amx @llvm.x86.tdpbf16ps.internal(i16 16, i16 64, i16 64, x86_amx %zero_tile, x86_amx %lhs_1, x86_amx %rhs_1)
 %acc_2 = tail call x86_amx @llvm.x86.tdpbf16ps.internal(i16 16, i16 64, i16 64, x86_amx %zero_tile, x86_amx %lhs_2, x86_amx %rhs_1)
  br label %.exit

.exit:
  %res_1 = phi x86_amx [ %zero_tile, %.entry ], [ %acc_1, %.comp ]
  %res_2 = phi x86_amx [ %zero_tile, %.entry ], [ %acc_2, %.comp ]
  %ptr_out_1 = getelementptr i8, ptr %2, i64 0
  tail call void @llvm.x86.tilestored64.internal(i16 16, i16 64, ptr %ptr_out_1, i64 128, x86_amx %res_1)
  %ptr_out_2 = getelementptr i8, ptr %2, i64 1024
 tail call void @llvm.x86.tilestored64.internal(i16 16, i16 64, ptr %ptr_out_2, i64 128, x86_amx %res_2)

  ret void
}

; Function Attrs: nounwind
declare x86_amx @llvm.x86.tilezero.internal(i16, i16) #0
; Function Attrs: nounwind
declare x86_amx @llvm.x86.tileloadd64.internal(i16, i16, ptr, i64) #0
; Function Attrs: nounwind
declare void @llvm.x86.tilestored64.internal(i16, i16, ptr, i64, x86_amx) #0
; Function Attrs: nounwind
declare x86_amx @llvm.x86.tdpbf16ps.internal(i16, i16, i16, x86_amx, x86_amx, x86_amx) #0

attributes #0 = { nounwind }

!llvm.module.flags = !{!0}

!0 = !{i32 2, !"Debug Info Version", i32 3}
```
Generated asm using `llc test.ll -mcpu=sapphirerapids -O3`:
```
        tilezero        %tmm0
...
        tilestored %tmm0, 896(%rsp,%rbp)   # 1024-byte Folded Spill
        tileloadd 896(%rsp), %tmm1        # 1024-byte Folded Reload
...
 tilestored      %tmm0, 1920(%rsp,%rbp)  # 1024-byte Folded Spill
 tileloadd       1920(%rsp), %tmm1       # 1024-byte Folded Reload
```
In both cases `tilezero %tmm1` could be used instead because `%tmm0` is known to be defined by `tilezeo` instruction.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0V9tu2zgTfhr6ZmBDHB1sXfjCif_8KNBggS3Q7V1ASWObW4oSSCp1-vQLUpJPcQ7dbYJAJodz-MiZIWeEtXKriZYsvWHpeiI6t2vMUpL-3jzKcjcpmupp-deONAj4SaaB1f03cFIR7ISFulNOtoqgs2QZ3oJ0DOcWyqaVVEFnpd6CAJZFXkQ1omJZBAxvRpJ1jSFPa4U0ILV1JCpoNiB043ZkRj5v2rN5DtOVTjZ6Bv_bi7pVxOIVi9YsWrEsGv77aXwD903VKfq0BhavgeH88-ev92spFJWuX2I477lt05mSHjZSkRY1DQJ4RQB7ASfMlhxUwgklnprOjSI0rVm8ommL84jFqxjDx0_5-dSPsiR8pvIw4Lhg8YrjYrpZRMNIB1I2imfJ9Itnu4DiTPDFAGO_yB6yZNrp77r5oadK6m4_3eruINV_K9pITfDYyApYEol6_9DuJMNF6wwwTCPv1mHMT8YY3M39MGaYA5vf9ApnpJ15OjgFPId330OIGg_OCamgFEqBxyjqvTes1GM92y-y2ejumdSOjBaK4ULyDHjWW8wgSxjmo_bCHFHcghIFKT-blU3dnlNoL93pznuWM5xqZx_4OzH6aK6y5HWYh-MKxyizBILf8hObrTODzS05UlSTdl5ILq6KR5hcAMYPARxgXQXNMDUfdk7XTfoVUZbvs1m1xYZnrX3L4nF0UHMSqRf0EBkXNNPTTs7FY3yXOz4MI76O0afLKxkRCGcZYWj0dLuTR8XpzTMgQaFPfWDpOhB6puC3kcGnXFg_t4D_2QK-YsGHctO5t7MMx-CLRumjG8cL8iy2w_P1azkVgJwF-bm_6NxfJ1L4bvgnl8THbABf3wAeNjBuw5ALAAbqfH267B_qu06HVx1WzhnL4hXoptM_pK7GZ6pUwtCvvBjDDsLjhHH0-2xdv9EO5sJpDQf0743_irteMH3wy28-ghcurxMUw8_B_PXhGajwFc4ZWXSObFjqS5n5zQEcXEYO8gCrDqXZbKPE1g71D_cFCfLouUR0wiFjhOHq4AxxTUW3hU9608BXMlY22ldLfkMxQnxUdV5o_p80GeGoAmHroehlWaRUCY6smykF07psOxavrWjbnTRkRCsrC9M_Yq_lhQIWhr8xvsc5w9TV9cA0m82ec_dxcmDEW1jkGfO5mhrryyI_KFrvAq8uDjfGtHhyBHeNqqiCL61U6rniEPoXyvLh6nV1zY8Qr-j8s-8ALmCf4D3bHd4CzzF6AfWboI9o-78LXVdAv4n5wj2fNBSN20EprI_XY6My6vUNS9l0qoIidEjVocEpqBSdJS80btc3NxZCrQ6u8RJ9ZV5B8XRU_qwJmlTLuMrjXExoyeeY85wnOZ_slpsqyvJNlC3m8SISmBQc84QSHqcpzjOsJnKJESY84nO-SBecz5AoifNUJJt5ipjnLImoFlLNQoo1ZjuR1na05BznWTwJZYQNjSOiph8QVn2-pOuJWXqhadFtrb86pHX2qMZJp0LH-W2RsXTtn_HV_Tc_upe2aZ2s5U-qfBP5FFrBvvH0BzDpjFrunGv9lcXwjuHdVrpdV_hnn-GdNzH8TFvT_E2lY3gXgFmGdwPyxyX-EwAA__8br03h">