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

    <tr>
        <th>Summary</th>
        <td>
            Missing Optimisation: llvm fails to merge multiple comparisons if the operand is modified between the comparisons
        </td>
    </tr>

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

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

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

<pre>
    IR:
```
define dso_local noundef zeroext i1 @src(ptr nocapture noundef readonly %a, i32 noundef %l) local_unnamed_addr #0 {
entry:
  %cmp = icmp slt i32 %l, 1
  br i1 %cmp, label %return, label %if.end

if.end:
  %0 = load i8, ptr %a, align 1, !tbaa !27
  %cmp1.not = icmp eq i8 %0, 97
  %cmp4 = icmp ne i32 %l, 1
 %spec.select = and i1 %cmp1.not, %cmp4
  br label %return

return:
  %retval.0 = phi i1 [ false, %entry ], [ %spec.select, %if.end ]
  ret i1 %retval.0
}

define dso_local noundef zeroext i1 @tgt(ptr nocapture noundef readonly %a, i32 noundef %l) local_unnamed_addr #0 {
entry:
  %cmp = icmp slt i32 %l, 2
  br i1 %cmp, label %return, label %if.end

if.end:
  %0 = load i8, ptr %a, align 1, !tbaa !27
  %cmp1.not = icmp eq i8 %0, 97
  br label %return

return:
  %retval.0 = phi i1 [ false, %entry ], [ %cmp1.not, %if.end ]
  ret i1 %retval.0
}
```

Alive2 thinks they are equivalent: https://alive2.llvm.org/ce/z/48Rg5F

Example C++ Code for the IR https://gcc.godbolt.org/z/d55WsMs19:
```

bool src(char *a, int l) {
    if(l < 1) {
        return false;
 }
    if(*a != 'a') {
        return false;
    }
    l--;
 if(l < 1) {
        return false;
    }
    return true;
}

bool tgt(char *a, int l) {
    if(l < 2) {
 return false;
    }
    if(*a != 'a') {
        return false;
 }
    return true;
}

```
Observed while working on an JIT Regex engine
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzcVl1r7DYQ_TXalyGLLa_j3Qc_7GZrSOFyIRT6GGRpbKtXlnwleZPcX18kO_thWrgJpZQui79m5syZ0dHYzDnZasSS5AeSH1ds9J2xpdOuZ3xVG_FWPj6RbE-SI0n25D6Z__FWYCM1gnDmWRnOFGgzaoEN_EBr8NWDTIFsEmc5odvBW9CGs8GPFs-eFpkwWr0BoTkj9AFkRs9GQnNF6A4i-POoNetRPDMhLBCaJUCKw0QEtbdvZ5YQAnk_AMmOIMOFUz4CT4APkL471jZyjO7BoFiNKtxb9KPVN49ks0Yt5kbE4_zkJm8SsyrDBMhtiA91vxfHlGw1pOGS0NTXjIUzLW55p2tt_IU8fge5jdAhbrdw3lwcNf5lkYTmbkC-dqiQT7hMi0vdMd1EKQJe9WbZjqva5yc3tVv0J6bWUwuGTsYc-QEaphzOGeJSAcmP8T4_LOjNXlNno9sMb9HPlN-zzGyK4zWtn5Skb_1_TJL0_yDJf08yC91-Ri-3s2w67pU8IQXfSf3Nge_wDZhFwO-jPDGF2pNsD533gwtl0IrQisWQtVKnfm1sS2jFkdDqB6HVZvvU5tU1_i-vrB8UwgOhB0IP8GAEQmNsSAWPTwvolvN1a0RtlJ-hA6rI89_dF5fu_m4sT8faGAXT6OUdCwu-n9SsPUQJn6UKACAbQrcKSBbmxtIYftPizeuSvRvP3TxjhDRBQWE9CS0YocUH8ABuIdXd3cX4SY5LzNnL2_HitJgisXfTjPhY7-it8ecI_QN9-2iBC8V8rR3aEwp46aRCeDH2m9QtGA1Mw6-Pv8ETtvgKqFupcSXKTOyyHVthmRZJSjdplm1XXVnUWZrnaZKkjNc5FxnldJNykQjGmuaerWRJE5qlKd0lRULT7XrHtynPcFvXdcLF7p5sEuyZVOfdtJLOjVgWWZHnqzhaXPxSoVTjC0QjoTR8uNgyxNzVY-vIJlHSeXdB8dIrLL9I50JZXwcve-mYlyZMIwhu0DCpHHgDPdoWoR-Vl2GnctMPzEpntAPZxH1qBrTxDeqgN0I2EgXU6F8QdbRfhaxGq8rFppa-G-s1Nz2hVUg9n-4Ga_6Ib8Aq1uUIrWLdfwYAAP__xDW3Tg">