[PATCH] D51348: CodeGen: Make computeRegisterLiveness consider successors

Mikael Holmén via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 24 07:21:32 PDT 2018


uabelho added inline comments.


================
Comment at: lib/CodeGen/MachineBasicBlock.cpp:1446
+    for (MachineBasicBlock *S : successors()) {
+      for (MCSubRegIterator SubReg(Reg, TRI, /*IncludeSelf*/true);
+           SubReg.isValid(); ++SubReg) {
----------------
arsenm wrote:
> uabelho wrote:
> > uabelho wrote:
> > > MatzeB wrote:
> > > > arsenm wrote:
> > > > > uabelho wrote:
> > > > > > In the already existing loop in this function when we check live-ins, we use MCRegAliasIterator rather than MCSubRegIterator. Why not do the same here?
> > > > > > 
> > > > > > We are using computeRegisterLiveness in my out-of-tree target, and after D51350 we've found a case that goes wrong since this MCSubRegIterator loop decides that the register is dead, while the other loop thought that is was live (which it is).
> > > > > > 
> > > > > > In the case it fails we're interested in register $a0_32 (which consists of $a0h, $a0h and $a0l) and then we find that $a10h (which consists of $a0h and $a1h) is livein, but this new loop then determines that $a0_32 is dead.
> > > > > > 
> > > > > > So with MCSubRegIterator I think it might draw the wrong conclusions in cases where Reg and liveins are overlapping but neither is subregister of the other.
> > > > > I'm not really sure what the difference is between these. MCRegAliasIterator visits sub and super registers vs. just subregisters?
> > > > `MCRegAliasIterator` iterates through subregs, superregs and aliased registers. (Aliased registers are used pretty much nowhere in LLVM... I think last time I looked I only found a single target unnecessarily using them which made me wonder whether we couldn't just drop the whole concept. Anyway today aliased registers are a thing).
> > > > 
> > > > How about changing this loop to:
> > > > ```
> > > > for (const MachineBasicBlock::RegisterMaskPair &LI : Succ->liveins()) {
> > > >   if (TRI->regsOverlap(LI.PhysReg, Reg)
> > > >     return LQR_Live;
> > > > }
> > > > ```
> > > Yep using overlap seems to work too since it catches my cases like $a0_32 vs $a10h that the original loop misses.
> > > 
> > > (Btw if I grep for MCRegAliasIterator in lib/Target I get 24 hits so it doesn't seem to be totally unused. I've no idea if those 24 uses are pointless and could easily be switched into something else though.)
> > Ok, so what do we do with this? Should I create a patch where we use overlap in both loops? Like:
> > 
> > 
> > ```
> > @ -1402,13 +1402,12 @@ MachineBasicBlock::computeRegisterLiveness(const TargetRegisterInfo *TRI,
> >  
> >    // If we reached the end, it is safe to clobber Reg at the end of a block of
> >    // no successor has it live in.
> >    if (I == end()) {
> >      for (MachineBasicBlock *S : successors()) {
> > -      for (MCSubRegIterator SubReg(Reg, TRI, /*IncludeSelf*/true);
> > -           SubReg.isValid(); ++SubReg) {
> > -        if (S->isLiveIn(*SubReg))
> > +      for (const MachineBasicBlock::RegisterMaskPair &LI : S->liveins()) {
> > +        if (TRI->regsOverlap(LI.PhysReg, Reg))
> >            return LQR_Live;
> >        }
> >      }
> >  
> >      return LQR_Dead;
> > @@ -1458,13 +1457,12 @@ MachineBasicBlock::computeRegisterLiveness(const TargetRegisterInfo *TRI,
> >    }
> >  
> >    // Did we get to the start of the block?
> >    if (I == begin()) {
> >      // If so, the register's state is definitely defined by the live-in state.
> > -    for (MCRegAliasIterator RAI(Reg, TRI, /*IncludeSelf=*/true); RAI.isValid();
> > -         ++RAI)
> > -      if (isLiveIn(*RAI))
> > +    for (const MachineBasicBlock::RegisterMaskPair &LI : liveins())
> > +      if (TRI->regsOverlap(LI.PhysReg, Reg))
> >          return LQR_Live;
> >  
> >      return LQR_Dead;
> >    }
> > ```
> > ?
> This looks right to me. I think it might be possible to construct an AMDGPU testcase where VCC_LO or VCC_HI is defined and VCC is the live out
I created https://reviews.llvm.org/D52410 where I use regsOverlap instead of the MCSubRegIterator/MCRegAliasIterator loops. Let's continue there.


https://reviews.llvm.org/D51348





More information about the llvm-commits mailing list