<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/86784>86784</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
WRONG code by SLP vectorizer
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
JonPsson1
</td>
</tr>
</table>
<pre>
This program should print '2':
```
cat wrong0.i
int printf(const char *, ...);
int Res = 0, A = 3050; // 3050 = 1011 1110 1010
int *Aptr = &A;
long Arr[8] = {614, 614, 614, 614, 614, 614, 614, 614}; // 614 = 10 0110 0110
unsigned char C = 0, C2 = 0;
unsigned char fun(unsigned ui1, unsigned ui2) { return (ui1 + ui2) & 0xff; }
void crc32_byte(char b) { Res = b; }
int main() {
for (short IV = 0; IV <= 7; IV += 1) {
*Aptr &= Arr[IV]; // 10 0110 0010
C ^= fun(C2 <= IV, Arr[IV]);
}
crc32_byte(A >> 8); // 0b10
printf("checksum = %X\n", Res);
}
```
A (Aptr) is AND:ed in each iteration with 614 in 32 bits, which gives 0b10 in the second byte. SLPVectorizer however performs the AND in only 1 byte and then extends that result to 32 bits, and as a consequence loses the second byte and prints '0':
```
; Before SLP
define dso_local noundef signext i32 @main() local_unnamed_addr #2 {
entry:
%0 = load ptr, ptr @Aptr, align 8, !tbaa !8
%1 = load i8, ptr @C2, align 2, !tbaa !10
%.promoted = load i32, ptr %0, align 4, !tbaa !4
%C.promoted = load i8, ptr @C, align 2, !tbaa !10
%2 = load i64, ptr @Arr, align 8, !tbaa !11
%3 = trunc i64 %2 to i32
%conv3 = and i32 %.promoted, %3
%cmp6 = icmp eq i8 %1, 0
%conv7 = zext i1 %cmp6 to i32
%add.i = add i32 %conv7, %3
%conv.i23 = trunc i32 %add.i to i8
%xor22 = xor i8 %C.promoted, %conv.i23
...
; *** IR Dump After SLPVectorizerPass on main ***
define dso_local noundef signext i32 @main() local_unnamed_addr #2 {
entry:
%0 = load ptr, ptr @Aptr, align 8, !tbaa !8
%1 = load i8, ptr @C2, align 2, !tbaa !10
%.promoted = load i32, ptr %0, align 4, !tbaa !4
%C.promoted = load i8, ptr @C, align 2, !tbaa !10
%2 = load <8 x i64>, ptr @Arr, align 8, !tbaa !11
%3 = trunc <8 x i64> %2 to <8 x i8>
%4 = extractelement <8 x i8> %3, i32 0
%5 = sext i8 %4 to i32
%conv3 = and i32 %.promoted, %5
...
```
```
clang -O0 -target s390x-linux-gnu -march=z16 wrong0.i -o a.out; ./a.out
checksum = 2
clang -O3 -target s390x-linux-gnu -march=z16 wrong0.i -o a.out; ./a.out
checksum = 0
clang -O3 -target s390x-linux-gnu -march=z16 wrong0.i -o a.out -mllvm -slp-vectorize-hor=false; ./a.out
checksum = 2
```
@alexey-bataev @patrick-rivos @nikic
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsV11v47YS_TX0y8AGOZIs-8EP_kgucnGxu8gt0r4FlERZ7Eqkl6QcZ399QUqWJXex2KIt0IcGhi1KZ87MnJmhGG6tPCohNiTZkeQw462rtNn8V6tP1mrFZpku3jc_VdLCyeij4Q3YSrd1AScjlQOCKRJMSbQl9EDo9XtJ-09Y5tzBm9HqSBdyDPMEgaYkuMq1sg7yihsguCW4h8ViQXBNot29zbOwQKIDUI_ahsuIJpREOwCCjwQfwzo8YJQxYIxRf0XhRkJwuz05E0AEl9vBT63VEbbGkGS3IsmhA6S7JYu9uz_2kx58UH1MSxb3IQFl16_xX-e_VaEkRafF_pbpHvvrqSJTfNkqgqvhXiuZNx2tkeDa5wNGuNYo8GjJgOBueIhLoJeyDKGnh7Gvs5YF5CaP8DV7d8KXzTvNrpzXymTfsPWiN1z68Hp4dx-g1L7mK1tp4-DpZciyu977ZXpd4i5IeMcAt3Li0gO6-j29kOQwbotBejqSvifZA0kevG0nYVA7-H56CX02Yhx1JdzShKkyvjEfSPQAqw4_BEGz4Lw3GgaAIOaVyD_btumbMvmFJHtFEL3_Z2En0zCIO521rVfSK-EVkha2Hw4k2ooCpALB8wqkE4Y7qRW8SVeFppQKIoRMOusdvVUyr-Aoz8J2oUoFrhJgRa5VAT67Bfz_f59eRO60kV-FgUq_ibMwcBKm1KaxAb_9cPCmWtXvwIIZcFX4RwrExQlVeBx3YIRtawdOj6PwUG6Bg98XxJdWqFxAra2w98EEaFDR-u2ITrajqTj9d7SDnSi1ET6Nvg6FKKUSUFj9Wuuc16B0qwpRQhiciwMZIZCYjjo44F5bpXgjildeFL77POral0I58z7E4uvfb0q15gWEGu0hNG1Mt_2S1_KofMvsgSBzGef-dzWiYDcKuRox7PFmj3f2jI4IFiejG-1EMSKKcGDChN6I4juieMSz_xbRJKIfDAhH9st4LIr5jiaMjSiiQOFMq3LP0bE6HRLrUASTXKtzB_QtEwo6UqOjT6IRa96clgEv8-YE4gvIVaiAh44T8MRpAH4NrcIG40kI_i4vioXsYiiGGIL9t_xrdV5InCTXWXQ0nn3cGhdtsBPzok0f7P4-wStpZ-dfsnezEV6__gNPz3BomxNsSyfMdOY_cWtBq7Cjjyz-HaZ_0DCRaL-CS5ip6OFPj9WEbRiw692Vd3Ez7E464uIMz52oRSP8kWuE7Vod96EVxvEnwdKGLll1VL8boh8a5KQ3uO_w77wY7o6tNVdHmH-kMHfcHIUDG63pZV5L1V7mR9XCvOEmr0h0-MqWwwkX5hr4QrfOz9KC4GNY9JMxecPj2PnVW_R3eaN_pTeYN3V9bmBu69P8fN0V5pU2JDqUvLZiEs93kr8rREx5LS7ifZ5xx8XZt-uJOyPzz3Mjz9r6G0p-ljnMik1UrKM1n4kNSxlLIhYl61m1wRJLimmWL1Nk8ZLmmFEWr5fROuU0zouZ3CDFmEaY0jVitF6wJcesWCNjZSLiIiUxFQ2X9cLnuNDmOJPWtmKzWqareFbzTNQ2_MeEqMQbhIf-mJYcZmbjbeZZe7QkprW0zt5YnHS12Pz8_PHDfyDXhYDsPRxBBgHNrDX1pnLuZP1WF86LR-mqNlvkuiH46Kn6n_nJ6F9F7gg-hgAswccQ4G8BAAD__xqYxaw">