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

    <tr>
        <th>Summary</th>
        <td>
            GVN hoists loads over unknown intrinsics
        </td>
    </tr>

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

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

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

<pre>
    Originally reported here: https://discourse.llvm.org/t/bug-gvn-memdep-bug-in-the-presence-of-intrinsics/59402

> GVN, or probably memdep analysis, seem to think intrinsics are somewhat special
> and consequently assume they cannot "effectively clobber" a memory location. It
> might also be globals-mod-ref or something else that provides AA information.

> The following example ([https://godbolt.org/z/TG6dYvP6M 1](https://godbolt.org/z/TG6dYvP6M)) shows how an unknown function
> prevents an invalid load hoist while an unknown intrinsic does not. Again, the preload
> is not sound in a multi-thread environment.

The simple reproducer can be found here: https://godbolt.org/z/cKMEezbjY
Compiled with `-globals-aa -gvn` the below code will hoist the load above the barrier but not the unknown function.

```
@G = internal global i32 undef

define void @test_barrier(i1 %c) {
  br i1 %c, label %init, label %check
init:
  store i32 0, ptr @G
  br label %check
check:
  call void @llvm.amdgcn.s.barrier()
  %v = load i32, ptr @G
  %cmp = icmp eq i32 %v, 0
  call void @llvm.assume(i1 %cmp)
  ret void
}

define void @test_unknown(i1 %c) {
  br i1 %c, label %init, label %check
init:
  store i32 0, ptr @G
  br label %check
check:
  call void @unknown()
  %v = load i32, ptr @G
  %cmp = icmp eq i32 %v, 0
  call void @llvm.assume(i1 %cmp)
  ret void
}

declare void @unknown()
declare void @llvm.amdgcn.s.barrier()
declare void @llvm.assume(i1 noundef)
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzVVktv2zgQ_jXyZWBDlh-xDzq4STcoiu7uoVigp4KPkcSEIlWSkjf99TukFMtJg3avBSSbr_nmm2-GpLiVT-VfTtXKMK2fwGFnXUAJDTrMNidoQug8NbLiD3qk8sL2zuNK66FdWVfTYKCX9_WyHsyyxVZit4xdZZahwWXn0KMRuLQVDQWnjFfCk8nuuM2LLL_L8tP0u3kP9__8mRW3YB10znLGidIICYwIPnnl47RHbCFYCI0yjzCjAnMI3rZ4blgA36FQTM_gzEgQ1nj81qMJBM2871skGHwCwYyxAbKiwKpCEdSAtEJoyzk6GgUWmVj3BNoKFpQ1K_gQZvBW1U0Apr0FjlCTHbWXrZVLh1UMKPKKhGtA7aNTokhBDkqih9OJwqisa0fkGXZufW4QKqu1PSeMf1nbaSS-h2z37mWWaiu51WFKz3d6P9_v5Zfh7_0nWGe7O7L53wZZcaQHfGPPHuiHRITePBp7NlD1RkS6M0dK9kDS-rhKmYFpJUkuRuVklQ9wbhRRvkK4pA6kJRUoASs41UyZmGVKSwSM9rMHlVaRmD0lU5mYlV4HRaXmkPygGZSzpiUSq-vaiuJ5lRSjEndW9gJdzHlMVpXA3q74H6URHz-9x-_84cuIfGvbjqKScFahgWyfL59zzxjEPUFDKRROkZyp_iTSUq0nSeJMUohxO-C4kDmniB3vQ4o1jr2W_EVw5GF6xu42v4dscxfVRUfbZqpGUJuCgCRW18bUVQZhsJQqsgzow9eJAdWJWlOF7UQsgezm3WgBwB1cJm5BMwot9pRR4cWAaFA8jkZpbnN6RvDB0laNhPJo0QUXnd9fOXgLZGzOKILOrAvzdCKxVtbCrPxqDiFW8LSe0IakTFKcvL_lO7psu1HA2MBviWe0jcvznzhPx8msWttd-XYY0upJ-5u7XyVhSvnvlYSZ9O8hu9DxyvgJ-9dLflllbxtcUTR23IPPBpfdu5DlRh43R7YIKmgs6S4cDwmfhPNAB4T78ej0i97p8tWpRWdRz1fCttSJDKY_uo3tA11u1FVECdM9vD3s1oumxCPbbqvj9mbP98j4gW8xLyrB893xiIf9cZGKwZd03dB1aPAMCYLadKUsVFnkRZFv1-v1YV1s96sbEmJXVXxdbWQhDkhSYMuUvnw5LFyZKNG3go86xUDnSVJM1QYxuSN81ofGuvKB7glXoQuL5LxM5P8DPeS65A">