https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78038
--- Comment #3 from ktkachov at gcc dot gnu.org ---
(In reply to ktkachov from comment #2)
> 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?
I suppose it's because of:
register struct test2_s *g __asm__("x28");
Are calls assumed to clobber/write such things?