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

    <tr>
        <th>Summary</th>
        <td>
            [GVN] Redundant `memmove` in zero-initialized array not simplified to zero
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            missed-optimization,
            llvm:GVN
      </td>
    </tr>

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

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

<pre>
    The following C function:
```cpp
#define SIZE 25

int test() {
 int x[SIZE] = {0};

    for (int i = 0; i < SIZE - 1; ++i)
 x[i] = x[i + 1];
    
    return x[0];
}
```
Is lowered to the following IR with `-O2` by latest clang:
```llvm
define i32 @test() {
entry:
  %x = alloca [25 x i32], align 16
  call void @llvm.memset.p0.i64(ptr noundef nonnull align 16 dereferenceable(100) %x, i8 0, i64 100, i1 false)
  %x.4.sroa_idx9 = getelementptr inbounds i8, ptr %x, i64 4
  call void @llvm.memmove.p0.p0.i64(ptr noundef nonnull align 16 dereferenceable(96) %x, ptr noundef nonnull align 4 dereferenceable(96) %x.4.sroa_idx9, i64 96, i1 false)
  %x.0.x.0. = load i32, ptr %x, align 16
  ret i32 %x.0.x.0.
}
```
Failure at reasoning on the memmove, which here happens not to change the content of the array, leads to a missed return zero simplification that GCC seems to catch via FRE.

Godbolt: https://godbolt.org/z/a4PejT3Mr.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVEtv4zgM_jXKhYghy486Bx-aZDLoYR_oDvawl4Vs0TYHshRIcl-_fiE5aTvdnR4WaGOLIvnx-0hTek-jQWxZtWfVcSOXMFnXShOsITs4GicMwW46q57bbxPCYLW2j2RGOMCwmD6QNay4ZfzI-C2r-frXn88XiygUDmQQ_rj76wuI6mJOv2QCBPSBiYaJHbCb_WqHePHEqn2MYdURWHGMt5zdHFmxf58CAGCwDphoYhAlV86KfXo9rKhbyKOFiT0Te2Jid4mNEHTNnw7RB3JWvcFEgLc3h2FxJvny916xsB8VWI93HrR9RIcKgoXwg3539_BIYQJW8-1vgtUcumfQMgoCvZZm_LesWj_Mq-kiKhUCWMn_S0Q0wT2_pgBgonpKRKXWtpfAqr2o4CmmiEzEAaSm0UBeXyN6qTU8WFIRIkJnM84eQ3bmGdUlE805ODB2MQoHMNaYRevXLKDQ4YAOTY-y08hEk3OeShTVU8SjBnh61iWkqwNQDoPUHt96lLyzMvPOyr9JPe0ShxEDapzRhFgCmS4W4YGamCSaXjHqEspPCc32ASOj_0tqV7_n9PPg8tPY9wyvdcfbn0vCs_if1NBWqtTHD-Q_NtRhWCfmLf7z8T1J0otDkAEcSm9NnFtr0iBfpIs4jxP1E0zoECZ5PqPxYGyIE99P0oyY_HtrApoAdkhH6Zx8jsEapfLRV8JM3qO6fmQv6Cx4ms-aBuplXDQQJhng6-EAHnFOUb0M_QQPJOF0_yV7vxq-WtVZHVhxC1MIZx-_BXFi4jSuF5l1IxOnFyZOsvwdv38rfnHZRrWF2hU7ucE2vxGi5k1R55upLcpGVV1Zd7ubZuBd0-2GOlel2vVNKbuy2FAruCh5w0Ve5juRZ0XZ3fCyLoumUEVXCFZynCXpLE2edeOGvF-wzXleN3yjZYfapz0sxKrE1p4DzfSSuDMR-8uESEuguP3656_RVB03ro2mbbeMPs41-eDfMAIFnbZ79K-OcI9qMUqaEPfOtYc1B1oF35KhQFLTC6q1R6mV1zaseyw6bhan2w-6UpiWLuvtzMQpVbk-tmdnv2MfmDglxp6J04X0Qyv-CQAA__-eoe5b">