From 9b17a646d90ad0cc30daf8432aa60ad0d751d914 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Wed, 16 Oct 2019 10:50:53 +0000 Subject: [PATCH] [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 gcc/ * config/aarch64/aarch64.c (aarch64_layout_frame): Use is_constant rather than known_lt when choosing frame layouts. From-SVN: r277061 --- gcc/ChangeLog | 5 +++++ gcc/config/aarch64/aarch64.c | 10 ++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4733dc4bfb8..c54f216a780 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2019-10-16 Richard Sandiford + + * config/aarch64/aarch64.c (aarch64_layout_frame): Use is_constant + rather than known_lt when choosing frame layouts. + 2019-10-16 Richard Sandiford * config/aarch64/aarch64.c (aarch64_layout_frame): Assert diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 03a9f3f2bbc..0537e7fe359 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -5447,7 +5447,7 @@ aarch64_layout_frame (void) else if (frame.wb_candidate1 != INVALID_REGNUM) 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) && const_size < max_push_offset && known_eq (crtl->outgoing_args_size, 0)) @@ -5457,16 +5457,18 @@ aarch64_layout_frame (void) stp reg3, reg4, [sp, 16] */ 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 - && 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: sub sp, sp, frame_size stp reg1, reg2, [sp, outgoing_args_size] stp reg3, reg4, [sp, outgoing_args_size + 16] */ 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) && const_fp_offset < max_push_offset) -- 2.30.2