[llvm] r280626 - [PowerPC] During branch relaxation, recompute padding offsets before each iteration

Hal Finkel via llvm-commits llvm-commits at lists.llvm.org
Sun Sep 4 07:28:50 PDT 2016


----- Original Message -----
> From: "Hal Finkel via llvm-commits" <llvm-commits at lists.llvm.org>
> To: llvm-commits at lists.llvm.org
> Sent: Sunday, September 4, 2016 9:18:29 AM
> Subject: [llvm] r280626 - [PowerPC] During branch relaxation, recompute padding offsets before each iteration
> 
> Author: hfinkel
> Date: Sun Sep  4 09:18:29 2016
> New Revision: 280626
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=280626&view=rev
> Log:
> [PowerPC] During branch relaxation, recompute padding offsets before
> each iteration
> 
> We used to compute the padding contributions to the block sizes
> during branch
> relaxation only at the start of the transformation. As we perform
> branch
> relaxation, we change the sizes of the blocks, and so the amount of
> inter-block
> padding might change. Accordingly, we need to recompute the
> (alignment-based)
> padding in between every iteration on our way toward the fixed point.
> 
> Unfortunately, I don't have a test case (and none was provided in the
> bug
> report), and while this obviously seems needed, algorithmically, I
> don't have
> any way of generating a small and/or non-fragile regression test.

I forgot to add: This should fix PR25031.

 -Hal

> 
> Modified:
>     llvm/trunk/lib/Target/PowerPC/PPCBranchSelector.cpp
> 
> Modified: llvm/trunk/lib/Target/PowerPC/PPCBranchSelector.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCBranchSelector.cpp?rev=280626&r1=280625&r2=280626&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/PPCBranchSelector.cpp (original)
> +++ llvm/trunk/lib/Target/PowerPC/PPCBranchSelector.cpp Sun Sep  4
> 09:18:29 2016
> @@ -41,8 +41,10 @@ namespace {
>        initializePPCBSelPass(*PassRegistry::getPassRegistry());
>      }
>  
> -    /// BlockSizes - The sizes of the basic blocks in the function.
> -    std::vector<unsigned> BlockSizes;
> +    // The sizes of the basic blocks in the function (the first
> +    // element of the pair); the second element of the pair is the
> amount of the
> +    // size that is due to potential padding.
> +    std::vector<std::pair<unsigned, unsigned>> BlockSizes;
>  
>      bool runOnMachineFunction(MachineFunction &Fn) override;
>  
> @@ -102,7 +104,11 @@ bool PPCBSel::runOnMachineFunction(Machi
>      // alignment requirement.
>      if (MBB->getNumber() > 0) {
>        unsigned AlignExtra = GetAlignmentAdjustment(*MBB, FuncSize);
> -      BlockSizes[MBB->getNumber()-1] += AlignExtra;
> +
> +      auto &BS = BlockSizes[MBB->getNumber()-1];
> +      BS.first += AlignExtra;
> +      BS.second = AlignExtra;
> +
>        FuncSize += AlignExtra;
>      }
>  
> @@ -110,7 +116,7 @@ bool PPCBSel::runOnMachineFunction(Machi
>      for (MachineInstr &MI : *MBB)
>        BlockSize += TII->getInstSizeInBytes(MI);
>  
> -    BlockSizes[MBB->getNumber()] = BlockSize;
> +    BlockSizes[MBB->getNumber()].first = BlockSize;
>      FuncSize += BlockSize;
>    }
>    
> @@ -169,14 +175,14 @@ bool PPCBSel::runOnMachineFunction(Machi
>            BranchSize = MBBStartOffset;
>            
>            for (unsigned i = Dest->getNumber(), e = MBB.getNumber();
>            i != e; ++i)
> -            BranchSize += BlockSizes[i];
> +            BranchSize += BlockSizes[i].first;
>          } else {
>            // Otherwise, add the size of the blocks between this
>            block and the
>            // dest to the number of bytes left in this block.
>            BranchSize = -MBBStartOffset;
>  
>            for (unsigned i = MBB.getNumber(), e = Dest->getNumber();
>            i != e; ++i)
> -            BranchSize += BlockSizes[i];
> +            BranchSize += BlockSizes[i].first;
>          }
>  
>          // If this branch is in range, ignore it.
> @@ -226,12 +232,38 @@ bool PPCBSel::runOnMachineFunction(Machi
>  
>          // Remember that this instruction is 8-bytes, increase the
>          size of the
>          // block by 4, remember to iterate.
> -        BlockSizes[MBB.getNumber()] += 4;
> +        BlockSizes[MBB.getNumber()].first += 4;
>          MBBStartOffset += 8;
>          ++NumExpanded;
>          MadeChange = true;
>        }
>      }
> +
> +    if (MadeChange) {
> +      // If we're going to iterate again, make sure we've updated
> our
> +      // padding-based contributions to the block sizes.
> +      unsigned Offset = 0;
> +      for (MachineFunction::iterator MFI = Fn.begin(), E = Fn.end();
> MFI != E;
> +           ++MFI) {
> +        MachineBasicBlock *MBB = &*MFI;
> +
> +        if (MBB->getNumber() > 0) {
> +          auto &BS = BlockSizes[MBB->getNumber()-1];
> +          BS.first -= BS.second;
> +          Offset -= BS.second;
> +
> +          unsigned AlignExtra = GetAlignmentAdjustment(*MBB,
> Offset);
> +
> +          BS.first += AlignExtra;
> +          BS.second = AlignExtra;
> +
> +          Offset += AlignExtra;
> +        }
> +
> +        Offset += BlockSizes[MBB->getNumber()].first;
> +      }
> +    }
> +
>      EverMadeChange |= MadeChange;
>    }
>    
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
> 

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


More information about the llvm-commits mailing list