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

    <tr>
        <th>Summary</th>
        <td>
            Miscompilation: Equal pointers compare as inequal
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    Upstream issue: rust-lang/rust#107975 .

[Godbolt](https://godbolt.org/z/covcE7hEr).

```llvm
define void @_ZN7example3foo17h7be158369849a4c6E(ptr noalias nocapture noundef sret({ i64, i64, i8, [7 x i8] }) dereferenceable(24) %0) unnamed_addr #0 {
start:
  %1 = alloca i8, align 1
  %2 = alloca i8, align 1
 %v1 = alloca [16 x i8], align 1
  %v = alloca [16 x i8], align 1
  call void @llvm.lifetime.start.p0(i64 16, ptr %v)
  call void @llvm.lifetime.start.p0(i64 1, ptr %2)
  store i8 4, ptr %2, align 1
 call void asm sideeffect "", "r,~{memory}"(ptr %2)
  %_4 = load i8, ptr %2, align 1
  call void @llvm.lifetime.end.p0(i64 1, ptr %2)
  %3 = getelementptr inbounds [16 x i8], ptr %v, i64 0, i64 0
  call void @llvm.memset.p0.i64(ptr align 1 %3, i8 %_4, i64 16, i1 false)
  %_6 = getelementptr inbounds [16 x i8], ptr %v, i64 0, i64 0
  call void @llvm.lifetime.end.p0(i64 16, ptr %v)
  call void @llvm.lifetime.start.p0(i64 16, ptr %v1)
  call void @llvm.lifetime.start.p0(i64 1, ptr %1)
  store i8 4, ptr %1, align 1
 call void asm sideeffect "", "r,~{memory}"(ptr %1)
  %_9 = load i8, ptr %1, align 1
  call void @llvm.lifetime.end.p0(i64 1, ptr %1)
  %4 = getelementptr inbounds [16 x i8], ptr %v1, i64 0, i64 0
  call void @llvm.memset.p0.i64(ptr align 1 %4, i8 %_9, i64 16, i1 false)
  %_11 = getelementptr inbounds [16 x i8], ptr %v1, i64 0, i64 0
  call void @llvm.lifetime.end.p0(i64 16, ptr %v1)
  %_13 = ptrtoint ptr %_6 to i64
  %_15 = ptrtoint ptr %_11 to i64
  %_17 = icmp eq ptr %_6, %_11
  store i64 %_13, ptr %0, align 8
  %5 = getelementptr inbounds { i64, i64, i8, [7 x i8] }, ptr %0, i32 0, i32 1
  store i64 %_15, ptr %5, align 8
  %6 = getelementptr inbounds { i64, i64, i8, [7 x i8] }, ptr %0, i32 0, i32 2
  %7 = zext i1 %_17 to i8
  store i8 %7, ptr %6, align 8
  ret void
}

declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #1

declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #2

declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #2
```

This function creates two stack allocations with disjoint lifetimes and returns the pointers of those allocations cast to integers, as well as the result of comparing those pointers for equality. After optimization, the comparison is folded to false:

```llvm
define void @_ZN7example3foo17h7be158369849a4c6E(ptr noalias nocapture noundef writeonly sret({ i64, i64, i8, [7 x i8] }) dereferenceable(24) %0) unnamed_addr {
 %1 = alloca i8, align 1
  %2 = alloca i8, align 1
  %v1 = alloca [16 x i8], align 1
  %v = alloca [16 x i8], align 1
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %v)
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %2)
  store i8 4, ptr %2, align 1
  call void asm sideeffect "", "r,~{memory}"(ptr nonnull %2) #1
 call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %2)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %v)
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %v1)
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %1)
  store i8 4, ptr %1, align 1
  call void asm sideeffect "", "r,~{memory}"(ptr nonnull %1) #1
 call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %1)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %v1)
  %_13 = ptrtoint ptr %v to i64
  %_15 = ptrtoint ptr %v1 to i64
  store i64 %_13, ptr %0, align 8
  %3 = getelementptr inbounds { i64, i64, i8, [7 x i8] }, ptr %0, i64 0, i32 1
  store i64 %_15, ptr %3, align 8
  %4 = getelementptr inbounds { i64, i64, i8, [7 x i8] }, ptr %0, i64 0, i32 2
  store i8 0, ptr %4, align 8
  ret void
}

declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #0

declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #0

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nounwind }
```

However, the addresses of these pointers may be equal. This reproduces as an end-to-end miscompilation [in Rust](https://play.rust-lang.org/?version=stable&mode=release&edition=2021&gist=9078cfb7b98e213bb02373f54e8b19b2).
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMmM-P4jgWx_8ac7EKxc7vA4eqptjVSruH1cxlLiUneQF3O3badqDpw_ztIzsBAg1VFEWNRkIkgPN9z-99E38wM4YvJcAMxU8onk9YZ1dKz_7DvqliDkuQk0JV29nvrbEaWIO5MR2g8BHrztgHweQS0YU7RzQkQZqnMZ6iYI6Cx-E9fvqXqgolLIrniGYra1uDwkdEF4gulv1PU6WdzE9EF6Val8_p6lkjmh8LJUH_EmLd9F9VUHMJeK14hVEUvPzxvxR-sKYVENZKkXSVFkDiLEzyLMpZVCbPiGat1VgqJjgzWKqStbbTgKXqZAU1NhosohlKnzBPIkS_7A-Ze0fxU4p_uA_xHKN0jmiOK9BQgwZZAisEIJrRyH2PaBy4Yycla6B6YVWlMaJhgFH61E_AWKatK4b_hN0lBKNwjpkQqmRDUCb4UmIyGkTfGoRovD5SQvETSXaZnxddv2d8yYTYF951ZCp4DZY3MPWTmrYBohlPIkwSd7mruouBaH6DxEiBjhSMVRowz3B0POA020MkZhpseAVQ11BajCj1ry_uTCP65U-UPjXQKL31zaWDX07iIhq_RL5aQrFqaMDl8K_NFGT19jwRjUMfbgkWBDQgrRvFZeFca35t1qHa3r84OJxcTKmBxoAr-tQ73s97mIdPoL8J-rnv5PrecoJrJgycVCj59JQvVPEOhjuSIB82LXnLtORzTEtOWpJfMO2Z8DeZ9iRedJMDyB1dG41cm1_lWkI-P-lrfHvaOtI_AVqrreLS7sa9JNgqv0aNx8bnxxJybnDqB_OyaTF8P-j2BnMXnTg3iYaERukGBwNlI_H41VpevcYeh-EhxfuTS8nFo6vi88m9_ny6R3J0FK2v8k_4YZ3zhsK7bmS_PBjc6JFuciZ9DdZbakCjdD4mpQpKwTS8faMc8GejuQUlxfYw0920CeZNwxyfOaQJyZuRLj0QdzL9xPaxB116ve7RXXOd6o4dx0F-W3GD606WliuJSw3MgsF2o7CxrPw2kJD70eANtytccfPV30-7TAxmsnK96LQ02K4At-530AarGtuVMnCkUjJjfc-lhSVo4xtr8AaEcEcnoMF0wrrLS9W0THO5HIT20rXSGL53THC7neLH2oLGqrW84T99HKfqpAYBoyR2E1WigspF7596O-j8O-F677LPx-wdYd8Pqf-ZTC2VlJ0Qd2DrkdItjP1xXjlJYPSweT-LXJjM-5fij9f3rNQHkXIkdQta3rVX5I69urIsV_TqSnxaX09P61N4ej8Ovf4n7lbi2EPnlTgUnk_udVi_R3L0F58Go_HRXTDnNvgIPgU-jlSZtZoXnUOMfg8onPuqNp2xrVZLDaZfMoUoHH1IVWtwS6fZytKvoBsuK7zhQvTAgYfbkmZMLxto_J4csMovsj6DXbmOQ5N96L3oobDnOOnfagNr0DuscOsrGAMD48AYTRq2xQX0dDLFHrA0tFpVXelgyfESBlk9WPUAssINNw5SuPDc4szEJf5_Z85uFbaCbaf7TcdhxxCFizVo46gnnBvbg0HSqApQONcggLk_eAlU3PZjaEAJosmSG4vCeR6kWVkXaZFnQElYFAEN07COI8gKkhdu6ZhOqllY5WHOJjAjSZrQOKR5PlnN8jjKc5YFVUHSNAmLIEwyYHVNsyzI6qiY8BkNaBhQEgYkjuJ8WhMgaZSELA-TrEwBRQE0jIupt5jSy4nfXZ0lQZInE8EKEMbvy1IqYTNsvVKK4vlEz9w1D0W3NM6i3FhzULHcCpj996i6zh7Pri-HbvWACK4vXPqeTTotZic7tNyuumJaqgbRhafD_vDQavUVSovowudlEF34vP8KAAD__6d1gUg">