<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/64368>64368</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[LICM] Missed optimization in common code
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
ZY546
</td>
</tr>
</table>
<pre>
Hi, I've noticed a missed opportunity for LICM in common code.
https://godbolt.org/z/oMGWxYrW6
```C
extern int var_12;
extern int var_13;
extern int var_16;
extern int var_17;
extern int var_18;
extern int var_19;
extern int var_20;
extern int var_25;
void test(int var_0, int var_1, int var_5, int var_6, int var_9) {
for (int i_4 = 1; i_4 < var_0-2147483638; i_4 += 1)
{
var_17 += 1774623354;
if (var_9)
{
var_13 += var_1;
var_17 += var_6 + var_0; //In fact, `var_6 + var_0` is a loop invariant
var_12 += var_5;
}
else
{
var_17 += var_6;
}
i_4+=i_4/3;;
}
}
```
In fact, `var_6 + var_0` is a loop invariant, but clang16:
```
for.body: ; preds = %for.body.lr.ph, %if.end
%i_4.023 = phi i32 [ 1, %for.body.lr.ph ], [ %add7, %if.end ]
%add51322 = phi i32 [ %var_17.promoted, %for.body.lr.ph ], [ %add514, %if.end ]
%add11621 = phi i32 [ %var_13.promoted, %for.body.lr.ph ], [ %add115, %if.end ]
%add41820 = phi i32 [ %var_12.promoted, %for.body.lr.ph ], [ %add417, %if.end ]
%add = add nsw i32 %add51322, 1774623354
br i1 %tobool.not, label %if.else, label %if.then
if.then: ; preds = %for.body
%add1 = add nsw i32 %add11621, %var_1
store i32 %add1, ptr @var_13, align 4
%add2 = add i32 %add, %var_6
%add3 = add i32 %add2, %var_0
%add4 = add nsw i32 %add41820, %var_5
store i32 %add4, ptr @var_12, align 4
br label %if.end
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVl1v6ygQ_TXkBdWC4cPxgx-aRNmttH2-uvtS2TFJWDnGApJ7b3_9CvwRJ42322tVteHMnDMMA5nCOX1olMqRWCGxWRRnfzQ2__u74HJRmupX_qdGsMYvCNKLwo3xeqcqXOCTdk5V2LStsf7caP8L743Ff72sX7Fu8M6cTia8KpUgskHkuft_9L51iD0j2CLYHkxVmtonxh4QbN8RbM3rH99-frffZO8kSfe37sbqp1e2wbrx-FLYNwqIrR4jbBaRs0g6iyxnkWwOATKLiBG5GF1hr5xHsBxgEvI98k8HYjqQ00GGIMMoXU1TjTGOW9JT6zeOEdtgitiqH6w7vSegPOVLJtlyxGDV2QbakW0UwP3TZW20TlMugTHBx_UNhnofwhgivcU-sI7MbGDuMnFP-jGCmJcw6BPJVlEg1tpLg_fFzoesIUnuLSXB2uEC18a0WDeXwuqi8b1eV2pTEfEhGJRubidU7dTcQh9E_TmhfuOdQ_zYxgIfnUbr68dwdKY18VtJgDUuzx7v6qI5hNPz_FBgb2wSLgzEbjboP5-wQa1VlYuViUAMJEltk_YYwwSh94lqqiEZYeKNJwRYdGqPGmsGGIkVpr3DLQtGYhMBsQpgUVXpDXHEr-RFVQnKAD6wIxDdviWtNSfjVfU_5QTlnwhSKoHOCrKvClIqPhHkdAlkVhC-KsjpZymNWuHduB-d3jXTwXVyd_R-pcWaBjNvSmPqpDGxEuuiVPWgFI7Y3Zw_qmZa8cPUF6pyvizvdm1mUXE3-3x0N1fv5ryxamoYjFpvMeKk_9GCNS5qfWgwv9WCUevqPpGQt9bsgTVMzMldNcwsJFbJxE3MLYTfLwQeLKS0t5s3HOnxHllUOasylhULlVOZUcJlBtnimANVsiirMhN0n2aVIrLYlVKIcsfUPqXZQudAgJElYSSlArKEE7YEJdRekFLumUScqFOh66SuL6fQbiy0c2eVS87kchHDcrEFAmjUDxxBBBA6IpsHn6fyfHCIk1o7764sXvs69k6h70Fig1-Htsjrk34vvDbNXTu0ONs6v2uDtD-ey2RnTgi2gbt_PbXW_KPCdb2NETkE2xjxvwEAAP__z8WdXg">