<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">