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

    <tr>
        <th>Summary</th>
        <td>
            Missed DCE when popcount of multiplication of two integers but arg1 is 1 in icelake-client
        </td>
    </tr>

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

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

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

<pre>
    [Godbolt](https://godbolt.org/z/nGesTMMK4)
Flags were -O3 -Wall -Wextra -march=icelake-client
```
#include <stdint.h>

int f0(uint64_t arg0, uint64_t arg1){
    uint64_t tmp0;
    int tmp1;
 if(arg1 % 2 == 0)
        __builtin_unreachable();
 if(!__builtin_mul_overflow(arg0, arg1, &tmp0))
 __builtin_unreachable();
    tmp1 = __builtin_popcountg(tmp0);
    return tmp1;
}

int f0_slow(uint64_t arg0, uint64_t arg1){
    uint64_t tmp0;
 int tmp1;
    if(arg1 % 2 == 0)
        __builtin_unreachable();
 if(!__builtin_mul_overflow(arg0, arg1, &tmp0))
 __builtin_unreachable();
    if(arg1 == 1)
        return __builtin_popcountg(arg0);
    tmp1 = __builtin_popcountg(tmp0);
    return tmp1;
}
```
```
define dso_local range(i32 0, 65) i32 @f0(i64 noundef %arg0, i64 noundef %arg1) local_unnamed_addr {
entry:
  %rem = and i64 %arg1, 1
  %cmp = icmp ne i64 %rem, 0
  tail call void @llvm.assume(i1 %cmp)
  %0 = tail call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %arg0, i64 %arg1)
  %1 = extractvalue { i64, i1 } %0, 1
  %2 = extractvalue { i64, i1 } %0, 0
  tail call void @llvm.assume(i1 %1)
  %3 = tail call range(i64 0, 65) i64 @llvm.ctpop.i64(i64 %2)
  %cast = trunc nuw nsw i64 %3 to i32
 ret i32 %cast
}

declare { i64, i1 } @llvm.umul.with.overflow.i64(i64, i64) #1

declare i64 @llvm.ctpop.i64(i64) #1

define dso_local range(i32 0, 65) i32 @f0_slow(i64 noundef %arg0, i64 noundef %arg1) local_unnamed_addr {
entry:
  %rem = and i64 %arg1, 1
  %cmp = icmp ne i64 %rem, 0
  tail call void @llvm.assume(i1 %cmp)
  %0 = tail call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %arg0, i64 %arg1)
  %1 = extractvalue { i64, i1 } %0, 1
  tail call void @llvm.assume(i1 %1)
  %cmp3 = icmp eq i64 %arg1, 1
  %2 = tail call range(i64 0, 65) i64 @llvm.ctpop.i64(i64 %arg0)
 %3 = extractvalue { i64, i1 } %0, 0
  %4 = tail call range(i64 0, 65) i64 @llvm.ctpop.i64(i64 %3)
  %retval.0.in = select i1 %cmp3, i64 %2, i64 %4
 %retval.0 = trunc nuw nsw i64 %retval.0.in to i32
  ret i32 %retval.0
}

declare void @llvm.assume(i1 noundef) #2
```
GCC does use only one popcnt but LLVM does not optimize if(arg1 == 1)
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsVs2O4zYTfBr60rBBUZIlH3Tw2Os5fDv4Lovs0aCkls2EIhX-jDP79AH1Y8uTmSSDbAIEiGHAMtksVlV3U-TWipNCLEj6QNL9gnt31qZ4MMjrL7pdlLp-CXOPui61dCTdE5afnessibeEHQg7nIaplTYnwg7fCDuoR7Rfnp7-lxC2IXR7kPxk4YIGYfn_GJZfuZSw_Iq_OMNh2XJTnUm8FxVK_hMuKylQOUK3ZE3HL90SFgtVSV8jkHhnXS2UW51J_CnM0a1QDhpKWO6Fcuvk6ICbEyVsB_OBKNDJHgjdAsBtxrUdJfE0HKBc20XjiGgIy8NaICwFBiTek3gPdFAG4-d4LL2QTqijVwZ5dealRMLyEDXDISy6RbZeHvUzmkbqy7BHT3jguQPC1j0xthm3-uM9AHrmgeMsutNdpb1yJ8LyCfEab9B5o2aCSbafW3q0A7u_6OsrU4PN_y5fZ3QHotE90dHHt10fKPwNWZo3yOy5xkYohNrqo9QVl2C4OgVJImbQm7FOCdtA-EsS2jeOWCegtFc1NiEjk2u_HQ7CoYc9eqV4i_WR17WBoQBQOfMSToZAnLDUYNsL5arusa4YO4immKrt-hgRHhROcQbbEEb7MMeFhCqcG89a1IG1lM_tilvr215ZNCJNaSEspT3qbSXJHgJ2LysCku2vML71cnUR7ryaCmfVB-Y3ylc3bi5M-wyp7E-zyj1z6fGtrVhK71Szj6z6iAlzavErC66FsE7uCiHoGtEq1-nuXj6bIVbcugHUeFWB8hdQ9jI5E4PToaxCtEE3VNiwaH621FhJbt4U_CcyMmYiECcsju4hf0fK6wUfbJLpKPyvU_7JTvl4zVdtF99cwp_fdZN9l-aYDne6vTXch7qasDT5LkzimQkGw-4ruhKqx7YosXJwTX48SxKbPSejjmn9-60-3-HW9POunyLe6vx3kzm20Nir7NWb7XG3g1qjBW8RtJIvoBVCeHcqB6V38PnzD09DhNIOdOdEK77h26_vRV3E9Sbe8AUWUZZkeRJTli_ORRqledPUWdLQdZ2Ua15lmyzPy5zHZcOyZiEKRllKUxZFaZrRfEVLzMtsU20aVq0z3JCEYsuFXPX6tDkthLUeiyihmyhbSF6itP2VmzGFF-hnCWPhBm6KsGhZ-pMNBgnr7A3GCSexeBLWYg373Se4nFHBdHkA3UDrpROdFBV3Qqsw4i46XMDwhMb2JvVGCAsRCAX31-6FN7J4db0X7uzLVaVbwg6ByPiz7Iz-EStH2KGnbwk7jPqeC_ZrAAAA__9Eoo3u">