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

    <tr>
        <th>Summary</th>
        <td>
            Missed optimization: Redundant loop retained after memset idiom recognized
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          GINN-Imp
      </td>
    </tr>
</table>

<pre>
    LLVM correctly recognizes a memory-zeroing loop and replaces it with a llvm.memset intrinsic. However, it fails to remove the now-redundant loop structure which no longer performs any meaningful computation or side effect. This leads to unnecessary control flow and a redundant PHI/arith chain, preventing further simplification.

Godbolt: https://godbolt.org/z/fz5aKfW5M
alive2 proof: https://alive2.llvm.org/ce/z/ncvpr6

```llvm
%struct.MvcCubeStruct = type { ptr, i32, i32, [1 x i32] }

@p = external global i64

define ptr @Dec_ConvertSopToMvc(ptr writeonly captures(none) %0, i32 %1) local_unnamed_addr {
  %3 = icmp sgt i32 %1, -1
  br i1 %3, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %2
  %4 = getelementptr inbounds nuw i8, ptr %0, i64 16
  br label %5

5:                                                ; preds = %5, %.lr.ph
  %.01 = phi i32 [ %1, %.lr.ph ], [ %8, %5 ]
  %6 = zext nneg i32 %.01 to i64
  store i64 %6, ptr @p, align 8
  %7 = getelementptr [1 x i32], ptr %4, i64 0, i64 %6
  store i32 0, ptr %7, align 4
  %8 = add nsw i32 %.01, -1
  %.not = icmp eq i32 %.01, 0
  br i1 %.not, label %._crit_edge.loopexit, label %5

._crit_edge.loopexit: ; preds = %5
  br label %._crit_edge

._crit_edge: ; preds = %._crit_edge.loopexit, %2
  ret ptr null
}
```

opt -O3:
```llvm
define noalias noundef ptr @Dec_ConvertSopToMvc(ptr writeonly captures(none) %0, i32 %1) local_unnamed_addr #0 {
  %3 = icmp sgt i32 %1, -1
  br i1 %3, label %.lr.ph, label %._crit_edge

.lr.ph: ; preds = %2
  %4 = getelementptr inbounds nuw i8, ptr %0, i64 16
  %5 = add nuw i32 %1, 1
  %6 = zext i32 %5 to i64
  %7 = shl nuw nsw i64 %6, 2
 tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 4 dereferenceable(1) %4, i8 0, i64 %7, i1 false)
  br label %8

8: ; preds = %8, %.lr.ph
  %.01 = phi i32 [ %1, %.lr.ph ], [ %9, %8 ]
  %9 = add nsw i32 %.01, -1
  %.not = icmp eq i32 %.01, 0
  br i1 %.not, label %._crit_edge.loopexit, label %8

._crit_edge.loopexit:                             ; preds = %8
  %10 = zext nneg i32 %.01 to i64
  store i64 %10, ptr @p, align 8
  br label %._crit_edge

._crit_edge:                                      ; preds = %._crit_edge.loopexit, %2
  ret ptr null
}
```

expected:
```llvm
define ptr @tgt(ptr writeonly captures(none) %0, i32 %1) local_unnamed_addr {
  %3 = icmp sgt i32 %1, -1
 br i1 %3, label %.lr.ph, label %._crit_edge

.lr.ph: ; preds = %2
  %4 = getelementptr inbounds nuw i8, ptr %0, i64 16
  %5 = add nuw i32 %1, 1
  %6 = zext i32 %5 to i64
  %7 = shl nuw nsw i64 %6, 2
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 4 dereferenceable(1) %4, i8 0, i64 %7, i1 false)
  store i64 0, ptr @p, align 8
  br label %._crit_edge

._crit_edge: ; preds = %.lr.ph, %2
  ret ptr null
}
```

