<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/55159>55159</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            allocating 32 bit number as registers in AVR inline assembly fails
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          maribu
      </td>
    </tr>
</table>

<pre>
    The following proof of concept shows the issue:

```C
#include <stdint.h>

uint32_t foo(void)
{
    uint32_t result;
    __asm__ volatile(
        "ldi %A0, 1"                    "\n\t"
        "ldi %B0, 2"                    "\n\t"
        "ldi %C0, 3"                    "\n\t"
        "ldi %D0, 4"                    "\n\t"
        : "=r"(result)
        : /* no inputs */
        : /* no clobbers */
    );

    return result;
}
```

Compiling this with `avr-gcc -mmcu=atmega328p -Os -S poc.c` yields:

```
        .file   "poc.c"
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__SREG__ = 0x3f
__tmp_reg__ = 0
__zero_reg__ = 1
        .text
.global foo
        .type   foo, @function
foo:
        push r28
        push r29
        rcall .
        rcall .
        in r28,__SP_L__
        in r29,__SP_H__
/* prologue: function */
/* frame size = 4 */
/* stack size = 6 */
.L__stack_usage = 6
/* #APP */
 ;  6 "poc.c" 1
        ldi r24, 1
        ldi r25, 2
        ldi r26, 3
        ldi r27, 4
        
 ;  0 "" 2
/* #NOAPP */
        movw r22,r24
        movw r24,r26
/* epilogue start */
        pop __tmp_reg__
        pop __tmp_reg__
        pop __tmp_reg__
        pop __tmp_reg__
        pop r29
        pop r28
        ret
        .size   foo, .-foo
        .ident  "GCC: (Alpine Linux) 11.3.0"
```

However, compilation with clang fails:

```
 $ clang -target avr -mmcu=atmega328p -Os -S poc.c
poc.c:7:9: error: couldn't allocate output register for constraint 'r'
        "ldi %A0, 1"                    "\n\t"
        ^
1 error generated.
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy1VkuTmzgQ_jX4ojKFBX5w4ODBmcwhtZlKtnKlhGiwsgJRkrBn8uu3BcYY78ymKqlQtpG-brVa_fjkXBWvyd9HIKWSUp1FU5FWK1US_HDVcGgtMUd1NsSikjCmAy_ce8HBC8bfTTB80suchqLhsiuAeGFqbCEa6x-98MPtog7BkGYWt1Ue3Z2UKDwaXzS2D8OA4HNV1GA6ab3wRpZlzNRZRk5KMiskoKFJ6B6PUlkIfK33gUdTskKAvPEg7K3TBr_WDd-x8dDboL9lI-1thL9l49DbiH7FRrjv5eFBuxfdXYI6Rn6u9-jRPWkUEU3bWYPA3mH_o8ilynPQ_1V1G4yJm1ANttPNfWK97eGurm7XpapuhXRVao_CkLOwR4Iq7KSXFedkWde8w-MxW0PFQrpryfKzIcuvpFXc56hJXgXIwrxXwyMY-6UrqCDGOA1Lx1hm2dfn7AmrDrchwUsIN_CnCS6u8JcPHye4HGFbt5mGapSM8A_Q6gZfTf5YeLHDzK8wzkwi6JpnUnht4YJheXhRUHYNt0I1g4rDp0PHbWeORI8NMwHxFdCcSUn8d-ei6dfTdDz6XBKPkqerZCgUpBepqp5GyOjirGIueqVmNRAjfkAfiugtHWMZ_2fS2cx0fPSpV8g6w6qLxmw5UtX--XlerliIpDd0zftNFlwHahoNXDIH1wM5zMHN0O1zcDu07wje7hv07Ylb0ns___p87ykurdXpjAZxReq8uoOjHp6fGLB7XPBd5LS9t9eqltyU5h_Bb0tsmE81iIww1bPL6lTP_nJW7KKAxg7t-TFNBxra7WUrGiCfRNO9IOWQ1coP_eDauW8SypM6wwm024L33ML6euyJhUuGRFMyIX_CF7h5dNFeYlwrsAQZ6ads1K8dhuF-i9_YHQS0VtoNuOpk0Xh0i9bwbubMAlGdRTJGzqyEsaDx-tTumjZWM7wo0Y8tHmX7B27B9eX6Xg3-kQoa0OhR4d9FZFEkYRGHMVtYYSUkF9cdZYeU5MKSpqvxliDMXI9h8I4h-29f8CVdBpkxUOfydYj9otMyOVrb9llwdfxYYXq63MeM4UTK0_haIrl8B47-P_Z_VQwO1uvVOl4cE04h2PEyyvMQonC3goIDjzjEmyDOKY8WkuUgTeKtH7z1YSESGlAaRHQX7IIg2vpFRCHnm3JX0mAbFhEyLNTon-829pWuFjrpfci7yqBQ4tHMJMQziaoBGO2zzh6VTmqmRd4tem-T3tV_AWHxj6Q">