[Bug target/84826] ICE in extract_insn, at recog.c:2304 on arm-linux-gnueabi
sudi at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Mar 20 18:21:00 GMT 2018
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.
More information about the Gcc-bugs
mailing list