blob: 64f187d17e64e65ced40587e0e8d35ffb6b9890a [file] [log] [blame]
Sjoerd Meijer5c0ef832016-07-22 08:39:12 +00001//===--- ARMComputeBlockSize.cpp - Compute machine block sizes ------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "ARM.h"
11#include "ARMBasicBlockInfo.h"
12using namespace llvm;
13
14namespace llvm {
15
16// mayOptimizeThumb2Instruction - Returns true if optimizeThumb2Instructions
17// below may shrink MI.
18static bool
19mayOptimizeThumb2Instruction(const MachineInstr *MI) {
20 switch(MI->getOpcode()) {
21 // optimizeThumb2Instructions.
22 case ARM::t2LEApcrel:
23 case ARM::t2LDRpci:
24 // optimizeThumb2Branches.
25 case ARM::t2B:
26 case ARM::t2Bcc:
27 case ARM::tBcc:
28 // optimizeThumb2JumpTables.
29 case ARM::t2BR_JT:
30 return true;
31 }
32 return false;
33}
34
35void computeBlockSize(MachineFunction *MF, MachineBasicBlock *MBB,
36 BasicBlockInfo &BBI) {
37 const ARMBaseInstrInfo *TII =
38 static_cast<const ARMBaseInstrInfo *>(MF->getSubtarget().getInstrInfo());
39 bool isThumb = MF->getInfo<ARMFunctionInfo>()->isThumbFunction();
40 BBI.Size = 0;
41 BBI.Unalign = 0;
42 BBI.PostAlign = 0;
43
44 for (MachineInstr &I : *MBB) {
Sjoerd Meijer89217f82016-07-28 16:32:22 +000045 BBI.Size += TII->getInstSizeInBytes(I);
46 // For inline asm, getInstSizeInBytes returns a conservative estimate.
Sjoerd Meijer5c0ef832016-07-22 08:39:12 +000047 // The actual size may be smaller, but still a multiple of the instr size.
48 if (I.isInlineAsm())
49 BBI.Unalign = isThumb ? 1 : 2;
50 // Also consider instructions that may be shrunk later.
51 else if (isThumb && mayOptimizeThumb2Instruction(&I))
52 BBI.Unalign = 1;
53 }
54
55 // tBR_JTr contains a .align 2 directive.
56 if (!MBB->empty() && MBB->back().getOpcode() == ARM::tBR_JTr) {
57 BBI.PostAlign = 2;
58 MBB->getParent()->ensureAlignment(2);
59 }
60}
61
62std::vector<BasicBlockInfo> computeAllBlockSizes(MachineFunction *MF) {
63 std::vector<BasicBlockInfo> BBInfo;
64 BBInfo.resize(MF->getNumBlockIDs());
65
66 for (MachineBasicBlock &MBB : *MF)
67 computeBlockSize(MF, &MBB, BBInfo[MBB.getNumber()]);
68
69 return BBInfo;
70}
71
72} // end namespace