]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
i386: Don't convert stack operations to pushes if using a redzone.
authorBernd Schmidt <bernds@redhat.com>
Fri, 15 Apr 2016 13:35:12 +0000 (13:35 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Fri, 15 Apr 2016 13:35:12 +0000 (13:35 +0000)
* config/i386/i386-protos.h (ix86_using_red_zone): Declare.
* config/i386/i386.c (ix86_using_red_zone): No longer static.
* config/i386/i386.md (stack decrement to push peepholes): Guard
with !x86_using_red_zone ().

testsuite/
* gcc.target/i386/pr46470.c: Add -mno-red-zone to dg-options for
x86_64.

From-SVN: r235028

gcc/ChangeLog
gcc/config/i386/i386-protos.h
gcc/config/i386/i386.c
gcc/config/i386/i386.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr46470.c

index 4a63e32d49a842c3801d335343794121cca3a9f2..92e2a83182c5ad93ff4c598b430f092e38a69d87 100644 (file)
@@ -1,3 +1,10 @@
+2016-04-15  Bernd Schmidt  <bschmidt@redhat.com>
+
+       * config/i386/i386-protos.h (ix86_using_red_zone): Declare.
+       * config/i386/i386.c (ix86_using_red_zone): No longer static.
+       * config/i386/i386.md (stack decrement to push peepholes): Guard
+       with !x86_using_red_zone ().
+
 2016-04-15  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/70675
index e4652f37ea618855e851e44afe8035b94d7b7f6f..ff47bc15600dafdd08c237c785d634e7d7c2c3ec 100644 (file)
@@ -44,6 +44,8 @@ extern bool ix86_use_pseudo_pic_reg (void);
 
 extern void ix86_reset_previous_fndecl (void);
 
+extern bool ix86_using_red_zone (void);
+
 #ifdef RTX_CODE
 extern int standard_80387_constant_p (rtx);
 extern const char *standard_80387_constant_opcode (rtx);
index 1fa007efdc3f8bd8e4db31b891e9cd1f9d570381..3d044e8bd685d5cd534b170ffa1bf34f32995886 100644 (file)
@@ -3709,7 +3709,7 @@ make_pass_stv (gcc::context *ctxt)
 
 /* Return true if a red-zone is in use.  */
 
-static inline bool
+bool
 ix86_using_red_zone (void)
 {
   return TARGET_RED_ZONE && !TARGET_64BIT_MS_ABI;
index 56a30502d41feb06f370a87dd14865866d21f3c0..cf29e5d39d562d812283471d88b4db2c7588c806 100644 (file)
              (clobber (reg:CC FLAGS_REG))
              (clobber (mem:BLK (scratch)))])]
   "(TARGET_SINGLE_PUSH || optimize_insn_for_size_p ())
-   && INTVAL (operands[0]) == -GET_MODE_SIZE (word_mode)"
+   && INTVAL (operands[0]) == -GET_MODE_SIZE (word_mode)
+   && !ix86_using_red_zone ()"
   [(clobber (match_dup 1))
    (parallel [(set (mem:W (pre_dec:P (reg:P SP_REG))) (match_dup 1))
              (clobber (mem:BLK (scratch)))])])
              (clobber (reg:CC FLAGS_REG))
              (clobber (mem:BLK (scratch)))])]
   "(TARGET_DOUBLE_PUSH || optimize_insn_for_size_p ())
-   && INTVAL (operands[0]) == -2*GET_MODE_SIZE (word_mode)"
+   && INTVAL (operands[0]) == -2*GET_MODE_SIZE (word_mode)
+   && !ix86_using_red_zone ()"
   [(clobber (match_dup 1))
    (set (mem:W (pre_dec:P (reg:P SP_REG))) (match_dup 1))
    (parallel [(set (mem:W (pre_dec:P (reg:P SP_REG))) (match_dup 1))
                           (match_operand:P 0 "const_int_operand")))
              (clobber (reg:CC FLAGS_REG))])]
   "(TARGET_SINGLE_PUSH || optimize_insn_for_size_p ())
-   && INTVAL (operands[0]) == -GET_MODE_SIZE (word_mode)"
+   && INTVAL (operands[0]) == -GET_MODE_SIZE (word_mode)
+   && !ix86_using_red_zone ()"
   [(clobber (match_dup 1))
    (set (mem:W (pre_dec:P (reg:P SP_REG))) (match_dup 1))])
 
                           (match_operand:P 0 "const_int_operand")))
              (clobber (reg:CC FLAGS_REG))])]
   "(TARGET_DOUBLE_PUSH || optimize_insn_for_size_p ())
-   && INTVAL (operands[0]) == -2*GET_MODE_SIZE (word_mode)"
+   && INTVAL (operands[0]) == -2*GET_MODE_SIZE (word_mode)
+   && !ix86_using_red_zone ()"
   [(clobber (match_dup 1))
    (set (mem:W (pre_dec:P (reg:P SP_REG))) (match_dup 1))
    (set (mem:W (pre_dec:P (reg:P SP_REG))) (match_dup 1))])
index 9b395d93e9a284392c9f8c19ae37eda5661bd5f3..61c8f1289786bee8b5abcf1ab07d69f79abfc5c7 100644 (file)
@@ -1,3 +1,8 @@
+2016-04-15  Bernd Schmidt  <bschmidt@redhat.com>
+
+       * gcc.target/i386/pr46470.c: Add -mno-red-zone to dg-options for
+       x86_64.
+
 2016-04-15  Marek Polacek  <polacek@redhat.com>
 
        PR c/70651
index 11eb51a039404c69aba1f4c02844eb1c02ec3c22..8d6b5ca5d5e98e17913d47c9f6bba5d14852dc33 100644 (file)
@@ -4,7 +4,7 @@
 /* These options are selected to ensure 1 word needs to be allocated
    on the stack to maintain alignment for the call.  This should be
    transformed to push+pop.  We also want to force unwind info updates.  */
-/* { dg-options "-Os -fomit-frame-pointer -fasynchronous-unwind-tables" } */
+/* { dg-options "-Os -fomit-frame-pointer -fasynchronous-unwind-tables -mno-red-zone" } */
 /* { dg-options "-Os -fomit-frame-pointer -mpreferred-stack-boundary=3 -fasynchronous-unwind-tables" { target ia32 } } */
 /* ms_abi has reserved stack-region.  */
 /* { dg-skip-if "" { x86_64-*-mingw* } { "*" } { "" } } */