<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/54345>54345</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[AVR] Illegal "call" instruction is generated on avr2 and avr25
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:AVR
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
benshi001
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
benshi001
</td>
</tr>
</table>
<pre>
For the following C code,
```
int foo0(int a, int b);
int foob(int a, int b, int c) {
return add(a, c) - b;
}
```
Build it with
```
clang a.c -O3 --target=avr -mmcu=at90s8515 -S
```
Then the following assembly is generated
```
foob: ; @foob
; %bb.0:
push r16
push r17
mov r16, r22
mov r17, r23
mov r22, r20
mov r23, r21
call foo0
sub r24, r16
sbc r25, r17
pop r17
pop r16
ret
```
However the call instruction (long call) is available on avr3 and above, for avr2/avr25/avrtiny, rcall (show call) should be used.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyFU0uPmzAQ_jVwsUDGQAIHDruNVu2pUlv17scsuHVwZJtE--87Nsm2iZItQszY3zy-GWaEVW_Di3UkTEBerTH2pOeRfCLSKsjYJ5LRXUafsg09v-mo54DGlmasiyqPhlERGeuz-vnKSNwxWhWJ1iTbns0JcRAWNxOuFLok82RRoMclZrbd3SW0fp8XbRTRgZx0mO4zl4ZjebyUpPhak6II3I0QsnrHj44U-71coh566ru2aknx_YN0PyaYb_rGvYe9MG9EezLCDI4HUHdDpM7UWPV_HyyeZA1NDmukeMFaIUqKES7dW5_D4qcoXbV5BGyvgb09kosHttwx9gjfrnj9AEfHhNNHeL3i1TUuuTFRpnm6Qvwizp5N8rwtyQt5xtsVv6nsYA_vzB8ANxFxAj_435_tCY6wrkpirWcf3CKDtjP-kM5YnIAIxKnFAeBHrg0XBgjiOF814bMiXNhj2qxX3Dq8xa69RNGuMuj5LVWTMmBUP9nTe1Q8LDjiAsjiQZW5GmrV1z3Pgw4Ghqx9fvr5LWt35IsxMPIYgK2-7Irtv-N5ZsdWdpFJvjgzTCEcfJwv9oLviBu1iFLaPR6MOV5EcXD2F8iAR-39Ah6VtqmbNp-Gnm66XsqqFz0DgIq_9n1TK9qLCrbQ0RybA8ZH1shPcPkbZoUZYwk4TO0u1wOjjNG6YlVVsaYrldyoSlEum67nXLS4F7DHLpeRS2ndmLsh0RLL6BE02gf_F8T11OMMcEkJs580pdU5HV_CZN3wfp2nkoZUzx-Sr2o1">