<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/79137>79137</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [LoopVectorize] Miscompile with iteration-local scoped alias metadata
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            miscompilation,
            vectorization
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          nikic
      </td>
    </tr>
</table>

<pre>
    C reproducer: https://clang.godbolt.org/z/f6rE4jvhM

IR reproducer: https://llvm.godbolt.org/z/7anbPon8K

```llvm
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

define hidden void @test(ptr %arg, i64 %num) {
entry:
  %icmp = icmp ult i64 %num, 2
  br i1 %icmp, label %exit, label %preheader

preheader:
  %arg.1 = getelementptr inbounds i8, ptr %arg, i64 1
  %end = add i64 %num, -2
 br label %loop

loop:
  %prev.ptr = phi ptr [ %cur.ptr, %loop ], [ %arg, %preheader ]
  %iv = phi i64 [ %iv.next, %loop ], [ 0, %preheader ]
  %cur.ptr = getelementptr inbounds i8, ptr %arg.1, i64 %iv
  call void @llvm.experimental.noalias.scope.decl(metadata !0)
  call void @llvm.experimental.noalias.scope.decl(metadata !3)
  %load.prev = load i8, ptr %prev.ptr, align 1, !alias.scope !0, !noalias !3
  %load.cur = load i8, ptr %cur.ptr, align 1, !alias.scope !3
  %add = add i8 %load.cur, %load.prev
  store i8 %add, ptr %cur.ptr, align 1, !alias.scope !3
 %iv.next = add nuw i64 %iv, 1
  %cmp = icmp eq i64 %iv, %end
  br i1 %cmp, label %exit, label %loop

exit:
  ret void
}

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite)
declare void @llvm.experimental.noalias.scope.decl(metadata) #0

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) }

!0 = !{!1}
!1 = distinct !{!1, !2}
!2 = distinct !{!2}
!3 = !{!4}
!4 = distinct !{!4, !5}
!5 = distinct !{!5}
```

The current and previous value are only noalias within the iteration (per the location of the `@llvm.experimental.noalias.scope.decl`), but the vectorization appears to assume that the underlying objects don't alias.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0Vl2vozYT_jXOjRUEBgK5yEXOyXukV-1KVVv1tjL2BLxrbOqP5GR_fWUDCZzt2e2nFBE8PPPMh2fGptaKVgEcUPmEytOGetdpc1Dik2CbRvPb4RkbGIzmnoFB-RF3zg0W5UdEXhB5YZKqNmk1b7R0iTYtIi-fEXk578z_io-X7gNKTyg9js____hVLikv_R9QVVQ1P2hVf7ekQrt0_AWlUeSoacFhTh2V9Ka9wyg_YUQIbHuUH2E7kCpF-TEn8RGW2XoZ3nZFfGzF_SUjNcqPGam35zqd3lQU7Wb1XbH9KcAIWbnijBgkzG681rtfd8XWq09KX9VWCuVft63yd63xyeEsFOBOcA4KX7TgGBWpA-sQqQdnMCIlDcl5xmJXhJXyPSJ7jKqnkQGUM7eQ1bjCASJYP0Q_4ouXbqX7jMmMbQwW2awRvkjagAwCeBVuJRgMdEA5mKX3D-HKPjVtkkUHWnAgoQflQixCNdorbrGoA_eX4WULElA8UlDO37i_nf1vzMM_qfWwdC2uV14NBi5JtJmf8NCJ0X75FL4xb8KnwD5xYVSe4nIETE4uExERi6Rf7sTR3VFPXBIFr-4d4vQbnJNbfyWVSbaoFXGZyRiV8l5esfXgdQAjAh-VidJUCmoTy_QACQcmEal7cDT0F0YkSxHZ_1tc-YIrJoXyJGxODDOs1kHN-xZEVIpW4WxMW7awM_kYxZMDo6k3dpg375hZlMBXrSwpQ23ea7ReGrlv-BTbrGSdNjBhKef_wP6juO4uKH9d7Dx5XvXTaibAb2vg2G9fjIVvToW3XRcBj64z4GKhTJDqtBrq-RN-8Yo5oRU-OmfC2YCVDuXVUPYJK302AFhpe1MMK-3VVSiOr0JKA84bhXvotbkhUgtFGQNrRRNaJBwA2ADlVyMc3KstlCI18HdLN05dkqfLGKhzRjTegY2fxuFfPf03UeC3CSTZZJFk4TggWfZAkGycwFxYJxRzS9BYV2QJJu-AV6B8ba1YfiveISgma-USXL4DXoDmE38Z8M8dYOaNAeUwVRyHxhLaW3yh0gMOe6uVvOF5AFyF64TCrgMsHBgaKy2cq2CiUGo2yvQ5roO5P1kWuzgQyTNuvIu6F2BOG_F5JKTDANRY7DSm1voesOvoCPSKg5E3oVqsm4_AnMVcK0Qqh0crG37I-T7f0w0csirdpVmV1uWmO1RFfuY1lCkrWZ3vi6Y65-m5rmtI9zWk2UYcSEqKNCN5lud1WiZ5WZ4Zzc67c5qx6sxRkUJPhUxijNq0G2Gth0O1z_JqE7vaxrshIb2wTPeDkDGgcGshz4iQVZhBWp425hDoto1vbUifsM4-DDjhZLxvfq_18MukDag84Q-zBYgb9diibdgXiWO2-ZgUPDfhxht5WF8kW-E63yRM99OtcvrbDkaH_CLyEqO04XYZAv09AAD__z3zRzU">