[AArch64] Improve poly_int handling in aarch64_layout_frame
authorRichard Sandiford <richard.sandiford@arm.com>
Wed, 16 Oct 2019 10:50:53 +0000 (10:50 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Wed, 16 Oct 2019 10:50:53 +0000 (10:50 +0000)
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

gcc/ChangeLog
gcc/config/aarch64/aarch64.c

index 4733dc4bfb874731ce98656d254061785756b432..c54f216a78035f60c39d689271271529010712ce 100644 (file)
@@ -1,3 +1,8 @@
+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
index 03a9f3f2bbc1781289ab696cc6dbd44e25c7757d..0537e7fe3595c5be3057a10531ac0cd068972df8 100644 (file)
@@ -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)