<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/59339>59339</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
LoopFlatten miscompile
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
jreiffers
</td>
</tr>
</table>
<pre>
Input:
```
; RUN: opt < %s -S -opaque-pointers -loop-flatten -verify-loop-info -verify-dom-info -verify-scev -verify
define void @test0(i16* %0, i16* %1) {
2:
br label %.preheader
.preheader:
%3 = phi i64 [ 0, %2 ], [ %7, %6 ]
%4 = mul i64 %3, 3
%5 = getelementptr i16, ptr %1, i64 %4
br label %9
6:
%7 = add i64 %3, 1
%8 = icmp slt i64 %7, 2
br i1 %8, label %.preheader, label %16
9:
%10 = phi i64 [ 0, %.preheader ], [ %14, %9 ]
%11 = load i16, ptr %5, align 2
%12 = add i64 %10, %4
%13 = getelementptr i16, ptr %0, i64 %12
store i16 %11, ptr %13, align 2
%14 = add nuw nsw i64 %10, 1
%15 = icmp ult i64 %14, 3
br i1 %15, label %9, label %6
16:
ret void
}
```
Note that `%3` goes from 0 to 1, so the loads for `%11` are `%1[0]`, `%1[0]`, `%1[0]`, `%1[3]`, `%1[3]`, `%1[3]`.
The output is:
```
define void @test0(ptr %0, ptr %1) {
%flatten.tripcount = mul i64 3, 2
br label %.preheader
.preheader: ; preds = %6, %2
%3 = phi i64 [ 0, %2 ], [ %7, %6 ]
%4 = mul i64 %3, 3
%5 = getelementptr i16, ptr %1, i64 %4
br label %9
6: ; preds = %9
%7 = add i64 %3, 1
%8 = icmp slt i64 %7, %flatten.tripcount
br i1 %8, label %.preheader, label %16
9: ; preds = %.preheader
%10 = phi i64 [ 0, %.preheader ]
%11 = load i16, ptr %5, align 2
%12 = add i64 %10, %4
%13 = getelementptr i16, ptr %0, i64 %3
store i16 %11, ptr %13, align 2
%14 = add nuw nsw i64 %10, 1
%15 = icmp ult i64 %14, 3
br label %6
16: ; preds = %6
ret void
}
```
Now, `%3` goes from 0 to 5, and the loads are from `%1[0]`, `%1[3]`, `%1[6]`, ...
The culprit seems to be https://github.com/llvm/llvm-project/commit/3ea6a9a469fde168c527b1c34c09f6d684ec86af.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVt1u4ygUfhpyg2IZMDi-8EXTKtJKq7nYnwcg5jhhZBsv4Fbz9itwEpM07baVdjRV5cDxx_n7Dp8sndOHAaBGfIv400pO_mhs_d2CbluwbrU36kf92zBOHrEHlD-h_PwU-el_3rIt_uPvb4g9YDN6jNgjRpQ7vP4Tr80o_5lgPRo9eLAOrztjxnXbSe9hwOtnsLr9MRv10JqLRZn-2uAaeD5v0lwUtHoA_Gy0wqjIPTifI7rRRCD6EPLIEX3Ey5YgWmFUbufT9FIZ3lvcyT10AZSNFo4gFdg0VGK9nApohhF7wuNRYy0KjPgWx5iIcooRf4prvg378mQX0b54KKKHfupmD5SzAGQJgkfEATx00MPgR2_noh5xWM6FPZ6PF-eTaVFVWou4LqGM7qVSVwmQBLGJCN30I3adP8NiQXTpoCYRG6z3mpmaiUjzqa7zIfmbPV3c3TSXFCdEddNdQqKzzkh10zMe1rLTh-FSRDxAb9tBztGLFMb-k5Q8IYVcQjhvLATknF1KInsjo-KS0TC94MG9XGeWMkX4QtW0UDW3hyWTMZNF-BUt1dXuiiOSDo0FHy_dCVA-3ZeG-PxmPGB_lB6HF2G4RI4PBhxurelxjr3BsQvOYH-EyJTDrbEnPCHhgLRw3iO-zQPHYqblC0b2WWOWFvTXEbCZ_Dh5rN374viGPqXzsVzgRJmC5SSTmbd6bMw0-CuZYOnd-6x84Y_9BWkfLSgXI8eBOCnbT9S__0n-XhdXfVgR3xfEe9S9undfFMkPEvc2g7fD8Um9_eVklf1iqvqOdt67Tl-S05dFou5p6dz_QSViGsQzAr6ii2IxZtkrIWymbrTaYwfQuxB-D_jo_RiFke4Q3R20P077rDE9oruuez7_rEdrvkPjEd01pu91WDCQQlayEFWrgIhNw2m5Jw0rmrxqhRKbApqNkG22UjVTFavkCmoiypwWlG3y1bHmksCmKduSSNVCSVpoJaiKNFS1ZUmala5pTimhOSeUUC4yxgVp9w0nVKhSlQIVOfRSd1lIMjP2sNLOTVDzirFqFQl28auZ0gFecHyJKA0f0baOhe2ng0NF3mnn3eLFa99B_bsx4-70Adxr15h-1B2sJtvVn25bDO0Q3cXU_g0AAP__HcoGlA">