[llvm] r363531 - [ARM] Add ARMBasicBlockInfo.cpp
Sam Parker via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 17 02:12:00 PDT 2019
Hi Florian,
Yeah, sorry, I really made a mess of this one! I've now removed ARMComputeBlockSize.cpp and added the new file ARMBasicBlockInfo.cpp. Hopefully the builders will be happy again.
Cheers!
Sam Parker
Compilation Tools Engineer | Arm
. . . . . . . . . . . . . . . . . . . . . . . . . . .
Arm.com
________________________________
From: florian_hahn at apple.com <florian_hahn at apple.com> on behalf of Florian Hahn <florian_hahn at apple.com>
Sent: 17 June 2019 10:07
To: Sam Parker
Cc: llvm-commits at lists.llvm.org
Subject: Re: [llvm] r363531 - [ARM] Add ARMBasicBlockInfo.cpp
Hi Sam,
It looks like this file needs adding to CMakeLists.txt
CMake Error at cmake/modules/LLVMProcessSources.cmake:112 (message):
Found unknown source file ARMComputeBlockSize.cpp
Please update llvm/lib/Target/ARM/CMakeLists.txt
http://green.lab.llvm.org/green/job/clang-stage1-cmake-RA-incremental/62410/console
Cheers,
Florian
> On Jun 17, 2019, at 10:05, Sam Parker via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>
> Author: sam_parker
> Date: Mon Jun 17 02:05:43 2019
> New Revision: 363531
>
> URL: http://llvm.org/viewvc/llvm-project?rev=363531&view=rev
> Log:
> [ARM] Add ARMBasicBlockInfo.cpp
>
> Forgot to add file!
>
> Added:
> llvm/trunk/lib/Target/ARM/ARMBasicBlockInfo.cpp
>
> Added: llvm/trunk/lib/Target/ARM/ARMBasicBlockInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMBasicBlockInfo.cpp?rev=363531&view=auto
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMBasicBlockInfo.cpp (added)
> +++ llvm/trunk/lib/Target/ARM/ARMBasicBlockInfo.cpp Mon Jun 17 02:05:43 2019
> @@ -0,0 +1,146 @@
> +//===--- ARMBasicBlockInfo.cpp - Utilities for block sizes ---------------===//
> +//
> +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
> +// See https://llvm.org/LICENSE.txt for license information.
> +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#include "ARM.h"
> +#include "ARMBaseInstrInfo.h"
> +#include "ARMBasicBlockInfo.h"
> +#include "ARMMachineFunctionInfo.h"
> +#include "llvm/CodeGen/MachineBasicBlock.h"
> +#include "llvm/CodeGen/MachineFunction.h"
> +#include "llvm/CodeGen/MachineInstr.h"
> +#include "llvm/CodeGen/TargetSubtargetInfo.h"
> +#include <vector>
> +
> +#define DEBUG_TYPE "arm-bb-utils"
> +
> +using namespace llvm;
> +
> +namespace llvm {
> +
> +// mayOptimizeThumb2Instruction - Returns true if optimizeThumb2Instructions
> +// below may shrink MI.
> +static bool
> +mayOptimizeThumb2Instruction(const MachineInstr *MI) {
> + switch(MI->getOpcode()) {
> + // optimizeThumb2Instructions.
> + case ARM::t2LEApcrel:
> + case ARM::t2LDRpci:
> + // optimizeThumb2Branches.
> + case ARM::t2B:
> + case ARM::t2Bcc:
> + case ARM::tBcc:
> + // optimizeThumb2JumpTables.
> + case ARM::t2BR_JT:
> + case ARM::tBR_JTr:
> + return true;
> + }
> + return false;
> +}
> +
> +void ARMBasicBlockUtils::computeBlockSize(MachineBasicBlock *MBB) {
> + LLVM_DEBUG(dbgs() << "computeBlockSize: " << MBB->getName() << "\n");
> + BasicBlockInfo &BBI = BBInfo[MBB->getNumber()];
> + BBI.Size = 0;
> + BBI.Unalign = 0;
> + BBI.PostAlign = 0;
> +
> + for (MachineInstr &I : *MBB) {
> + BBI.Size += TII->getInstSizeInBytes(I);
> + // For inline asm, getInstSizeInBytes returns a conservative estimate.
> + // The actual size may be smaller, but still a multiple of the instr size.
> + if (I.isInlineAsm())
> + BBI.Unalign = isThumb ? 1 : 2;
> + // Also consider instructions that may be shrunk later.
> + else if (isThumb && mayOptimizeThumb2Instruction(&I))
> + BBI.Unalign = 1;
> + }
> +
> + // tBR_JTr contains a .align 2 directive.
> + if (!MBB->empty() && MBB->back().getOpcode() == ARM::tBR_JTr) {
> + BBI.PostAlign = 2;
> + MBB->getParent()->ensureAlignment(2);
> + }
> +}
> +
> +/// getOffsetOf - Return the current offset of the specified machine instruction
> +/// from the start of the function. This offset changes as stuff is moved
> +/// around inside the function.
> +unsigned ARMBasicBlockUtils::getOffsetOf(MachineInstr *MI) const {
> + const MachineBasicBlock *MBB = MI->getParent();
> +
> + // The offset is composed of two things: the sum of the sizes of all MBB's
> + // before this instruction's block, and the offset from the start of the block
> + // it is in.
> + unsigned Offset = BBInfo[MBB->getNumber()].Offset;
> +
> + // Sum instructions before MI in MBB.
> + for (MachineBasicBlock::const_iterator I = MBB->begin(); &*I != MI; ++I) {
> + assert(I != MBB->end() && "Didn't find MI in its own basic block?");
> + Offset += TII->getInstSizeInBytes(*I);
> + }
> + return Offset;
> +}
> +
> +/// isBBInRange - Returns true if the distance between specific MI and
> +/// specific BB can fit in MI's displacement field.
> +bool ARMBasicBlockUtils::isBBInRange(MachineInstr *MI,
> + MachineBasicBlock *DestBB,
> + unsigned MaxDisp) const {
> + unsigned PCAdj = isThumb ? 4 : 8;
> + unsigned BrOffset = getOffsetOf(MI) + PCAdj;
> + unsigned DestOffset = BBInfo[DestBB->getNumber()].Offset;
> +
> + LLVM_DEBUG(dbgs() << "Branch of destination " << printMBBReference(*DestBB)
> + << " from " << printMBBReference(*MI->getParent())
> + << " max delta=" << MaxDisp << " from " << getOffsetOf(MI)
> + << " to " << DestOffset << " offset "
> + << int(DestOffset - BrOffset) << "\t" << *MI);
> +
> + if (BrOffset <= DestOffset) {
> + // Branch before the Dest.
> + if (DestOffset-BrOffset <= MaxDisp)
> + return true;
> + } else {
> + if (BrOffset-DestOffset <= MaxDisp)
> + return true;
> + }
> + return false;
> +}
> +
> +void ARMBasicBlockUtils::adjustBBOffsetsAfter(MachineBasicBlock *BB) {
> + assert(BB->getParent() == &MF &&
> + "Basic block is not a child of the current function.\n");
> +
> + unsigned BBNum = BB->getNumber();
> + LLVM_DEBUG(dbgs() << "Adjust block:\n"
> + << " - name: " << BB->getName() << "\n"
> + << " - number: " << BB->getNumber() << "\n"
> + << " - function: " << MF.getName() << "\n"
> + << " - blocks: " << MF.getNumBlockIDs() << "\n");
> +
> + for(unsigned i = BBNum + 1, e = MF.getNumBlockIDs(); i < e; ++i) {
> + // Get the offset and known bits at the end of the layout predecessor.
> + // Include the alignment of the current block.
> + unsigned LogAlign = MF.getBlockNumbered(i)->getAlignment();
> + unsigned Offset = BBInfo[i - 1].postOffset(LogAlign);
> + unsigned KnownBits = BBInfo[i - 1].postKnownBits(LogAlign);
> +
> + // This is where block i begins. Stop if the offset is already correct,
> + // and we have updated 2 blocks. This is the maximum number of blocks
> + // changed before calling this function.
> + if (i > BBNum + 2 &&
> + BBInfo[i].Offset == Offset &&
> + BBInfo[i].KnownBits == KnownBits)
> + break;
> +
> + BBInfo[i].Offset = Offset;
> + BBInfo[i].KnownBits = KnownBits;
> + }
> +}
> +
> +} // end namespace llvm
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> https://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/20190617/719b2e87/attachment.html>
More information about the llvm-commits
mailing list