[llvm] r283086 - [PowerPC] Account for the ELFv2 function prologue during branch selection

Eric Christopher via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 20 18:46:08 PDT 2016


Hrm. Would it make sense to have the code in EmitFunctionBodyStart emit
instructions into the first basic block instead? (Will that work here?)

Just thinking out loud.

-eric

On Sun, Oct 2, 2016 at 9:15 PM Hal Finkel via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: hfinkel
> Date: Sun Oct  2 23:06:44 2016
> New Revision: 283086
>
> URL: http://llvm.org/viewvc/llvm-project?rev=283086&view=rev
> Log:
> [PowerPC] Account for the ELFv2 function prologue during branch selection
>
> The PPC branch-selection pass, which performs branch relaxation, needs to
> account for the padding that might be introduced to satisfy block alignment
> requirements. We were assuming that the first block was at offset zero
> (i.e.
> had the alignment of the function itself), but under the ELFv2 ABI, a
> global
> entry function prologue is added to the first block, and it is a
> two-instruction sequence (i.e. eight-bytes long). If the function has
> 16-byte
> alignment, the fact that the first block is eight bytes offset from the
> start
> of the function is relevant to calculating where padding will be added in
> between later blocks.
>
> Unfortunately, I don't have a small test case.
>
> Modified:
>     llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp
>     llvm/trunk/lib/Target/PowerPC/PPCBranchSelector.cpp
>
> Modified: llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp?rev=283086&r1=283085&r2=283086&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp (original)
> +++ llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp Sun Oct  2 23:06:44
> 2016
> @@ -1199,6 +1199,9 @@ void PPCLinuxAsmPrinter::EmitFunctionBod
>    if (Subtarget->isELFv2ABI()
>        // Only do all that if the function uses r2 in the first place.
>        && !MF->getRegInfo().use_empty(PPC::X2)) {
> +    // Note: The logic here must be synchronized with the code in the
> +    // branch-selection pass which sets the offset of the first block in
> the
> +    // function. This matters because it affects the alignment.
>      const PPCFunctionInfo *PPCFI = MF->getInfo<PPCFunctionInfo>();
>
>      MCSymbol *GlobalEntryLabel = PPCFI->getGlobalEPSymbol();
>
> Modified: llvm/trunk/lib/Target/PowerPC/PPCBranchSelector.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCBranchSelector.cpp?rev=283086&r1=283085&r2=283086&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/PowerPC/PPCBranchSelector.cpp (original)
> +++ llvm/trunk/lib/Target/PowerPC/PPCBranchSelector.cpp Sun Oct  2
> 23:06:44 2016
> @@ -19,8 +19,10 @@
>  #include "MCTargetDesc/PPCPredicates.h"
>  #include "PPCInstrBuilder.h"
>  #include "PPCInstrInfo.h"
> +#include "PPCSubtarget.h"
>  #include "llvm/ADT/Statistic.h"
>  #include "llvm/CodeGen/MachineFunctionPass.h"
> +#include "llvm/CodeGen/MachineRegisterInfo.h"
>  #include "llvm/Support/MathExtras.h"
>  #include "llvm/Target/TargetMachine.h"
>  #include "llvm/Target/TargetSubtargetInfo.h"
> @@ -92,8 +94,19 @@ bool PPCBSel::runOnMachineFunction(Machi
>      return AlignAmt + OffsetToAlignment(Offset, AlignAmt);
>    };
>
> +  // We need to be careful about the offset of the first block in the
> function
> +  // because it might not have the function's alignment. This happens
> because,
> +  // under the ELFv2 ABI, for functions which require a TOC pointer, we
> add a
> +  // two-instruction sequence to the start of the function.
> +  // Note: This needs to be synchronized with the check in
> +  // PPCLinuxAsmPrinter::EmitFunctionBodyStart.
> +  unsigned InitialOffset = 0;
> +  if (Fn.getSubtarget<PPCSubtarget>().isELFv2ABI() &&
> +      !Fn.getRegInfo().use_empty(PPC::X2))
> +    InitialOffset = 8;
> +
>    // Measure each MBB and compute a size for the entire function.
> -  unsigned FuncSize = 0;
> +  unsigned FuncSize = InitialOffset;
>    for (MachineFunction::iterator MFI = Fn.begin(), E = Fn.end(); MFI != E;
>         ++MFI) {
>      MachineBasicBlock *MBB = &*MFI;
> @@ -240,7 +253,7 @@ bool PPCBSel::runOnMachineFunction(Machi
>      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;
> +      unsigned Offset = InitialOffset;
>        for (MachineFunction::iterator MFI = Fn.begin(), E = Fn.end(); MFI
> != E;
>             ++MFI) {
>          MachineBasicBlock *MBB = &*MFI;
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161021/a8fade6b/attachment.html>


More information about the llvm-commits mailing list