<div dir="ltr">Hrm. Would it make sense to have the code in EmitFunctionBodyStart emit instructions into the first basic block instead? (Will that work here?)<div><br></div><div>Just thinking out loud.</div><div><br></div><div>-eric</div></div><br><div class="gmail_quote"><div dir="ltr">On Sun, Oct 2, 2016 at 9:15 PM Hal Finkel via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: hfinkel<br class="gmail_msg">
Date: Sun Oct  2 23:06:44 2016<br class="gmail_msg">
New Revision: 283086<br class="gmail_msg">
<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=283086&view=rev" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project?rev=283086&view=rev</a><br class="gmail_msg">
Log:<br class="gmail_msg">
[PowerPC] Account for the ELFv2 function prologue during branch selection<br class="gmail_msg">
<br class="gmail_msg">
The PPC branch-selection pass, which performs branch relaxation, needs to<br class="gmail_msg">
account for the padding that might be introduced to satisfy block alignment<br class="gmail_msg">
requirements. We were assuming that the first block was at offset zero (i.e.<br class="gmail_msg">
had the alignment of the function itself), but under the ELFv2 ABI, a global<br class="gmail_msg">
entry function prologue is added to the first block, and it is a<br class="gmail_msg">
two-instruction sequence (i.e. eight-bytes long). If the function has 16-byte<br class="gmail_msg">
alignment, the fact that the first block is eight bytes offset from the start<br class="gmail_msg">
of the function is relevant to calculating where padding will be added in<br class="gmail_msg">
between later blocks.<br class="gmail_msg">
<br class="gmail_msg">
Unfortunately, I don't have a small test case.<br class="gmail_msg">
<br class="gmail_msg">
Modified:<br class="gmail_msg">
    llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp<br class="gmail_msg">
    llvm/trunk/lib/Target/PowerPC/PPCBranchSelector.cpp<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp?rev=283086&r1=283085&r2=283086&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp?rev=283086&r1=283085&r2=283086&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp (original)<br class="gmail_msg">
+++ llvm/trunk/lib/Target/PowerPC/PPCAsmPrinter.cpp Sun Oct  2 23:06:44 2016<br class="gmail_msg">
@@ -1199,6 +1199,9 @@ void PPCLinuxAsmPrinter::EmitFunctionBod<br class="gmail_msg">
   if (Subtarget->isELFv2ABI()<br class="gmail_msg">
       // Only do all that if the function uses r2 in the first place.<br class="gmail_msg">
       && !MF->getRegInfo().use_empty(PPC::X2)) {<br class="gmail_msg">
+    // Note: The logic here must be synchronized with the code in the<br class="gmail_msg">
+    // branch-selection pass which sets the offset of the first block in the<br class="gmail_msg">
+    // function. This matters because it affects the alignment.<br class="gmail_msg">
     const PPCFunctionInfo *PPCFI = MF->getInfo<PPCFunctionInfo>();<br class="gmail_msg">
<br class="gmail_msg">
     MCSymbol *GlobalEntryLabel = PPCFI->getGlobalEPSymbol();<br class="gmail_msg">
<br class="gmail_msg">
Modified: llvm/trunk/lib/Target/PowerPC/PPCBranchSelector.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCBranchSelector.cpp?rev=283086&r1=283085&r2=283086&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCBranchSelector.cpp?rev=283086&r1=283085&r2=283086&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- llvm/trunk/lib/Target/PowerPC/PPCBranchSelector.cpp (original)<br class="gmail_msg">
+++ llvm/trunk/lib/Target/PowerPC/PPCBranchSelector.cpp Sun Oct  2 23:06:44 2016<br class="gmail_msg">
@@ -19,8 +19,10 @@<br class="gmail_msg">
 #include "MCTargetDesc/PPCPredicates.h"<br class="gmail_msg">
 #include "PPCInstrBuilder.h"<br class="gmail_msg">
 #include "PPCInstrInfo.h"<br class="gmail_msg">
+#include "PPCSubtarget.h"<br class="gmail_msg">
 #include "llvm/ADT/Statistic.h"<br class="gmail_msg">
 #include "llvm/CodeGen/MachineFunctionPass.h"<br class="gmail_msg">
+#include "llvm/CodeGen/MachineRegisterInfo.h"<br class="gmail_msg">
 #include "llvm/Support/MathExtras.h"<br class="gmail_msg">
 #include "llvm/Target/TargetMachine.h"<br class="gmail_msg">
 #include "llvm/Target/TargetSubtargetInfo.h"<br class="gmail_msg">
@@ -92,8 +94,19 @@ bool PPCBSel::runOnMachineFunction(Machi<br class="gmail_msg">
     return AlignAmt + OffsetToAlignment(Offset, AlignAmt);<br class="gmail_msg">
   };<br class="gmail_msg">
<br class="gmail_msg">
+  // We need to be careful about the offset of the first block in the function<br class="gmail_msg">
+  // because it might not have the function's alignment. This happens because,<br class="gmail_msg">
+  // under the ELFv2 ABI, for functions which require a TOC pointer, we add a<br class="gmail_msg">
+  // two-instruction sequence to the start of the function.<br class="gmail_msg">
+  // Note: This needs to be synchronized with the check in<br class="gmail_msg">
+  // PPCLinuxAsmPrinter::EmitFunctionBodyStart.<br class="gmail_msg">
+  unsigned InitialOffset = 0;<br class="gmail_msg">
+  if (Fn.getSubtarget<PPCSubtarget>().isELFv2ABI() &&<br class="gmail_msg">
+      !Fn.getRegInfo().use_empty(PPC::X2))<br class="gmail_msg">
+    InitialOffset = 8;<br class="gmail_msg">
+<br class="gmail_msg">
   // Measure each MBB and compute a size for the entire function.<br class="gmail_msg">
-  unsigned FuncSize = 0;<br class="gmail_msg">
+  unsigned FuncSize = InitialOffset;<br class="gmail_msg">
   for (MachineFunction::iterator MFI = Fn.begin(), E = Fn.end(); MFI != E;<br class="gmail_msg">
        ++MFI) {<br class="gmail_msg">
     MachineBasicBlock *MBB = &*MFI;<br class="gmail_msg">
@@ -240,7 +253,7 @@ bool PPCBSel::runOnMachineFunction(Machi<br class="gmail_msg">
     if (MadeChange) {<br class="gmail_msg">
       // If we're going to iterate again, make sure we've updated our<br class="gmail_msg">
       // padding-based contributions to the block sizes.<br class="gmail_msg">
-      unsigned Offset = 0;<br class="gmail_msg">
+      unsigned Offset = InitialOffset;<br class="gmail_msg">
       for (MachineFunction::iterator MFI = Fn.begin(), E = Fn.end(); MFI != E;<br class="gmail_msg">
            ++MFI) {<br class="gmail_msg">
         MachineBasicBlock *MBB = &*MFI;<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
llvm-commits mailing list<br class="gmail_msg">
<a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a><br class="gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="gmail_msg">
</blockquote></div>