<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/77158>77158</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Convert clamp into fmaxnum/fminnum pairs.
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
hiraditya
</td>
</tr>
</table>
<pre>
test case
```cpp
float clamp(float a)
{
const float b = 255.0;
const float c = 0.0;
if(b < a)
return b;
if(a < c)
return c;
return a;
}
```
clang compiles to
```asm
clamp: // @clamp
movi d1, #0000000000000000
fcmp s0, #0.0
mov w8, #1132396544 // =0x437f0000
fmov s2, w8
fcsel s1, s1, s0, mi
fcmp s0, s2
fcsel s0, s2, s1, gt
ret
```
but we could have something like
```asm
clamp: // @clamp
// BB#0: // %entry
adrp x8, .LCPI0_0
ldr s1, [x8, :lo12:.LCPI0_0]
fmov s2, wzr
fmaxnm s0, s0, s2
fminnm s0, s0, s1
ret
```
@sebpop had a patch a while back https://reviews.llvm.org/D24033 that would do this. Since phabricator is deprecated i'll move the patch here.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0lM-O-jYQx5_GuYw2cuwEkkMOCwipUg-V-gDVxJkQd504sh3Y7dNX-QO7UHbVy89CNng-_s54vsLovT71RCXLdiw7RDiG1rqy1Q5rHT4wqmz9UQbyARR6YvzA-Os6b_jyUcOw7DTGYgBlsBuYyJdfyEQB64Htbv0GoGzvAyxIBUweQGRZzJl8jqgZ4XfAldMNE_mksf-aDADAURhdD9VX1ZnGmVZPafUkxRrCzxDbHh668LU1ymB_AmW7QRvyEOwDi767gd3A5Jz_58HEkYkjsJQvZ5bKOnvWU7ROmNgDE5I_jM_rTaNR3TCtnl_x-IHo7Bku-RpNEilkscnS9Nty5IG_p3LbPMk1SU25xKR2yddoozyZaXuueJ3ncjr9U7FePEZXnWv0pnYK96Sj8NSqagxwIVB2NDW0eCbwtqPQ6v4ERr_RL_Js3dztpvb_D5mriMioD-7j_m5Yu7lH77Nl8e_7P37jfz0YYWo3r0t3WLZbYCZfjU0Ek6-3Y9nhRwv_cY9hfO-7mwXPbep0_x8mWZnvnFnnlHuqBjsAtFgDwoBBtYBwabUhqFC9QRvC4Jlcm-rorOniY2POXWzdiYnjQaRcSggtBrjMTtcWQqt9DH_qXhEMLVZOKwzWgfZQ0-BIYaAaNBNbY6Z_BEFoaU3fkqN4KTCqS1kXssCIymTL07TYFEJGbSlRprjBplFYSC4KTEjklax40RRJU_NIl4KLlCc8E1IILmNVbPIkrdM8U0Utc2Ippw61uV0l0t6PVG63SZZHBisy_vpku3KCXqrx5FnKjfbhswNR0MFQubf9mdz6NIPug13MGzsmjrNFYwcDaufjaHSmvG_rSYd2rGJlJ3pSXpeXwdm_SQUmjnN1nonjXOC_AQAA__-6Eqqu">