r228253 - [PowerPC] Revert workaround for TLS linker bug

Hal Finkel hfinkel at anl.gov
Fri Feb 6 10:07:27 PST 2015


----- Original Message -----
> From: "Bill Schmidt" <wschmidt at linux.vnet.ibm.com>
> To: "Chandler Carruth" <chandlerc at google.com>
> Cc: "llvm cfe" <cfe-commits at cs.uiuc.edu>, "Hal Finkel" <hfinkel at anl.gov>
> Sent: Thursday, February 5, 2015 7:19:21 PM
> Subject: Re: r228253 - [PowerPC] Revert workaround for TLS linker bug
> 
> On Thu, 2015-02-05 at 19:13 -0600, Bill Schmidt wrote:
> > On Thu, 2015-02-05 at 18:52 -0600, Bill Schmidt wrote:
> > > On Wed, 2015-02-04 at 18:30 -0800, Chandler Carruth wrote:
> > > > 
> > > > On Wed, Feb 4, 2015 at 5:12 PM, Bill Schmidt
> > > > <wschmidt at linux.vnet.ibm.com> wrote:
> > > >         Author: wschmidt
> > > >         Date: Wed Feb  4 19:12:24 2015
> > > >         New Revision: 228253
> > > >         
> > > >         URL:
> > > >         http://llvm.org/viewvc/llvm-project?rev=228253&view=rev
> > > >         Log:
> > > >         [PowerPC] Revert workaround for TLS linker bug
> > > >         
> > > >         In r227480, Ulrich Weigand introduced a workaround for
> > > >         a
> > > >         linker
> > > >         optimization bug that can create mis-optimized code for
> > > >         accesses to
> > > >         general-dynamic or local-dynamic TLS variables.  The
> > > >         linker
> > > >         optimization bug only occurred for Clang/LLVM because
> > > >         of some
> > > >         inefficient code being generated for these TLS
> > > >         accesses.  I
> > > >         have
> > > >         recently corrected LLVM to produce the efficient code
> > > >         sequence
> > > >         expected by the linkers, so this workaround is no
> > > >         longer
> > > >         needed.
> > > >         Therefore this patch reverts r227480.
> > > >         
> > > >         I've tested that the previous bootstrap failure no
> > > >         longer
> > > >         occurs with
> > > >         the workaround reverted.
> > > > 
> > > > This is awesome Bill, thanks again for tackling all of this.
> > > 
> > > Well, unfortunately it isn't going to stick. :(
> > > 
> > > A bootstrap with -O3 still fails, and there is a further,
> > > different, and
> > > more horrible linker optimization error to blame.  I'm going to
> > > re-disable the linker optimizations for now.  I'm unwilling to
> > > handcuff
> > > the compiler as much as would be required to let the linker
> > > optimization
> > > operate in its present state.
> > 
> > Correction: Still too soon to blame the linker here.  My eyes were
> > playing tricks on me.  Will take a fresh look at the cause of the
> > bootstrap error in the morning.
> 
> And as soon as I press Send, I see it.  I was looking at the wrong
> destructor this time.
> 
> Essentially what happens is this:  I have a new pass that forces a
> register copy of the __tls_get_call parameter into GPR3.  In this
> case
> RA is apparently unable to coalesce the copy away, which leaves the
> addi
> targeting a non-GPR3 register again.  So the known linker
> optimization
> bug kicks in.
> 
> I will have to require def-use chains for the new pass so that I can
> perform direct operand replacement instead of using register copies.
> Will have a look at this tomorrow.

I think there is an easy way to do this: Create a register class that contains only PPC::X3. Schedule your pass to run prior to register allocation, and call MRI.constrainRegClass on the virtual registers feeding the relevant instructions so that they'll need to use that register.

 -Hal

> 
> Bill
> 
> > 
> > Bill
> > 
> > > 
> > > Details to follow.
> > > 
> > > Bill
> > 
> 
> 
> 

-- 
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory



More information about the cfe-commits mailing list