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

    <tr>
        <th>Summary</th>
        <td>
            [NewGVN][InstCombine] missed load elimination
        </td>
    </tr>

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

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

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

<pre>
    Consider the following code

```llvm
%v8_uniform_FVector4 = type { [4 x double] }

define void @foo(ptr %ret_mem, <4 x double> %a, <4 x double> %b) {
  %ptr = alloca %v8_uniform_FVector4, align 8
  store <4 x double> %a, ptr %ptr, align 8
  %e0 = load double, ptr %ptr, align 8
  %of1 = getelementptr inbounds %v8_uniform_FVector4, ptr %ptr, i64 0, i32 0, i64 1
  %e1 = load double, ptr %of1, align 8
  %o2 = getelementptr inbounds %v8_uniform_FVector4, ptr %ptr, i64 0, i32 0, i64 2
  %e2 = load double, ptr %o2, align 8
  %o3 = getelementptr inbounds %v8_uniform_FVector4, ptr %ptr, i64 0, i32 0, i64 3
  %e3 = load double, ptr %o3, align 8
  %vec0 = insertelement <4 x double> poison, double %e1, i64 0
  %vec1 = insertelement <4 x double> %vec0, double %e2, i64 1
  %vec2 = insertelement <4 x double> %vec1, double %e0, i64 2
  %vec3 = insertelement <4 x double> %vec2, double %e3, i64 3
  store <4 x double> %vec3, ptr %ret_mem, align 8
  ret void
}
```

NewGVN and InstCombine miss to optimize loads, whereas GVN and InstCombine managed to do that as follows

```llvm
define void @foo(ptr %ret_mem, <4 x double> %a, <4 x double> %b) {
  %vec3 = shufflevector <4 x double> %a, <4 x double> poison, <4 x i32> <i32 1, i32 2, i32 0, i32 3>
  store <4 x double> %vec3, ptr %ret_mem, align 8
  ret void
}
```

Compiler explorer link: https://godbolt.org/z/sbKv81a6s
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEVtGOmzgU_RrzYnWEryEJDzzMJM1qtVIf-zoy-BK8NTayDdP261cG0mHSZDb70K0UJchX59wj7rnHEd6rk0EsSf5E8kMihtBaV5rBdcOXVnQY7JhUVn4r99Z4JdHR0CJtrNb2RZkTra1Ekh5I-rh8b9L5o_XYLUeQj7vnwajGuu75-BnrYF1GCT_Q8K1HSrZPlORPGf1KpR0qjSQ_ULI9rGklNsogHa2SlGRpYy2BXR8cJZA7DM8ddgT2lPD9ioZ_jGVxq1ARKGLzuQONRxMjP1Chta0Fva488gmtTobuzlAfrMPb3RehfXBXsARyTKeu2gp5Rt-Bsg2bYCcMqLFDEyJCmcoORvp3xL8lVpuMptMDh-Vhk1G2lsfekWcbdkMe_Dp1sFYH76mDG-L4rxPH1-L4e-L4dXEj1rMhlPHozgp_tldvlbcmcsxn86xehb1hZPcwLs0vKOGaKUas4X5KdkF5dZIj1vx-Srig5D-9_9tbGTutBrFKkItpOAxT6CxZ9COUzim3zqhP-PLH509UGEn_ND7sbVfFzOqU9zRYavugOvUdJzP42OulRYfC06soYcQJZQRKS0MrAhV-yV3_L4H7P4Xlj3H5dmgajeO0Jv-B9tW_S0lxmAB8HxeKnTcL3q4YB8oJ__ibpry3Xa80Oopfe20dOqqV-UL4I21D6D3hjwSOBI4nKyurw4N1JwLH7wSOvvpr3DGx8YksuSx4IRIs2RZ2BXAGRdKW2YbLNM2yqpCsyXm22-TVTmCTZzXPZL5LVAkpZCxlGdtADsVDmiOTxVZum4KzbMNJlmInlH6Iboi9E-X9gCVjABwSLSrUfrrsAQy-0KlKAOLd78oI-lANJ0-yVCsf_CtNUEFP_xJml5P8QPKnlWHjnR2djnIOO9SqU0YEZU0yOF1evBwV2qF6qG1H4DgZd_750Dv7N9aBwHFS5gkcF-ljCf8EAAD___sbiHo">