This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH][RFA] Fix -fstack-check with really big frames on aarch64


On 22/06/17 16:01, Jeff Law wrote:
> This fixes a bug discovered when we were evaluating the current state of
> -fstack-check.  It ought to be able to go forward independent of the
> rest of the -fstack-check work.
> 
> The aarch64 specific code does not correctly handle large frames and
> will generate RTL with unrecognizable insns for such cases.  This is
> clearly visible if -fstack-check is enabled by default or if it were to
> be added to the torture flags in the testsuite.
> 
> I've tested this by bootstrapping and regression testing an aarch64
> compiler with -fstack-check on by default and hacks to force all
> allocations/probing of more than PROBE_INTERVAL bytes to go through this
> path.  It fixes a slew of testsuite failures (~80 for C and a few for
> Fortran and C++).
> 
> 
> One example is c-torture/compile/20031023-1.c which has a local frame of
> 0x10000000000 bytes.
> 
> OK for the trunk?
> 

OK.  But as Jakub says, a test would be nice.

R.

> Jeff
> 
> 
> 
> 
> 
> P
> 
> 
> 	* config/aarch64/aarch64.c (aarch64_emit_probe_stack_range): Handle
> 	frame sizes that do not satisfy aarch64_uimm12_shift.
> 
> diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
> index 04417dc..4f89457 100644
> --- a/gcc/config/aarch64/aarch64.c
> +++ b/gcc/config/aarch64/aarch64.c
> @@ -2722,11 +2722,19 @@ aarch64_emit_probe_stack_range (HOST_WIDE_INT first, HOST_WIDE_INT size)
>  		     plus_constant (Pmode, stack_pointer_rtx, -first));
>  
>        /* LAST_ADDR = SP + FIRST + ROUNDED_SIZE.  */
> -      emit_set_insn (reg2,
> -		     plus_constant (Pmode, stack_pointer_rtx,
> -				    -(first + rounded_size)));
> -
> -
> +      HOST_WIDE_INT adjustment = - (first + rounded_size);
> +      if (! aarch64_uimm12_shift (adjustment))
> +	{
> +	  aarch64_internal_mov_immediate (reg2, GEN_INT (adjustment),
> +					  true, Pmode);
> +	  emit_set_insn (reg2, gen_rtx_PLUS (Pmode, stack_pointer_rtx, reg2));
> +	}
> +      else
> +	{
> +	  emit_set_insn (reg2,
> +			 plus_constant (Pmode, stack_pointer_rtx, adjustment));
> +	}
> +	  	
>        /* Step 3: the loop
>  
>  	 do
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]