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

    <tr>
        <th>Summary</th>
        <td>
            [Aarch64] Unoptimized code generation when vectorizing the loop containing `zext`(v16i8 -> v16i32) and `llvm.abs` instruction
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          quic-eikansh
      </td>
    </tr>
</table>

<pre>
    LLVM v16.0.0 generates unoptimized code for the given IR compared to LLVM v15.0.0 for Aarch64 architecture. The regression starts after patch [D120571](https://reviews.llvm.org/D120571) .

In this [godbolt link](https://godbolt.org/z/6MKzP7fjs) it can be seen that a v16i8 is zero extended to v16i32 using `zext`. The two zero extended v16i32 vectors are then used with `sub` and the result is then fed to `llvm.abs`.

So, the pattern is:
1. Two zero extended vectors(v16i8 -> v16i32).  
2. `sub` operation on the vectors.  
3. Taking `llvm.abs` of the result in step 2.  

With `llc 15.0.0` it generates `uabdl` and `uabal2` instruction for the pattern which is optimal. But with `llc 16.0.0` it generates bunch of `tbl` and `sabd` instructions which results in suboptimal assembly.

Similarly, we get optimal code without the patch [D120571](https://reviews.llvm.org/D120571) when in the step 2 of the above pattern `sub` is replaced by `add`, `mul` or `shl`.

### Reduced LLVM IR
```
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
target triple = "aarch64-unknown-linux-gnu"

define dso_local i32 @test(i8* %p1, i8* %p2, i32 %lx, i32 %h) {
entry:
  %cmp258 = icmp sgt i32 %h, 0
  br i1 %cmp258, label %for.body.lr.ph, label %for.end

for.body.lr.ph: ; preds = %entry
  %idx.ext = sext i32 %lx to i64
  br label %for.body

for.body: ; preds = %for.body.lr.ph, %for.body
  %s0 = phi i32 [ 0, %for.body.lr.ph ], [ %op.rdx, %for.body ]
  %j.0261 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.body ]
  %p1.addr.0260 = phi i8* [ %p1, %for.body.lr.ph ], [ %add.ptr, %for.body ]
  %p2.addr.0259 = phi i8* [ %p2, %for.body.lr.ph ], [ %add.ptr172, %for.body ]
  %0 = bitcast i8* %p1.addr.0260 to <16 x i8>*
  %1 = load <16 x i8>, <16 x i8>* %0
  %2 = zext <16 x i8> %1 to <16 x i32>
  %3 = bitcast i8* %p2.addr.0259 to <16 x i8>*
  %4 = load <16 x i8>, <16 x i8>* %3
  %5 = zext <16 x i8> %4 to <16 x i32>
  %6 = sub nsw <16 x i32> %2, %5
  %7 = tail call <16 x i32> @llvm.abs.v16i32(<16 x i32> %6, i1 true)
  %8 = tail call i32 @llvm.vector.reduce.add.v16i32(<16 x i32> %7)
  %op.rdx = add i32 %8, %s0
  %add.ptr = getelementptr inbounds i8, i8* %p1.addr.0260, i64 %idx.ext
  %add.ptr172 = getelementptr inbounds i8, i8* %p2.addr.0259, i64 %idx.ext
  %inc = add nuw nsw i32 %j.0261, 1
  %exitcond.not = icmp eq i32 %inc, %h
  br i1 %exitcond.not, label %for.end, label %for.body

for.end:                                          ; preds = %for.body, %entry
  %s1 = phi i32 [ 0, %entry ], [ %op.rdx, %for.body ]
  ret i32 %s1
}

declare <16 x i32> @llvm.abs.v16i32(<16 x i32>, i1 immarg) 

declare i32 @llvm.vector.reduce.add.v16i32(<16 x i32>) 
```


</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykV19z2roS_zTiZQePLWNjHnggoZnp3HbmTtt77-Md2VqwGiG5khxIPv0ZSQYcIOlJT4YYZO3-9v9qxawVW4W4JMUdKdYT1rtWm-WvXjRTFI9M2XZSa_68_PLlv1_hKSuTNElhiwoNc2ihV7pzYidekEOjOcJGG3AtwlY8oYLP36DRu44Z5OA0DCBFAPGUK2aatpyB_xIOG9cbTOBHi2Bwa9BaoRVYx4yzwDYODXTMNS2Q4m6d0bSYZ6RYE1q1znWW5CtCHwh9MPgkcG8TKZ92iTZbQh-O1HQBCUnXJF3F52cFrhXWA241r7V0IIV6vIU67A-AL4Q-lF__9fLv-ean9bDCQcMU1AgW0aMyB8x7TFQgLLyg0YAHh4pHX_idnEJvhdoCKdMXPDhSptF6t9cXHAP5EzZOGwvMoHezgt4ih71wrcewfU3KFJjiIQYGbS-dlx5IN1EwKdPgGFZbL2_sje-a0PvA2jHn0CgQwf6wmSXw41qtqA-hVbR0SvJPg66ELhKAyEuTkXq688njI6tVEDaAnKjzBH6wx8EvI11Bb17Z5VMDO6Anxvj83-ANKRuIueZ5hRulLSnTntVcHr0V10zSQKmsM30TNDym89Ef-1Y0rfdoSHsmE7jr3cn_QWJ5U2Ldq6b1BpAydfVYsGU1vxBrBznRUBss7etBJDBrcVfL59ehEzshmZHPPoJ7hC26o46xML2OundHa_5hEe19QokYvhiEY3BYrZ_O_jpHXVgw2EnWIIf62W8w7u32-pIy3fXBJ9oEllZepiahefzAN-S9BwnN5PO3YbtMh09YOma8AzhzTLJnbzbJ10AoxemO5CuciorkK_-f06nISpKvwsOvyhnJV-VsKjLqCTJaTVVO47vv_h2lr4Q4IzqJRwEsdrRprx6V3qupFKo_TLeqP7HFJ8eNUAjc6v9L3TAJvrrJLHVoHaGVqAhdAaFFl3kHnZc0LD0tLeRhtGh9WMj8LsKjcub5VLrgCZpdR4sq6CmaXQd260a895AeaWsDIjtz-D3JapT-1UabxJ8HiTRJ115toeJjIy-o8xWQ_A46g9wO_iqiomctBT8keIjxsv7HyVbfu3xwzlpeaXVL9k2p12ZcoQRtbBo4ulZEPYo7SC-oIwSEEroPFIQWuksMP1xQBpoz9s8kpWX2Z_hCNe-Dd1nCODdexMiEmEURIibW7wQxzpPOmd8Io0dhxeINYfQDwrL5JfWFvGhRLVzDrBvVxthmf9Dl91kJB0-QfyJ0XAvR7VIzfkl1f8UWJI54aeB9iUk6Io24Y7m-a3waceZv6D123_t6zz6odz7iLd7Re_au3mWsxr4GZfcXZMEjQ7iKEc888DgmJDRMyiuu2elgT47jQnWNXIYGl4EzPRK6GOFXF_hD-wygcZ5ITDgovG_fEzF_jRsrN4Azzo_dpxostONEGNI10G7RocQdKuffCFXrXnEbYnx_O0PDRjkb9bxr6GxOP4I-yqN30YVqTgaqfh-iOhgam5LnzkYMeBCu0YonSrvzAYK_jlzndtReHSJj3pvnxa3j5bKRe7p8BX_7782GP6h5eerYt_twIP1oezd4Orjs4EgyX78-_xvph_iP18VQEmK3Y34qW8At2D8qhxHY63EqPid8mfNFvmATXGZllZdZUeXppF0uis0mLeu82izyuqjrNF_MZqxK59mmxnmZTsSSpjRPi3SRztO8SJMsq-blbJEXdZnjjGdkluKOCXmaNifC2h6XJS1pOgnpYcMVlVKFewibfqAq1hOz9DzTut9ab7Cw7jyzTpxwMtxth4smKdbwn8sr6zCk-3E_jLXRX-LFX0D8RCu17qDRyjGhXl_W3rj2HCf78dVlNN1PeiOXF3dL4dq-Thq9I_TBsw1f087on9g4Qh-CzdbfOr1P_goAAP__Y090GQ">