The reduced IR is derived from https://people.ece.ubc.ca/eddieh/abc_dox/d2/d2e/decFactor_8c.html#a1c91faf7938583e56797f9d044a6c437
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsV01v2zwS_jX0ZRBBoixbOvjgJHAbbNNdtMXuMaDIkcQFRWpJyk7y6xekZMf5aLFZ9H3bwxsEtkkO5_OZRxrmnGw14oYUl6S4XrDRd8ZuPtx8_nxx0w-L2oiHzadP_7wFbqxF7tUDWOSm1fIRHTDosTf24eIRrZG6BWXMAEwLsDgoxtGB9HCQvgMGSu37pMfeoQepvZXaSZ7AR3PAPVpCr4Jsw6Ry4A1Y7M0ewXcI2hwuLIpRC6b9ZMJ5O3I_WoRDJ3kH2oAyukULA9rG2N4B0w_QI9NSt82ogJt-GD3z0mgwFpwUCNg0yH0C3zrpQCET0fKoNXJ0jtkH4EZ7axQ0yhxiXAyePPnHxxtCd8yG8HjHpA4xDBb3qH1IRjNa32Gw1Q9KNpJH6wlJtyTdfjCiNsqTfAud94Mj-ZbQHaG7djpIjG0J3T0SumseC_a35l_FLUm3TMk9UhisMc3ru9NpEjM93ec4K9F8P9jVZJus0uk_CIY1LaaEJrd7fjXW-DWugOTX4B8GBLK-hMFPNcrp2RcpLjO4j6viGsj6ejawTId4G-89Ws0UtMrUTIFcLScJgY3UGJQCWabXyO-ujN6j9V_N8M3c7jmhZTg8WOnRaPUAnA2h4I7QUhuNhFZAaJHOzoTfWdhThjN1N2rNehR3TAgbvCfpFoJIHr2SvB_Atf7s4hVcZFGotiCzKBo2FatRhVWibDJ0z7fuuJX-DkWLU0yzTL6F__2P5JcBMsJFxwgt6NHVZdxp0aPCHrUP2ZC6NqMWDvR4AFlGvIUMHvOwWkK2OoZxcrSY3Cve59nb7hWx6qd8zL4maRYFhk5OOS0uT3k9CQMprmfMhM1yPizi_qxoFdU84r0HrbE9Fijo92ZGD4DzxmKMNlw5ZWGZDuE3U7LVUB5Vrt_I4zPYnmVxecziKZ3RwJnNnE5n84X1k8Hl0WAZDTIhQLvDWQRnIAsb2vgnMOJ_Xgimz8EYpL8HviQwIt7L5wJz0d-Uy7dvFfYlbF7j-2zjLRXf8-mEaos-Jk6PSgWVE10cyWgyYgYPF3_PA6W9JqqZNbRhSjIHOjQDNn8Si9A8_QVU8kcRxNR5R6COh2cBZG_043xenDfiqb1cp6KSiPizvozOeiYVcKYU7I0UoVJnrwLJkCZB3VSoY0W10QEkx9YCgRYbtKg5slohoWU2l25q2fJZx8aulBk0TLlQ4lfQLqcsl28muPxpFFfNh-U5xVW_BT2UP6aHdz0TTlSbpe-n7yz9EX-_h4_-vwfaTyEtvB-QexQ_ZK05Rt_6X_Ru8xcfTXz0mxDSUxv8tBZ4je5Tbd-F528dxjmHo4CbLyBdiFfuUUBjTf9i6BjQDAoT5JiMNU84I3SHQkjswkRS8zth7gndCRo_wjwikO8Y98belTzpfK8IzVnGq6xhzbrKy6LMsVitq3VTiXS5ZCu-zNcLsclFlVdsgZtsvVynRVrl60W3KSvEHPNyJZasqmosVjyrsGiaZV3kvBELuaEpLdIio1lWFPk6KdKcrliVrWouBBM5WabYM6lOg9NCOjfiJsurIi8XMf0ujsiUajxAPCU0vDwu7CZcuqjH1gUcSefdkxovvcLNrXQOBZjBy14-xiEwFOvL85HWomdSowDWeLRwHJSFNP3TyC0Wo1WbFwOj9N1YJ9z0hO4i5UxfF4M1_0buCd1Fhx2huzmi_Yb-NwAA__9fnZk8">