aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2017-06-22 11:18:05 -0600
committerJeff Law <law@gcc.gnu.org>2017-06-22 11:18:05 -0600
commit13f752b27354d0b8f7ff0148973c6b478e6fdd9e (patch)
tree841bad594e9fbf349cfea73458cb14f5715fcc10
parent47f68dc2318a708b375768a09ae42833109e0bce (diff)
downloadgcc-13f752b27354d0b8f7ff0148973c6b478e6fdd9e.zip
gcc-13f752b27354d0b8f7ff0148973c6b478e6fdd9e.tar.gz
gcc-13f752b27354d0b8f7ff0148973c6b478e6fdd9e.tar.bz2
aarch64.c (aarch64_emit_probe_stack_range): Handle frame sizes that do not satisfy aarch64_uimm12_shift.
* config/aarch64/aarch64.c (aarch64_emit_probe_stack_range): Handle frame sizes that do not satisfy aarch64_uimm12_shift. * gcc.c-torture/compile/stack-check-1.c: New test. From-SVN: r249566
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/aarch64/aarch64.c18
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/stack-check-1.c2
4 files changed, 24 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0a3426e..03a824f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2017-06-22 Jeff Law <law@redhat.com>
+
+ * config/aarch64/aarch64.c (aarch64_emit_probe_stack_range): Handle
+ frame sizes that do not satisfy aarch64_uimm12_shift.
+
2017-06-22 Jan Hubicka <hubicka@ucw.cz>
* profile-count.h (apply_probability,
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 3364a02..95592f9 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -2766,11 +2766,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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 641e412..e162386 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2017-06-22 Jeff Law <law@redhat.com>
+
+ * gcc.c-torture/compile/stack-check-1.c: New test.
+
2016-06-22 Richard Biener <rguenther@suse.de>
* gcc.dg/vect/pr65947-1.c: Remove xfail.
diff --git a/gcc/testsuite/gcc.c-torture/compile/stack-check-1.c b/gcc/testsuite/gcc.c-torture/compile/stack-check-1.c
new file mode 100644
index 0000000..4058eb5
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/stack-check-1.c
@@ -0,0 +1,2 @@
+/* { dg-additional-options "-fstack-check" } */
+#include "20031023-1.c"