]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/69140 (stack alignment + O1 breaks with Microsoft ABI)
authorUros Bizjak <ubizjak@gmail.com>
Wed, 6 Jan 2016 20:19:04 +0000 (21:19 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Wed, 6 Jan 2016 20:19:04 +0000 (21:19 +0100)
PR target/69140
* config/i386/i386.c (ix86_expand_prologue): Declare fs.sp_valid
depending on frame_pointer_needed before remaining integer and SSE
registers are saved.

testsuite/ChangeLog:

PR target/69140
* gcc.target/i386/pr69140.c: New test

From-SVN: r232111

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr69140.c [new file with mode: 0644]

index eaae4ec69e15fd9f490e08ffc58fc8f57cdfa23a..c807433b0927c21b4e9602150cc41fa141bd015e 100644 (file)
@@ -1,3 +1,10 @@
+2016-01-06  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/69140
+       * config/i386/i386.c (ix86_expand_prologue): Declare fs.sp_valid
+       depending on frame_pointer_needed before remaining integer and SSE
+       registers are saved.
+
 2015-01-06  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        * config/rs6000/vsx.md (*p9_vecload_<mode>): Replace VSX_M
index c6c66c77fb53cee0919e0192985af31a210bb852..9c3fa70b752cd87a6e49b6facc8f0b2a2a281dbf 100644 (file)
@@ -13065,6 +13065,8 @@ ix86_expand_prologue (void)
       m->fs.fp_valid = true;
     }
 
+  m->fs.sp_valid = !frame_pointer_needed;
+
   if (!int_registers_saved)
     ix86_emit_save_regs_using_mov (frame.reg_save_offset);
   if (!sse_registers_saved)
index e3a742a27833cc7d22e2a8e7800578db72596263..5ca10b3d0064420347f0bbe15d60b142533e794a 100644 (file)
@@ -1,3 +1,8 @@
+2016-01-06  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/69140
+       * gcc.target/i386/pr69140.c: New test
+
 2016-01-06  David Malcolm  <dmalcolm@redhat.com>
 
        * gcc.dg/bad-dereference.c: New test case.
diff --git a/gcc/testsuite/gcc.target/i386/pr69140.c b/gcc/testsuite/gcc.target/i386/pr69140.c
new file mode 100644 (file)
index 0000000..2c345dd
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do compile { target lp64 } } */
+/* { dg-options "-O2 -mincoming-stack-boundary=3" } */
+
+typedef struct {
+  unsigned int buf[4];
+  unsigned char in[64];
+} MD4_CTX;
+
+static void
+MD4Transform (unsigned int buf[4], const unsigned int in[16])
+{
+  unsigned int a, b, c, d;
+  (b) += ((((c)) & ((d))) | ((~(c)) & ((a)))) + (in[7]);
+  (a) += ((((b)) & ((c))) | ((~(b)) & ((d)))) + (in[8]);
+  (d) += ((((a)) & ((b))) | ((~(a)) & ((c)))) + (in[9]);
+  buf[3] += d;
+}
+
+void __attribute__((ms_abi))
+MD4Update (MD4_CTX *ctx, const unsigned char *buf)
+{
+  MD4Transform( ctx->buf, (unsigned int *)ctx->in);
+  MD4Transform( ctx->buf, (unsigned int *)ctx->in);
+}