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

    <tr>
        <th>Summary</th>
        <td>
            [GVNHoist] Information about data dependency between provenance intrinsic and load is lost
        </td>
    </tr>

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

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

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

<pre>
    From: @totikom (Eugene Lomov)

Hi! I'm working on vectorization in downstream target and I've tried to put GVNHoist pass befor vectorization, as it is good for simplifying induction variables.

However, I've spotted a problem and I couldn't understand, if it is my mistake or GVNHoist bug.

```llvm
define dso_local i32 @foo(i1 %cond, i32* %C000051C2) local_unnamed_addr #0 {
entry:
  br i1 %cond, label %cond.false, label %cond.true

cond.true: ; preds = %entry
  %0 = tail call %struct.C00000EB9* @llvm.provenance.noalias.p0.p0.p0.p0.i64(ptr %C000051C2, ptr undef, ptr null, ptr undef, i64 0, metadata !1)
  %bf.load4 = load i32, ptr %C000051C2, ptr_provenance %0, align 4
  ret i32 %bf.load4

cond.false: ; preds = %entry
  %1 = tail call %struct.C00000EB9* @llvm.provenance.noalias.p0.p0.p0.p0.i64(ptr %C000051C2, ptr undef, ptr null, ptr undef, i64 0, metadata !1)
  %bf.load7 = load i32, ptr %C000051C2, ptr_provenance %1, align 4
  %add = add i32 %bf.load7, 742
  ret i32 %add
}
```

In this code load and provenance intrinsics are supposed to be hoisted to entry bb and they are, however information about data dependency between provenance intrinsic and load is lost, so after GVNHoist I have:

```llvm
define dso_local i32 @foo(i1 %cond, i32* %C000051C2) local_unnamed_addr #0 section ".ddr_text.level4.cwna.text" {
entry:
 %bf.load4 = load i32, ptr %C000051C2, ptr_provenance %0, align 4
  %0 = tail call %struct.C00000EB9* @llvm.provenance.noalias.p0.p0.p0.p0.i64(ptr %C000051C2, ptr undef, ptr null, ptr undef, i64 0, metadata !1)
  br i1 %cond, label %cond.false, label %cond.true

cond.true: ; preds = %entry
  ret i32 %bf.load4

cond.false: ; preds = %entry
  %add = add i32 %bf.load4, 742
  ret i32 %add
}
```

The reason for this behavior is that if GVNHoist::hoist see that not all operands are available, it will try to move only GEPs.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzUVkFv4zYT_TX0ZbCCREmWffDBSda7AT586KHoNaDEscUuxRHIkVz31xeknDrJpihabBdYQICkEfnm8XHmiSoEc3KIO1HfifphpSbuye9645U2fFGrlvRld_A0iHIPosqZ2HyhAYTcfJxO6BD-RwPNQm5Fvhf5_rMRsoBHIZsBzuS_GHcCcjBjx-TN74oNOTAONJ1dYI9qAFb-hAzK6TRvRmBvUAMTjBPDp1_-_5lMYBhVCNDikfxrOCHvQQUwDCbAiUhDHBLMMFpzvEQCxumpS5ln5Y1qLYbsSpfOOKOPENfcYSRm1KBg9NRaHBZi0NFktROyYZicRh9YOR3nmeM19XCBwQRWXxDI32i30-maTKzz5bJ2HkS-13g0DkEHerLUKQumlFHjI5GQG1OAkHVH1yylFHIfI_d5nud1cS-F3EKa9zQ5pwbUT0prD0KWOYjmTuR7dOwvooy5AVoPryGtatE-B7KjsgG_DrOfcGF_e42VUN7B6FEHEOVDHLykinmErPMUZWUsdMomsMB-6jhL5POPd9u0mCopkY2eZnTKdZg5UtaokI357TLrSsjNyP7N6u8hxuJmHJ9f3GTtVx_MuoI8PgzISitWIGRRLBWb6LbHzJLSVWIdnxa1F5h3cj7dCKfVpgK05uSgSpAeednKG_QLCReh_1bD4ofUsPmXGhZvNRSyVlontHh_LWcTRzeVfKu20joK3Ty8bLZF-kcH3JsAHWlc-MW2fkHCOPbGBdMFUB4hTONIYXGhFqGPrby8pV2Ctk0A3OMljo-E-sVLwLgj-WFxOtXSxJAE0zii0-i6C7TIZ0T3bvoEuwgYwFLgCB0I1JHxhas8Qq9mXHr7-1pLwMVKhZSZ1v6J8TfOLM5oq6w7O5XFgJDyHQ_6D3rtB3Ob72XC38SC_roBq3_egD_3CB5VIJd-z6kZW-zVbMjHUudecfyXPld4LJlyn_oOAuLy3RFD3GIa0Sunl1ZVszI2_tST_AxnYy3EHmWCgWYEcvYCnz7-FLKV3pV6W27VCndFU24323XTNKt-J4t8XdWV6rYlYlVXhca6rI_VtsJi0-ZyZXYyl3Uui02xLrdlk7UbXZRS1dt1V-sGtahyHJSxWSoy8qeVCWHCXSGb9bpapQ0N6ZglpcMzpK9Cynjq8rs46UM7nUKsUhM43GDYsE3nsz-VqR_g8dt6zGrydtczjyHKLg9CHk6G-6nNOhqEPCRXWW4fRk-_YsdCHtISgpCH6xrnnfwjAAD__-gyLaU">