https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84826
--- Comment #8 from sudi at gcc dot gnu.org --- (In reply to Wilco from comment #5) > It seems a latent bug in arm_r3_live_at_start_p which now triggers much more > often due to stack clash protection: > > if (IS_NESTED (arm_current_func_type ()) > && ((TARGET_APCS_FRAME && frame_pointer_needed && TARGET_ARM) > || ((flag_stack_check == STATIC_BUILTIN_STACK_CHECK > || flag_stack_clash_protection) > && !df_regs_ever_live_p (LR_REGNUM))) > && arm_r3_live_at_start_p () > && crtl->args.pretend_args_size == 0) > > Given that liveness can't guarantee dead registers won't look live at start, > the r3_live_at_start should really be about function parameters which is a > fixed concept. Is there no query that can accurately tell you which > registers are used for parameters in the current function? > > For GCC9 we need to redesign this whole area - most of the above checks are > quite inaccurate (for example a temporary is only used for stack checking if > the stack size is > 16KB), copy and pasted multiple times in slightly > different ways, and not cached when computing the frame layout like on > AArch64. > > However a quick workaround for GCC8 would be to assume > arm_r3_live_at_start_p is always true in the above code. Also we should > never change the generated code in functions which do not require stack > checking, so changing the stack checking enabled test to framesize > 16KB > would be the right thing to do. I have created a new report PR 85005 for this cleanup. For now I am only making changes enough to get rid of the ICE.