Commit 9b17a646 by Richard Sandiford Committed by Richard Sandiford

[AArch64] Improve poly_int handling in aarch64_layout_frame

I'd used known_lt when converting these conditions to poly_int,
but on reflection that was a bad choice.  The code isn't just
doing a range check; it specifically needs constants that will
fit in a certain encoding.

2019-10-16  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
	* config/aarch64/aarch64.c (aarch64_layout_frame): Use is_constant
	rather than known_lt when choosing frame layouts.

From-SVN: r277061
parent 8e66b377
2019-10-16 Richard Sandiford <richard.sandiford@arm.com> 2019-10-16 Richard Sandiford <richard.sandiford@arm.com>
* config/aarch64/aarch64.c (aarch64_layout_frame): Use is_constant
rather than known_lt when choosing frame layouts.
2019-10-16 Richard Sandiford <richard.sandiford@arm.com>
* config/aarch64/aarch64.c (aarch64_layout_frame): Assert * config/aarch64/aarch64.c (aarch64_layout_frame): Assert
that all the adjustments add up to the full frame size. that all the adjustments add up to the full frame size.
Use crtl->outgoing_args_size directly as the final adjustment Use crtl->outgoing_args_size directly as the final adjustment
......
...@@ -5447,7 +5447,7 @@ aarch64_layout_frame (void) ...@@ -5447,7 +5447,7 @@ aarch64_layout_frame (void)
else if (frame.wb_candidate1 != INVALID_REGNUM) else if (frame.wb_candidate1 != INVALID_REGNUM)
max_push_offset = 256; max_push_offset = 256;
HOST_WIDE_INT const_size, const_fp_offset; HOST_WIDE_INT const_size, const_outgoing_args_size, const_fp_offset;
if (frame.frame_size.is_constant (&const_size) if (frame.frame_size.is_constant (&const_size)
&& const_size < max_push_offset && const_size < max_push_offset
&& known_eq (crtl->outgoing_args_size, 0)) && known_eq (crtl->outgoing_args_size, 0))
...@@ -5457,16 +5457,18 @@ aarch64_layout_frame (void) ...@@ -5457,16 +5457,18 @@ aarch64_layout_frame (void)
stp reg3, reg4, [sp, 16] */ stp reg3, reg4, [sp, 16] */
frame.callee_adjust = const_size; frame.callee_adjust = const_size;
} }
else if (known_lt (crtl->outgoing_args_size + frame.saved_regs_size, 512) else if (crtl->outgoing_args_size.is_constant (&const_outgoing_args_size)
&& const_outgoing_args_size + frame.saved_regs_size < 512
&& !(cfun->calls_alloca && !(cfun->calls_alloca
&& known_lt (frame.hard_fp_offset, max_push_offset))) && frame.hard_fp_offset.is_constant (&const_fp_offset)
&& const_fp_offset < max_push_offset))
{ {
/* Frame with small outgoing arguments: /* Frame with small outgoing arguments:
sub sp, sp, frame_size sub sp, sp, frame_size
stp reg1, reg2, [sp, outgoing_args_size] stp reg1, reg2, [sp, outgoing_args_size]
stp reg3, reg4, [sp, outgoing_args_size + 16] */ stp reg3, reg4, [sp, outgoing_args_size + 16] */
frame.initial_adjust = frame.frame_size; frame.initial_adjust = frame.frame_size;
frame.callee_offset = frame.frame_size - frame.hard_fp_offset; frame.callee_offset = const_outgoing_args_size;
} }
else if (frame.hard_fp_offset.is_constant (&const_fp_offset) else if (frame.hard_fp_offset.is_constant (&const_fp_offset)
&& const_fp_offset < max_push_offset) && const_fp_offset < max_push_offset)
......
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