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