<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/128349>128349</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[AArch64] Bad codegen for widen followed by vdupq_n_*
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:AArch64,
missed-optimization
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
nikic
</td>
</tr>
</table>
<pre>
From https://github.com/rust-lang/rust/issues/137407:
VectorCombine(+InstCombine) perform this transform (https://llvm.godbolt.org/z/veW5oG6Gx):
```llvm
define void @src(ptr %ptr, i16 %x) {
%ext = zext i16 %x to i32
%ins = insertelement <1 x i32> poison, i32 %ext, i64 0
%shuf = shufflevector <1 x i32> %ins, <1 x i32> poison, <4 x i32> zeroinitializer
%bc = bitcast <4 x i32> %shuf to <8 x i16>
%add = add <8 x i16> %bc, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
store <8 x i16> %add, ptr %ptr, align 16
ret void
}
define void @tgt(ptr %ptr, i16 %x) {
%1 = insertelement <2 x i16> <i16 poison, i16 0>, i16 %x, i64 0
%bc = shufflevector <2 x i16> %1, <2 x i16> poison, <8 x i32> <i32 0, i32 1, i32 0, i32 1, i32 0, i32 1, i32 0, i32 1>
%add = add <8 x i16> %bc, splat (i16 1)
store <8 x i16> %add, ptr %ptr, align 16
ret void
}
```
Resulting in this codegen (https://llvm.godbolt.org/z/Px83GGq7Y):
```
src: // @src
movi v0.8h, #1
and w8, w1, #0xffff
dup v1.4s, w8
add v0.8h, v1.8h, v0.8h
str q0, [x0]
ret
tgt: // @tgt
movi v0.2d, #0000000000000000
movi v1.8h, #1
mov v0.h[0], w1
mov v0.h[2], w1
mov v0.h[4], w1
mov v0.h[6], w1
add v0.8h, v0.8h, v1.8h
str q0, [x0]
ret
```
The dup has been replaced by element-wise movs.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJysVs1u4zYQfhr6QsSgRr8-6CA766C3oiha9LSgxLHFrkRqSVr25ukLUlJiO-kiKSoI4JDzP99wJG6tPCrEkqRbkj6u-Mm12pRKfpPNqtbiR7k3uqetc4MlcUVgT2B_lK491etG9wT25mTdQ8fVcaYJ7KW1J7QE9lGcJyz3esy_f2DjtNnpvpYKCRQEtr8o614ONnRAc9Cmp66VljrDlQ1bAsVtBF039uujFrXu3Fob7_uZwH7EP1P9lD1dCGxmrxmbXq9BWCXwIBXSUUtBScKsaQgUgzOUQDo4Q2BHZZT5nbdBSb4lrKJ-jxdHSfxInz2xyFCnqYxhkZHKBhmpLBqHHfaovNYuopcgF3-hg5ZWq-Aohtlw2GUJZYsh254OwZInDh2OoXJ3liaHXvffPJB4l7yeP6PRUkkneSef0Sy-6iZ4qqVruHV3OkssTntG4RlRRuIvizIXImhP65XAZHkOwpcrWmr7X4nZqXXa4FtfXAgvegsl7-RR0SgLigZdwN13Rf44deRdO7ij-2g7RO8DDVdBTXlf4R1llPk0bqzeIT-j8QZ3uMk2mgt7dXqDenGFYLzzjcaWjosW4pMnn8LcDh13_trOGG7-b-iWa01Y9RvaU-ekOlKppsHRaIFHVB8eG79eivjp6Xv-19uxQVjlZ0Rc0cnCMjR8VNPT61H6dWTrog3lhzi64nMlwnouPPMczSLscjgcDl5OnIYgMEbrJNzmc3GtLib1F_NjtBDh5FXSOkO_B8BIur0wkj5eMQ06wirf3_HL2c-e12y9Dquu0wSx5HD3vFeV6P2q9Hr0plqSbkOkU2lu-bM7LwMfkEluZO6Y2XsG3tb2tsifqu11y_zeYoC15ZbWiIoaHDreoKD1DzpPi4eztOjDtOuVKGOxiTd8hWWUJwyijKWwakueHDZpWgsBPMVNwUWe1hEylkd5nogCV7IEBikDALYBlsK65glwzDNRNDngBknCsOeyW4fW1-a4Ch_nMoIiTjarjtfY2fDxB6h58w2VIHFVVaZps4QAENgRgF5ai-JBD0728pk76QeNx2RlSm_4oT4dLUlYJ62zr66cdF34s1jspY90y8XL_TxoQ89SBKrr9HmqzyhOw_ev6iuBanUyXfmTf4_wUZ-Wh8Hov7G5_f2YkhxL-CcAAP__U5BqdQ">