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

    <tr>
        <th>Summary</th>
        <td>
            [AVR] clang crashes on pointer cast between address spaces
        </td>
    </tr>

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

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

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

<pre>
    Trying to compile the following C code for, say, ATmega8:
```c++
#ifdef __clang__
#define __flash __attribute__((__address_space__(1)))
#endif

int getx (const int *x, char in_flash)
{
    if (in_flash)
        return *(const __flash int*) x;
    else
        return *x;
}
```
crashes clang v16:
```none
> avr-clang -Os foo.c -save-temps -mmcu=atmega8 -Wall -c
fatal error: error in backend: Cannot select: 0x556cb5bd2f30: i16 = addrspacecast[0 -> 1] 0x556cb5bd3010
  0x556cb5bd3010: i16,ch = CopyFromReg 0x556cb5b500f0, Register:i16 %3
    0x556cb5bd2de0: i16 = Register %3
In function: getx
clang: error: clang frontend command failed with exit code 70 (use -v to see invocation)
Ubuntu clang version 16.0.0 (++20230118052744+29d25f9e9a4c-1~exp1~20230118172840.512)
```
The code compiles fine with `avr-gcc`:
```none
getx:
        movw r30,r24
        tst r22
        breq .L2
        lpm r24,Z+
        lpm r25,Z+
        ret
.L2:
        ld r24,Z
        ldd r25,Z+1
        ret
```
FYI, the default gcc behavior is to accept the code without diagnostic, except when `-Waddr-space-convert` or `-Werror=addr-space-convert` is on:
```none
foo.c: In function 'getx':
foo.c:8:9: warning: conversion from address space 'generic' to address space '__flash' [-Waddr-space-convert]
         return *(const __flash int*) x;
         ^~~~~~
```




</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJycVU-PqzYQ_zTOZURkTIBwyCGbvEhPqlRpte1Te0HGDOAW7NQ2Sfayn72yCUn2z-uhBAX4ef555jdjbq1sFeKGpE8k3S_46DptNvZopHJobLWodP26eTGvUrXgNAg9HGWP4DqERve9PvuFHQhde8AQtgPLX_1j-zJgy9ck2RK6J3RLMjrdgrAnf08oS2RTYwNlKXqu2rK84TU2UiGUZdNz20FZcueMrEaHZUnYmrB1WfK6NmhtaY9cTHBMWHG9Z0Ooatlcv8K_VA5adBcgbC20sg48Qtj24gMXHTcg1eT2bie_RgwAIBuv-kkGrpdBNxrlDd4czLuQygW4gAtJHixib_FnRu6SJN9_SOb0KQy3HVoIKYRTnH3OutLq6oAk34CfTDQJR79aaLReCogsP2HkcDhaiIZBjCTZcxeKCNEP3vcQiclCwx3vAY3RhiTb6QWkgoqLv1HVHttxpbQDiz0K5wF6SdNMVGlVsyahHpFxBiTZg69hqJ_g1pH0iULkQ4xJun_QSmhM5wR9QCdbhO1EFwzu9PH1YPTwjO1dNKW0ob68z9hK69BHHiJgaXJP_EOUNb6LclZ7UPiuoBmVcFIrL-kZdS2Hz-wtM_5lynVjtHKoat9GA1c1NFz2WMNZug7wIt3URzn17BotQnTyTWcRQaqTFjy4mtn2WzUqN841R2OlVhBnS7oM-lOXMcoSGsdrmrJ8tfJAUbO0KbDgKxHFb3g5xm-zUJyz9You05jdaf-eaC8dTjFeB4GF0KNhAySjnlatEF78PwgYEnVbp8WgT2cwia-OYasb7KwDw9jtuzL4Dyx_uQP9cQCvwHZ_3ufJDKcfYYNuevcmHrz39c3IHaofLMSfTXzIyuGP755ZfijW2PCxd9AKARV2_CR9a1hfRi4EHl2QCin0SdOjg1ryVmnrpPBG8BKkzh0qn9Hoh2-PKPRHJLQ6oXEko6DNtHpl2P5rKWkhcPOnpQid7wn6wGUgLA8lYvlNdZbz47zw8mdulJxIPvkL7GuMHuA6kyFEMxlTaPzu8pCGj8vlPEVzIOnTlxtO9-9n4_-ZsOEi6bc3f31Zxs__i3qT1EVS8AVu4ixfJUkWU7boNjSlfJXTNKFIKeVVnVRYVasmi7OMrkW2kJupqVj4rdgSi6ygRZPHWYqYZzFZURy47Jd9fxqW2rQLae2Im4zG62LR8wp7Ox_LZuOFompsLVnRXlpn72pOuj4c4Nvfn_3InObBfCJoBUcdDnPw4xUqdGdE9b4KdjGaftM5d7S-4uxA2KGVrhurpdADYQfv7PqIjkb_5Wc6O4SALWGHEPO_AQAA__83RmwO">