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

    <tr>
        <th>Summary</th>
        <td>
            Clang incorrectly assumes function alignment on arm64e
        </td>
    </tr>

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

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

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

<pre>
    When targeting arm64e (but not arm64) with -O1 or higher, `clang` assumes functions are aligned to 8 bytes rather than 4 bytes, generating wrong code that might not work.

Minimal reproducing code:
```
extern void external_func(void);
unsigned long get_func(void)
{
    return ((unsigned long)(external_func) & 0xFFFFFFFFFFF);
}
```

Output from `Apple clang version 17.0.0 (clang-1700.0.13.3)`:

`clang -O0 -arch arm64e`
```
_get_func:                              ; @get_func
        adrp    x16, _external_func@GOTPAGE
        ldr     x16, [x16, _external_func@GOTPAGEOFF]
        paciza  x16
        and     x0, x16, #0xfffffffffff ; Correct
        ret
```

`clang -O1 -arch arm64e`
```
_get_func: ; @get_func
        adrp    x16, _external_func@GOTPAGE
        ldr     x16, [x16, _external_func@GOTPAGEOFF]
        paciza  x16
        and     x0, x16, #0xffffffffff8 ; Incorrect
        ret
```

`clang -O1 -arch arm64`
```
_get_func:                              ; @get_func
        adrp    x8, _external_func@GOTPAGE
        ldr     x8, [x8, _external_func@GOTPAGEOFF]
        and     x0, x8, #0xffffffffffc ; Correct, but why bother changing the immediate here?
        ret
```

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzUlcuOrDYQhp_GbEqNjLkvWDAz4WiiRJ1FpCxHBqqxE2Mj28wlTx8ZmOvJ5CZlcayWuqmuv-rnsym4c3LSiA3Jr0h-E_HVC2ObH26_v01Z1JvxqflFoAbP7YRe6gm4nYsMgbCqXz1o4_cIYTU8SC_gdE7AWBByEmgJuwZS0EFxPZGCAndundHBZdWDl0Y74BaBq-BhBG-ggv7JowPLvUALXnAN2R4LtSbUaPnm48EaPcFgRgxZHmY5id3Pg7G_xYS2hLY_Si1nrsDiYs24DvKQkDT8Swp6fGiLjx6thnsjR9h_c3UXbBJWhSBhNUmvCG1X7Xa3KvSf0H_Moi0pQyIAgEW_Wh1gEVa9U4ZMVn3oVANhBdDH7nW99CXlzQfLhLbn1S-rh4s1c-DcLotC2GjDPVonjYakjGlMg4UtfkpKSmMaJ2mchtoFPVhstXfp6UzhxO0gjs0-2r1pffdy3-l2n58vkl4ByehLfuhU89EuhNaPSRE29e49hYx-Of_8U_vluz1XjfY1leRXfyM6dx3Jb3bpwgf5Oz_Ue2M9hksaKjyXZCl9vLyuzfG1sRYHv4ss-q_Jv4GV_BtY3xqPanN8q4f_TOR_Oz3VP4ZVPbP6S8lbVO_AVH_CZXh3Ttg1hGn4IJ6gN9vkGgTXUxg3XiDIecZRco8g0CJJu88wRmOTjnVa8wibpMzKtCpzmkWiqcceS6zzOhvKquorNvK8L5KkKi9YJukQyYZRltM8KWjNcprFRc3TvEz6bOhrmhUXklGcuVSxUvdzbOwUSedWbJKMMlZEiveo3PYaYGyf14yFN4JtguDUr5MjGVXSefdawkuvsLnetl0-nxH19NWc30f8jNpDuNgelGi1qhHeLy5MINYR1k3Si7WPBzMT1oUmx9dpsebXjXO3mXaEdYfv-4b9EQAA___5xP8u">