<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">