aarch64 NCG miscompiles subword across C FFI boundary
```c
#include <stdint.h>
uint8_t u64_to_u8(uint64_t v) { return (uint8_t)v; }
```
```haskell
{-# LANGUAGE MagicHash #-}
import GHC.Exts
import Data.Word (Word64)
import GHC.Word (Word8(..))
import System.Environment (getArgs)
foreign import ccall unsafe "u64_to_u8" u64_to_u8 :: Word64 -> Word8
{-# NOINLINE eq8 #-}
eq8 :: Word8 -> Word8 -> Int
eq8 (W8# a) (W8# b) = I# (eqWord8# a b)
main :: IO ()
main = do
[x, y] <- getArgs
-- 5 = 0x05, 65541 = 0x10005 (both have low byte 5 -> equal as Word8)
print (eq8 (u64_to_u8 (read x)) (u64_to_u8 (read y)))
```
on aarch64, compile with `ghc-head test.hs test_c.c -o test && ./test 5 65541`, it produces the right result `1`. but when `-O` is added, it produces the wrong result `0`. compilation with `-fllvm` doesn't have the same issue.
this is reproducible on aarch64-linux with current head commit 44309cd377f115d3e6b788097750bd534b47f3e4.
issue