On Fri, Mar 7, 2014 at 2:33 PM, Wei Mi <w...@google.com> wrote: > Yes, x32 has the same problem. It should be tested. Fixed. > > Thanks, > Wei. > > > On Fri, Mar 7, 2014 at 2:06 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >> On Fri, Mar 7, 2014 at 1:26 PM, Wei Mi <w...@google.com> wrote: >>> Hi, >>> >>> This patch is to fix the problem described here: >>> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58066 >>> >>> I follow Ian's suggestion and set >>> ix86_tls_descriptor_calls_expanded_in_cfun in >>> tls_global_dynamic_64_<mode> and tls_local_dynamic_base_64_<mode>. >>> Although 32bit doesn't have the problem, >>> ix86_tls_descriptor_calls_expanded_in_cfun is also set for >>> tls_global_dynamic_32 and tls_local_dynamic_base_32 to make >>> ix86_tls_descriptor_calls_expanded_in_cfun setting consistent across >>> 32bits and 64bits. >>> >>> If ix86_current_function_calls_tls_descriptor is set, we know that >>> there is tls expanded call in current function. Update >>> crtl->preferred_stack_boundary and crtl->stack_alignment_needed to be >>> no less than PREFERED_STACK_ALIGNMENT at the start of >>> ix86_compute_frame_layout. We don't do the update in >>> legitimize_tls_address in cfgexpand stage, which is too early because >>> according to the comments before >>> ix86_current_function_calls_tls_descriptor, tls call may be optimized >>> away. ix86_compute_frame_layout is the latest place to do the update. >>> >>> bootstrap on x86_64-linux-gnu is ok. regression test is going on. Ok >>> for trunk if tests pass? >>> >>> Thanks, >>> Wei. >>> >>> gcc/ChangeLog: >>> >>> 2014-03-07 Wei Mi <w...@google.com> >>> >>> * config/i386/i386.c (ix86_compute_frame_layout): Update >>> preferred_stack_boundary when there is tls expanded call. >>> * config/i386/i386.md: Set >>> ix86_tls_descriptor_calls_expanded_in_cfun. >>> >>> gcc/testsuite/ChangeLog: >>> >>> 2014-03-07 Wei Mi <w...@google.com> >>> >>> * g++.dg/pr58066.C: New test. >>> >>> >>> Index: gcc/config/i386/i386.c >>> =================================================================== >>> --- gcc/config/i386/i386.c (revision 208410) >>> +++ gcc/config/i386/i386.c (working copy) >>> @@ -9504,6 +9504,19 @@ ix86_compute_frame_layout (struct ix86_f >>> crtl->preferred_stack_boundary = 128; >>> crtl->stack_alignment_needed = 128; >>> } >>> + /* For 64-bit target, 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 (TARGET_64BIT >>> + && 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; >>> + } >>>
There are several problems with this: 1. It doesn't work with C. 2. IA32 has the same issue and isn't fixed. 3. There is no testcase for global dynamic model. -- H.J.