Commit bb4ac03b by Sudakshina Das Committed by Sudakshina Das

[ARM][PR target/84826] Fix ICE in extract_insn, at recog.c:2304 on

arm-linux-gnueabi

The ICE in the bug report was happening because the macro
USE_RETURN_INSN (FALSE) was returning different values at different points
in the compilation. This was internally occurring because the function
arm_compute_static_chain_stack_bytes () which was dependent on
arm_r3_live_at_start_p () was giving a different value after the cond_exec
instructions were created in ce3 causing the liveness of r3 to escape up
to the start block.

The function arm_compute_static_chain_stack_bytes () should really only
compute the value once duringepilogue/prologue stage. This pass introduces
a new member 'static_chain_stack_bytes' to the target definition of the
struct machine_function which gets calculated in expand_prologue and is the
value that is returned by arm_compute_static_chain_stack_bytes () beyond that.

ChangeLog entries:

*** gcc/ChangeLog ***

2018-03-22  Sudakshina Das  <sudi.das@arm.com>

	PR target/84826
	* config/arm/arm.h (machine_function): Add static_chain_stack_bytes.
	* config/arm/arm.c (arm_compute_static_chain_stack_bytes): Avoid
	re-computing once computed.
	(arm_expand_prologue): Compute machine->static_chain_stack_bytes.
	(arm_init_machine_status): Initialize
	machine->static_chain_stack_bytes.

*** gcc/testsuite/ChangeLog ***

2018-03-22  Sudakshina Das  <sudi.das@arm.com>

	PR target/84826
	* gcc.target/arm/pr84826.c: New test.

From-SVN: r258777
parent 253db553
2018-03-22 Sudakshina Das <sudi.das@arm.com>
PR target/84826
* config/arm/arm.h (machine_function): Add static_chain_stack_bytes.
* config/arm/arm.c (arm_compute_static_chain_stack_bytes): Avoid
re-computing once computed.
(arm_expand_prologue): Compute machine->static_chain_stack_bytes.
(arm_init_machine_status): Initialize
machine->static_chain_stack_bytes.
2018-03-22 Kelvin Nilsen <kelvin@gcc.gnu.org> 2018-03-22 Kelvin Nilsen <kelvin@gcc.gnu.org>
PR target/84760 PR target/84760
......
...@@ -19392,6 +19392,11 @@ arm_r3_live_at_start_p (void) ...@@ -19392,6 +19392,11 @@ arm_r3_live_at_start_p (void)
static int static int
arm_compute_static_chain_stack_bytes (void) arm_compute_static_chain_stack_bytes (void)
{ {
/* Once the value is updated from the init value of -1, do not
re-compute. */
if (cfun->machine->static_chain_stack_bytes != -1)
return cfun->machine->static_chain_stack_bytes;
/* See the defining assertion in arm_expand_prologue. */ /* See the defining assertion in arm_expand_prologue. */
if (IS_NESTED (arm_current_func_type ()) if (IS_NESTED (arm_current_func_type ())
&& ((TARGET_APCS_FRAME && frame_pointer_needed && TARGET_ARM) && ((TARGET_APCS_FRAME && frame_pointer_needed && TARGET_ARM)
...@@ -21699,6 +21704,11 @@ arm_expand_prologue (void) ...@@ -21699,6 +21704,11 @@ arm_expand_prologue (void)
emit_insn (gen_movsi (stack_pointer_rtx, r1)); emit_insn (gen_movsi (stack_pointer_rtx, r1));
} }
/* Let's compute the static_chain_stack_bytes required and store it. Right
now the value must be -1 as stored by arm_init_machine_status (). */
cfun->machine->static_chain_stack_bytes
= arm_compute_static_chain_stack_bytes ();
/* The static chain register is the same as the IP register. If it is /* The static chain register is the same as the IP register. If it is
clobbered when creating the frame, we need to save and restore it. */ clobbered when creating the frame, we need to save and restore it. */
clobber_ip = IS_NESTED (func_type) clobber_ip = IS_NESTED (func_type)
...@@ -24875,6 +24885,7 @@ arm_init_machine_status (void) ...@@ -24875,6 +24885,7 @@ arm_init_machine_status (void)
#if ARM_FT_UNKNOWN != 0 #if ARM_FT_UNKNOWN != 0
machine->func_type = ARM_FT_UNKNOWN; machine->func_type = ARM_FT_UNKNOWN;
#endif #endif
machine->static_chain_stack_bytes = -1;
return machine; return machine;
} }
......
...@@ -1384,6 +1384,9 @@ typedef struct GTY(()) machine_function ...@@ -1384,6 +1384,9 @@ typedef struct GTY(()) machine_function
machine_mode thumb1_cc_mode; machine_mode thumb1_cc_mode;
/* Set to 1 after arm_reorg has started. */ /* Set to 1 after arm_reorg has started. */
int after_arm_reorg; int after_arm_reorg;
/* The number of bytes used to store the static chain register on the
stack, above the stack frame. */
int static_chain_stack_bytes;
} }
machine_function; machine_function;
#endif #endif
......
2018-03-22 Sudakshina Das <sudi.das@arm.com>
PR target/84826
* gcc.target/arm/pr84826.c: New test.
2018-03-22 Christophe Lyon <christophe.lyon@linaro.org> 2018-03-22 Christophe Lyon <christophe.lyon@linaro.org>
* gcc.target/arm/addr-modes-float.c: Move dg-do before * gcc.target/arm/addr-modes-float.c: Move dg-do before
......
/* { dg-do compile } */
/* { dg-options "-Ofast -fstack-clash-protection" } */
void d (void *);
void a ()
{
int b;
void bar (int c)
{
if (__builtin_expect (c, 0))
++b;
}
d (bar);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment