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

    <tr>
        <th>Summary</th>
        <td>
            Failure to merge equivalent comparisons/switch cases
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            missed-optimization
      </td>
    </tr>

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

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

<pre>
    https://simd.godbolt.org/z/qW4so9Mbq

```C
#define CASEA 34
#define CASEB 36
#define CASEC 0
#define CASED 127

int testSwitch(int a0, int a1, int a2, int *out) {
    bool addOffset = a0 == CASEA || a0 == CASEB;
    switch(a0) {
        case CASEA:
        case CASEB:
          *out++ = a1;
 break;
        case CASEC:
        case CASED:
          *out++ = a2;
          break;
        default:
          *out++ = -1;
 break;
    }
    if (addOffset) {
        *out++ = a1 * 9;
 }
    return a0 + a1;
}

int testIfElse(int a0, int a1, int a2, int *out) {
    if (a0 == CASEA || a0 == CASEB) {
        *out++ = a1;
        *out++ = a1 * 9;
    } else if (a0 == CASEC || a0 == CASED) {
        *out++ = a2;
    } else {
        *out++ = -1;
 }
    return a0 + a1;
}
```

Reduced from an internal code snippet - the 'addOffset' boolean is the same comparison as the CASEA/CASEB in the first switch (and the IR converts it into a second switch) - but its still tested separately.
```ll
definei32 @_Z10testSwitchiiiPi(i32 noundef %a0, i32 noundef %a1, i32 noundef %a2, ptr nocapture noundef writeonly %out) {
entry:
  switch i32 %a0, label %sw.default [
 i32 34, label %sw.epilog
    i32 36, label %sw.epilog
    i32 0, label %sw.bb2
    i32 127, label %sw.bb2
  ]

sw.bb2: ; preds = %entry, %entry
  br label %sw.epilog

sw.default:                                       ; preds = %entry
  br label %sw.epilog

sw.epilog: ; preds = %entry, %entry, %sw.default, %sw.bb2
  %.sink = phi i32 [ -1, %sw.default ], [ %a2, %sw.bb2 ], [ %a1, %entry ], [ %a1, %entry ]
  store i32 %.sink, ptr %out, align 4
  switch i32 %a0, label %if.end [
    i32 36, label %if.then
    i32 34, label %if.then
 ]

if.then:                                          ; preds = %sw.epilog, %sw.epilog
  %out.addr.0 = getelementptr inbounds i32, ptr %out, i64 1
  %mul = mul nsw i32 %a1, 9
  store i32 %mul, ptr %out.addr.0, align 4
  br label %if.end

if.end: ; preds = %sw.epilog, %if.then
  %add = add nsw i32 %a1, %a0
  ret i32 %add
}
```
(https://alive2.llvm.org/ce/z/Te8JKK
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykV92OozgTfRrnptQIzF9ykYtOMpHmG33a1cxKK-3NyuAi8Y6xGdt0q-fpVwZCCKFnMtqo1ZhyUXV86rgMzFpxUohbku5Ielix1p212X7-9EXUWq0Kzd-2Z-caS-JnQo-EHq2oeXDSvNDSBdqcCD1-J_T47c_E6s3_i28kPJDwefifhf3ffrinMcdKKIT985cPzxAnS_YdxNmSfQ_hkvkAEc2nWYVy4NC6L6_ClWdC197AQkL30I2icUQvI0KfdesI3QDJd30UAIBCawmM89-qyqIDEh-Ahf7iR_0SSL4n-X5m3pF4EsVecHgMswz-VzI7EOJJXp7a3U3BCHpH6K7HFl3zFgbZ1xsYN_H276c6PJSK3sWGd3JyrFgr3SNRn364AJIfrjeiAs_opTaLxC4Q5G2wuYa9iWnQtUZ1taS7KZuj163APlYfpMX_IrBhFY9p6sEl3hXgARp6dgGlxUVM-2VMhwcx0eVMP39yKohfLdWl90wr9xl5WyKHyugamPKlQaOYhFJzBKtE06CDJ3BnBELzibzyrhmgf8Z205bVCKWuG2aE1QpYb-73MT32jUyozlgJY93QBzpyFe_sHz9DqdULGmdBOI9GAwOLpVZ8bBsbeIKidSCcBeuElJ32kIPFhhnmUL4FsyVL2Rv6LiliCiQJ__4rCq9tUQjxu_DSjSko3SqOvuzpoOKZMVoydtpunAGlS9a41uA4_WqEQ63km3ec6x6VM2-TbjDQ0qG8AJCsQOlv7Wsw9A_wJ1T_iHeNk7kfNkLq02Rvea_sEa-7lEVBbz38CfO-D0lv2sMwGT8DiXfQGOS2EzOhab92ur-OhxCFeRflGPTaSOGx3zvpfyHlYHxsKf14AnQ0TLmiaWCF-tqFac6ir3u681t9HqAj1hvT3VVxY8T5bDQF8_PJi_qcNngRX4fsIuuLdPfApDgpSB4SrKgCVHwi1mUliipwZ1Qzn-QHPjORXSYfFsOSHq4VHom93R89BwHj3ARd54cTOpRYo3KeI6EKv-Wth3_Pm8gSiCah6lZ2MfxV2deRwa44m8WK1K28jTtgWSjLVM99FWZ8ecuSkucszGrjEXLeH2Sc3wPvNTA4G3TjLOc_OZLo-vbVmknxgjSQ8qUe3qxLHF6v_8D1_z59WvFtzDfxhq1wG2V5Gq3DPM5W521alTShFWbJOtzQjEVhgnlabErk5TqLkpXY0pDGYRRHUZqu0yzANIyjMo3TdZhVeU5JEmLNhByzr4S1LW6zMKHJqiPWdh8JlNbCWuRPunGiFt-ZE1oRSv3Xg9n6p5-K9mRJEkphnb3Gc8JJ3B6ZkP6ocBpqNCcE_NaKFyZRuclpav2HRr_N_HupXbVGzr5DTsKd2yIodU3o0ScZLk-N0f9g6Qg9divwobpF_BsAAP__0Vp7EA">