<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/112577>112577</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[SLP] SLP Vectorizer miscompile from reducing abs bitwidth
</td>
</tr>
<tr>
<th>Labels</th>
<td>
miscompilation,
llvm:SLPVectorizer
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
alexey-bataev
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
danilaml
</td>
</tr>
</table>
<pre>
Bisected miscompile to this change https://github.com/llvm/llvm-project/commit/4a1c53f9fabbc18d436dcd4d5b572b82656fbbf9
Reduced internal test to this example:
https://godbolt.org/z/njWYP9exd
```llvm
define dso_local noundef i32 @test(i32 %n) local_unnamed_addr #0 {
entry:
%n1 = add i32 %n, 1
%zn1 = zext nneg i32 %n1 to i64
%m1 = mul nuw nsw i64 %zn1, 273837369
%a1 = call noundef i64 @llvm.abs.i64(i64 %m1, i1 true)
%t1 = trunc i64 %a1 to i32
%n2 = add i32 %n, 2
%zn2 = zext nneg i32 %n2 to i64
%m2 = mul nuw nsw i64 %zn2, 273837369
%a2 = call noundef i64 @llvm.abs.i64(i64 %m2, i1 true)
%t2 = trunc i64 %a2 to i32
%res1 = add i32 %t1, %t2
ret i32 %res1
}
```
Running slp vectorizer on it gives
```llvm
define dso_local noundef i32 @test(i32 %n) local_unnamed_addr {
%0 = insertelement <2 x i32> poison, i32 %n, i32 0
%1 = shufflevector <2 x i32> %0, <2 x i32> poison, <2 x i32> zeroinitializer
%2 = add <2 x i32> %1, <i32 1, i32 2>
%3 = mul <2 x i32> %2, <i32 273837369, i32 273837369>
%4 = call <2 x i32> @llvm.abs.v2i32(<2 x i32> %3, i1 false)
%5 = extractelement <2 x i32> %4, i32 0
%6 = extractelement <2 x i32> %4, i32 1
%res1 = add i32 %5, %6
ret i32 %res1
}
```
which is incorrect. Counterexample by alive2:
https://alive2.llvm.org/ce/z/cEcY-u
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0Vk1v8yoT_TVkgxrZQ_yRhRf9eLLqonorvVfPqsIwTniEIQKcpv31V2AncT-iq17pSlXjwMyZOcMhx9x7tTWIDSnuCADXeMS3m5YHjgcCQIqHBR_CzrpGcqM07_WitfKtuVMeRUBJe-WF7fdKIw2Whp3yVOy42SLdhbD3hN0S2BDYbFXYDe1S2J7ARuvD6eNm7-wfFIHARti-V_FhxXNRsG7d8bYVeS1XrJRCrmTRFhW0NZRF2bVttybZA8lux___QzkIlFSZgM5wTQP6cG4Jj7zfa4zdpOhPvVnZWh2W1m0JbN4JbMyfv34_rfEopxJlNv6lxtOSxE4ZpNLbF20F19TYwUjsqGJAySqL5QnU6RsUhsCapriXwRjeo3zhUjpKgGWUVHcjJprg3s490pSYU8IeKJeSXqDuaT4LeZ9i3vEYqDG4PUfmkb8qV7PgfoztB03N8EqNf40BE0xEhorVrGLlepbExyTB9YxmzFqlgSx565exDNQTVp-gVE6DG5DAHCuMWMENRpxK87FRBnPi8C1x-EAcrhCHb4jDdeJwlTj8lDhcJw7fEIcPxGfRDv2Xkw9pqgnqFOkwnHZjxgRTPXyS7XRFBmOU2VKv9_SAIlin3tFRa6gKdKsO6P9rtZ-EnihmiZ8yHl1AjT2aQAm7B3pME2G_6N4qb9OxzyUQn7MZzjgnvxu6TuPI6xNOLJZGdwX94_o7OquMCorrOJ9ZpYskv-DnE05sLj91GTdn6eyswC_pMEu_CPEEc174ALe6aPMT3kydB4iLUH-pyCahdlz7T0otEjAeg-PiysnE8t-dRfmz1PwfFF9Mgi__ld5fd0rsqPJUGWGdQxGW9N4O0SAmP6DtG-VaHRCuOMO4uUzjHN1B4GQR4pf4fTMsZMPkmq35Apu8gnW2LoFVi11TYll3HV93dVlxKSUvEGrRrSpRQ1ezaqEayGCVZ3mZlyxj1bLoWgZsXdesKyTnOVll2HOlz9UXyvsBmzyHoqoWmreo_eTbZxfmQUVNRz0RgHSB2e3z49P_z_d9cnXXJPdth62PelE--EuhoIJOrwTPj0-keKDPj0_0gjD3_M7ZnrrovfGXhbeetiq8Khl2i8Hp5sfvAImiJ7CZWB4a-DsAAP__NHxvJQ">