<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Wed, Oct 26, 2016 at 3:52 PM Hal Finkel <<a href="mailto:hfinkel@anl.gov">hfinkel@anl.gov</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">----- Original Message -----<br class="gmail_msg">
> From: "Eric Christopher" <<a href="mailto:echristo@gmail.com" class="gmail_msg" target="_blank">echristo@gmail.com</a>><br class="gmail_msg">
> To: "Hal Finkel" <<a href="mailto:hfinkel@anl.gov" class="gmail_msg" target="_blank">hfinkel@anl.gov</a>>, <a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a><br class="gmail_msg">
> Sent: Thursday, October 20, 2016 8:46:08 PM<br class="gmail_msg">
> Subject: Re: [llvm] r283086 - [PowerPC] Account for the ELFv2 function prologue during branch selection<br class="gmail_msg">
><br class="gmail_msg">
><br class="gmail_msg">
> Hrm. Would it make sense to have the code in EmitFunctionBodyStart<br class="gmail_msg">
> emit instructions into the first basic block instead? (Will that<br class="gmail_msg">
> work here?)<br class="gmail_msg">
><br class="gmail_msg">
<br class="gmail_msg">
The instructions would need to be added before branch relaxation runs. We could do this with a separate pass that runs before branch relaxation. Not sure it is worth the complexity. Perhaps the next bug that comes up because of this I'll change my mind? ;)<br class="gmail_msg">
<br class="gmail_msg"></blockquote><div><br></div><div>Makes sense. Weirdly complicated at the moment, but I can see the additional work because of branch relaxation too. :)</div><div><br></div><div>-eric</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
 -Hal<br class="gmail_msg">
<br class="gmail_msg">
><br class="gmail_msg">
> Just thinking out loud.<br class="gmail_msg">
><br class="gmail_msg">
><br class="gmail_msg">
> -eric<br class="gmail_msg">
><br class="gmail_msg">
><br class="gmail_msg">
> On Sun, Oct 2, 2016 at 9:15 PM Hal Finkel via llvm-commits <<br class="gmail_msg">
> <a href="mailto:llvm-commits@lists.llvm.org" class="gmail_msg" target="_blank">llvm-commits@lists.llvm.org</a> > wrote:<br class="gmail_msg">
><br class="gmail_msg">
><br class="gmail_msg">
> 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<br class="gmail_msg">
> selection<br class="gmail_msg">
><br class="gmail_msg">
> The PPC branch-selection pass, which performs branch relaxation,<br class="gmail_msg">
> needs to<br class="gmail_msg">
> account for the padding that might be introduced to satisfy block<br class="gmail_msg">
> alignment<br class="gmail_msg">
> requirements. We were assuming that the first block was at offset<br class="gmail_msg">
> zero (i.e.<br class="gmail_msg">
> had the alignment of the function itself), but under the ELFv2 ABI, a<br class="gmail_msg">
> 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<br class="gmail_msg">
> 16-byte<br class="gmail_msg">
> alignment, the fact that the first block is eight bytes offset from<br class="gmail_msg">
> the start<br class="gmail_msg">
> of the function is relevant to calculating where padding will be<br class="gmail_msg">
> 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:<br class="gmail_msg">
> <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<br class="gmail_msg">
> 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<br class="gmail_msg">
> 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:<br class="gmail_msg">
> <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<br class="gmail_msg">
> 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<br class="gmail_msg">
> function<br class="gmail_msg">
> + // because it might not have the function's alignment. This happens<br class="gmail_msg">
> because,<br class="gmail_msg">
> + // under the ELFv2 ABI, for functions which require a TOC pointer,<br class="gmail_msg">
> 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 !=<br class="gmail_msg">
> 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 !=<br class="gmail_msg">
> 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">
><br class="gmail_msg">
<br class="gmail_msg">
--<br class="gmail_msg">
Hal Finkel<br class="gmail_msg">
Lead, Compiler Technology and Programming Languages<br class="gmail_msg">
Leadership Computing Facility<br class="gmail_msg">
Argonne National Laboratory<br class="gmail_msg">
</blockquote></div></div>