<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/54967>54967</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Simple shift in loop body not optimized to eliminate the loop
</td>
</tr>
<tr>
<th>Labels</th>
<td>
llvm:optimizations
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
zero9178
</td>
</tr>
</table>
<pre>
Given following IR:
```llvm
define i32 @src(i32 %a) {
%1 = icmp eq i32 %a, 0
br i1 %1, label %loopexit, label %preheader
loopexit:
%2 = phi i32 [ 1, %0 ], [ %5, %preheader]
ret i32 %2
preheader:
%3 = phi i32 [ 0, %0 ], [%6, %preheader ]
%4 = phi i32 [ 1, %0 ], [%5, %preheader ]
%5 = shl i32 %4, 1
%6 = add nuw i32 %3, 1
%7 = icmp eq i32 %6, %a
br i1 %7, label %loopexit, label %preheader
}
```
While the tripcount of the loop is not static, it is equal to `%a`. That should make it possible to optimize the above code to simply:
```llvm
%c = shl i32 1, %a
ret i32 %c
```
Corresponding Alive 2 link: https://alive2.llvm.org/ce/z/f_xJrW
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyVVNtu2zAM_Rr7hVggyZfYD35IG3TYHrcBfRxkW4m1ypYryb19_Sg5bi4Nig2wFZE84TmkKNe6fa2-yicxwE4rpZ_lsIdvP6JkE5FtRDZRTuZHqad-drViJwcBMmEQpcSaJmJFMFjGI1ZCtL6ZgeBdFKJkC7LpRxCPcMTdAllQtQFJA9a7Fa-F8pbSehQv0p05RyM6wVthDvLC-o5cVAdmFpjHTs6s2Q2E_BghaG3DHp1oZwf_MTmGD4mMcItqdsp5xJ6RJh9IyRVSNPNLTjghRX_6T-qvib9IlIVEtlNLGan_Az1B5AHB2xaG6XlBJZeo9bWDXKrgH85y_f9nud5ezNxs3ndSCXAdvkaOjZ4GB3oXHD4tSAuDdmAdd7LxBNJ5n3icuAKnwSfyCnOygl8dR2SnJ9VCzx-Ex47aWll7Cg16dLKXbzMdr_WTgEa3IWRlP6rXzy5GaFNz1m562Z-TcWquVjuvt9oYYUc9tP4-bhReUGCg5PCAAqBzbrReCbvDh_soW3kdK2326GkELm_47n6_fDf3ELdV0pZJyWMnnRLVT1-KQJFyh2qGuY01fglCI5cetL5qoXA_cCfe-x1PRlXnCvbSdVO9anSPRujH_PNlNPqPaPDU76S1k7C4ydIyX8ddVSSkaBpSMiqSrMgymmY1p0lLdplgtM3jMCa2CkPOQtJkc5CGB60HTMZw0mNZMcIYSWnBaEJouioKmuZ1U-esLMqEpviREj2X6r1DsamCunraWwwqaZ09BjlOw34QIjBjfj65TpvqTRhd0nURh0qqUMZfmdl6MQ">