https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78038
--- Comment #2 from ktkachov at gcc dot gnu.org --- Hmm, so the zero_extend candidate is: (insn 9 10 11 2 (set (reg/f:DI 1 x1 [orig:74 g.1_2 ] [74]) (zero_extend:DI (reg/v:SI 28 x28 [ g ]))) "ree.c":16 84 {*zero_extendsidi2_aarch64} (nil)) and the def_insn that causes the ICE in get_sub_rtx is: (call_insn 8 7 10 2 (parallel [ (call (mem:DI (reg/f:DI 0 x0 [orig:77 test_fptr ] [77]) [0 *test_fptr.0_1 S8 A8]) (const_int 0 [0])) (use (const_int 0 [0])) (clobber (reg:DI 30 x30)) ]) "ree.c":14 41 {*call_reg} (expr_list:REG_CALL_DECL (nil) (nil)) (expr_list (clobber (reg:DI 17 x17)) (expr_list (clobber (reg:DI 16 x16)) (nil)))) This doesn't have a SET anywhere in it so it causes the ICE. The question is, by what logic did dataflow decide that call_insn 8 defines register x28?