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

    <tr>
        <th>Summary</th>
        <td>
            [WebAssembly] Suboptimal lowering of small memsets/memcpys
        </td>
    </tr>

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

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

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

<pre>
    See this godbolt: [link](https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:llvm,selection:(endColumn:49,endLineNumber:2,positionColumn:49,positionLineNumber:2,selectionStartColumn:49,selectionStartLineNumber:2,startColumn:49,startLineNumber:2),source:'define+void+@suboptimal_memset(ptr)+%230+%7B%0A++++call+void+@llvm.memset.p0.i32(ptr+align+1+%250,+i8+0,+i32+16,+i1+false)%0A++++ret+void%0A%7D%0A'),l:'5',n:'0',o:'LLVM+IR+source+%231',t:'0')),k:47.608626786201654,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:irclangtrunk,filters:(b:'0',binary:'1',binaryObject:'1',commentOnly:'0',debugCalls:'1',demangle:'0',directives:'0',execute:'1',intel:'0',libraryCode:'1',trim:'1'),flagsViewOpen:'1',fontScale:14,fontUsePx:'0',j:2,lang:llvm,libs:!(),options:'-target+wasm32+-O2+-mllvm+--print-after-all',overrides:!(),selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1),l:'5',n:'0',o:'+clang+(trunk)+(Editor+%231)',t:'0')),k:52.39137321379835,l:'4',m:100,n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4).

```llvm
define void @suboptimal_memset(ptr) #0 {
    call void @llvm.memset.p0.i32(ptr align 1 %0, i8 0, i32 16, i1 false)
    ret void
}
```
```wasm
suboptimal_memset:                      # @suboptimal_memset
        local.get       0
        i64.const 0
        i64.store       0:p2align=0
        local.get       0
 i32.const       8
        i32.add 
        i64.const       0
 i64.store       0:p2align=0
        end_function
```
Lowering doesn't add the no-wrapping attributes necessary to form WASM address modes. It could, however, as the LLVM model assumes that the destination must be dereferenceable (some prior optimization even adds an attribute to that effect).

Frontend-wise, this forces us to emit a sequence of stores/loads instead of a simple `memcpy/memset`, so that LLVM reverse folds them back if there are enough. This bloats the IR and complicates code.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycV19v2zYQ_zT0C2FBIi1LfvCD7SxAgXQZmq19LCjxZLPhH42kknqffiCpuJHtZF0FQxbv_x3vfpSYc2KvAdao3KLyZsYGfzB2_SD0XsKmbS14YfSsMfy4fgDA_iAc3hveGOkR3WBUbqXQj6i8QaQ-eN87RDeI3CJyO0plxu4jge4jq0CkRqR-e3FAdNMaDr9x4Y1FZCcit-6EBM0UxFVVIFIhsuuM9g8tk4FaLEbCXw7--J7E8iT2LbAR2Ummgy8pnxQiOwcS2pBfcgCa74wcVFguVojsQPM7oeH3QTVgEd0QRHa9cSKoTCVfqBfiJxcPnlk_VZryLlWvaFwTjAwz2HasDIdOaEBk-2QER2SLFrkbGtN7oZj8qkA58IjUvbdRd4tISWieHqpwyzdxMf5aJuXEWChelsxkfZ4JSl6sbZkUe43IthjNljkiO0S2okZk-_Ic5LfFclwF0Y5JBzGYM982RDq6jqyyuhmfqpS4TDmXaZv1ZNNNWt3dff6IyPbDJ0S2Y53GpMce8q-1VsnuYyh5lS3zekmWVb0kebEsFz8cLt5xmBZhEPIr1nfX-131QsKrbj9R6EbYNvStt4N-DB0upAeb5qxuJgE0QjN7nAxIIt0336D1E0ZrlALt77U8TmxwaIb9jknpJuIcFAuYMJUVNnTwE7gJGb5DO_jpoArtQU6kpGgss8ed4VNJb4V6TQg16yTbu88Cnu970L8KAOQCAKRo3KutCJ7CnBg95jP3zO5jDz4zp2Ljzu_jXSUL2_m8t0L7Oes82HkcldgJT2Ct4HBu_R3EKa4ATnENcIq38KZ4G28uWZealwrX5CZoU_z0EAYgibUPo1ePrZzQp34B-tNQrt6fy5JkdFXQipKCVqualhdjGfqnyPNfG9BXGZH_nPJryk9gXdriBSKrDOU3KN-M92WefrF9IinBNQ4gh9-FaowIzTGqtkkPY4wDNp8038JlHFEZFxglPMaixumfEhxxGIsCnzD4ZNyCj7bHyKubsxTOlmFCEukyBRoNXl6I0Os5n4IIlzQtk9ke_LjOp2yxXGSt0c5fYzhvLJz06KYn6YyiN_nPORGUjNbTVZ_5oCRjnOO3Qjoz9n8iAs2_doNOcHGt9HfmGazQe8wNOI1I5XEIxR8AazN_tqzvA5d5b0UzeHBYQwvOMXvE3uDOWIW_bB4-Bi0LzmFlOLgMf_C4NYPkoTMO5hme4rmEmYumw3EaJSVmzg0KApn5yOPgvNAsRIzV4DxuAs1CBxZ0C6yRgBGpnVGAeyuMxXHfxT9JBZ5Ah2AcZvpH2CHW6AG6LhxiZyN1a432oPn8WYQG3qVX1M7YFhweXNAGJTxm2MHfQwgDmw7HXXCI3ErDuMNCOw-MBw7DTqg-BLrMFai2PyJyO7blMs6NG-OJlbChPA5wZySPBVK4Ye0jFl1YWMDMAgZthv0hw3-G0BppmE-1_PAJM81xOOulaFnYovDmm834mvIVXbEZrIsqX9JlURdkdlg3tFk01QJYnrdlteDloly1NM-bplityoLPxJrkZJEXpCoooZRkSwLtqgBeQNFWTcHQIgfFhMwiXBi7nwnnBlhXq-WKzCRrQLr4MUCIhmccmYiQ8G1g10Fn3gx7F-BGOO9-WPHCy_gV8QWajXOgGnlE5Q1-OM02li_9GuqvAnSlsrpU4LY_utlg5frsM0L4w9BkrVFht-KpG__mvTXxpYbcxiCDlZjEvwEAAP__vUW5sQ">