aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorH.J. Lu <hongjiu.lu@intel.com>2016-01-26 12:51:07 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2016-01-26 04:51:07 -0800
commit81cd202e24b322ba4c592a4b99a6e773238c5b27 (patch)
treefa7b4b418220de8b60dd909b74160d583d3590be /gcc
parent213a1c03ba60322661bff886b17961e0db0563dd (diff)
downloadgcc-81cd202e24b322ba4c592a4b99a6e773238c5b27.zip
gcc-81cd202e24b322ba4c592a4b99a6e773238c5b27.tar.gz
gcc-81cd202e24b322ba4c592a4b99a6e773238c5b27.tar.bz2
Update stack alignment in ix86_update_stack_boundary
Stack alignment adjustment for __tls_get_addr should be done in ix86_update_stack_boundary, not ix86_compute_frame_layout. Also there is no need to over-align stack for __tls_get_addr and function with __tls_get_addr call isn't a leaf function. gcc/ PR target/68986 * config/i386/i386.c (ix86_compute_frame_layout): Move stack alignment adjustment to ... (ix86_update_stack_boundary): Here. Don't over-align stack for __tls_get_addr. (ix86_finalize_stack_realign_flags): Use stack_alignment_needed if __tls_get_addr is called. gcc/testsuite/ PR target/68986 * gcc.target/i386/pr68986-1.c: New test. * gcc.target/i386/pr68986-2.c: Likewise. * gcc.target/i386/pr68986-3.c: Likewise. From-SVN: r232825
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/i386/i386.c30
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.target/i386/pr68986-1.c11
-rw-r--r--gcc/testsuite/gcc.target/i386/pr68986-2.c13
-rw-r--r--gcc/testsuite/gcc.target/i386/pr68986-3.c13
6 files changed, 68 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 800b75c..28cb00c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2016-01-26 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR target/68986
+ * config/i386/i386.c (ix86_compute_frame_layout): Move stack
+ alignment adjustment to ...
+ (ix86_update_stack_boundary): Here. Don't over-align stack for
+ __tls_get_addr.
+ (ix86_finalize_stack_realign_flags): Use stack_alignment_needed
+ if __tls_get_addr is called.
+
2016-01-26 Christian Bruel <christian.bruel@st.com>
* doc/sourcebuild.texi (arm_crypto_pragma_ok): Remove.
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 34b57a4..cfbdf0f 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -11360,18 +11360,6 @@ ix86_compute_frame_layout (struct ix86_frame *frame)
crtl->preferred_stack_boundary = 128;
crtl->stack_alignment_needed = 128;
}
- /* preferred_stack_boundary is never updated for call
- expanded from tls descriptor. Update it here. We don't update it in
- expand stage because according to the comments before
- ix86_current_function_calls_tls_descriptor, tls calls may be optimized
- away. */
- else if (ix86_current_function_calls_tls_descriptor
- && crtl->preferred_stack_boundary < PREFERRED_STACK_BOUNDARY)
- {
- crtl->preferred_stack_boundary = PREFERRED_STACK_BOUNDARY;
- if (crtl->stack_alignment_needed < PREFERRED_STACK_BOUNDARY)
- crtl->stack_alignment_needed = PREFERRED_STACK_BOUNDARY;
- }
stack_alignment_needed = crtl->stack_alignment_needed / BITS_PER_UNIT;
preferred_alignment = crtl->preferred_stack_boundary / BITS_PER_UNIT;
@@ -12043,6 +12031,15 @@ ix86_update_stack_boundary (void)
&& cfun->stdarg
&& crtl->stack_alignment_estimated < 128)
crtl->stack_alignment_estimated = 128;
+
+ /* __tls_get_addr needs to be called with 16-byte aligned stack. */
+ if (ix86_tls_descriptor_calls_expanded_in_cfun
+ && crtl->preferred_stack_boundary < 128)
+ {
+ crtl->preferred_stack_boundary = 128;
+ if (crtl->stack_alignment_needed < 128)
+ crtl->stack_alignment_needed = 128;
+ }
}
/* Handle the TARGET_GET_DRAP_RTX hook. Return NULL if no DRAP is
@@ -12505,10 +12502,11 @@ ix86_finalize_stack_realign_flags (void)
unsigned int incoming_stack_boundary
= (crtl->parm_stack_boundary > ix86_incoming_stack_boundary
? crtl->parm_stack_boundary : ix86_incoming_stack_boundary);
- unsigned int stack_realign = (incoming_stack_boundary
- < (crtl->is_leaf
- ? crtl->max_used_stack_slot_alignment
- : crtl->stack_alignment_needed));
+ unsigned int stack_realign
+ = (incoming_stack_boundary
+ < (crtl->is_leaf && !ix86_current_function_calls_tls_descriptor
+ ? crtl->max_used_stack_slot_alignment
+ : crtl->stack_alignment_needed));
if (crtl->stack_realign_finalized)
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 040a2f8..ebee72c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2016-01-26 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR target/68986
+ * gcc.target/i386/pr68986-1.c: New test.
+ * gcc.target/i386/pr68986-2.c: Likewise.
+ * gcc.target/i386/pr68986-3.c: Likewise.
+
2016-01-26 Christian Bruel <christian.bruel@st.com>
* lib/target-supports.exp
diff --git a/gcc/testsuite/gcc.target/i386/pr68986-1.c b/gcc/testsuite/gcc.target/i386/pr68986-1.c
new file mode 100644
index 0000000..998f34f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr68986-1.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target tls_native } */
+/* { dg-require-effective-target fpic } */
+/* { dg-options "-fPIC -mno-accumulate-outgoing-args -mpreferred-stack-boundary=5 -mincoming-stack-boundary=4" } */
+
+extern __thread int msgdata;
+int
+foo ()
+{
+ return msgdata;
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr68986-2.c b/gcc/testsuite/gcc.target/i386/pr68986-2.c
new file mode 100644
index 0000000..23f9a52
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr68986-2.c
@@ -0,0 +1,13 @@
+/* { dg-do compile { target ia32 } } */
+/* { dg-require-effective-target tls_native } */
+/* { dg-require-effective-target fpic } */
+/* { dg-options "-fPIC -mno-accumulate-outgoing-args -mpreferred-stack-boundary=2 -m32" } */
+
+extern __thread int msgdata;
+int
+foo ()
+{
+ return msgdata;
+}
+
+/* { dg-final { scan-assembler "andl\[\\t \]*\\$-16,\[\\t \]*%esp" } } */
diff --git a/gcc/testsuite/gcc.target/i386/pr68986-3.c b/gcc/testsuite/gcc.target/i386/pr68986-3.c
new file mode 100644
index 0000000..5744cf2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr68986-3.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target tls_native } */
+/* { dg-require-effective-target fpic } */
+/* { dg-options "-fPIC -mno-sse -mpreferred-stack-boundary=3 -mincoming-stack-boundary=3" } */
+
+extern __thread int msgdata;
+int
+foo ()
+{
+ return msgdata;
+}
+
+/* { dg-final { scan-assembler "and\[lq\]\[\\t \]*\\$-16,\[\\t \]*%\[re\]?sp" } } */