https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96759
--- Comment #2 from Kito Cheng <kito at gcc dot gnu.org> --- It work on GCC 9, GCC will split that into two plain move instead of move from a (subreg (parallel [(reg) (reg)])). (insn 23 22 24 (set (reg:SI 83) (reg:SI 10 a0)) "g++.target/riscv/pr96759.C":8:38 -1 (nil)) (insn 24 23 25 (set (reg:DF 84) (reg:DF 42 fa0)) "g++.target/riscv/pr96759.C":8:38 -1 (nil)) But it will ICE after GCC 10, try to bisect to figure out the reason.