144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford//===-- SystemZLongBranch.cpp - Branch lengthening for SystemZ ------------===//
244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford//
344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford//                     The LLVM Compiler Infrastructure
444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford//
544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// This file is distributed under the University of Illinois Open Source
644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// License. See LICENSE.TXT for details.
744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford//
844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford//===----------------------------------------------------------------------===//
944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford//
1066fbb4781841a8411a772b6909a7e0de182b896fRichard Sandiford// This pass makes sure that all branches are in range.  There are several ways
1166fbb4781841a8411a772b6909a7e0de182b896fRichard Sandiford// in which this could be done.  One aggressive approach is to assume that all
1266fbb4781841a8411a772b6909a7e0de182b896fRichard Sandiford// branches are in range and successively replace those that turn out not
1366fbb4781841a8411a772b6909a7e0de182b896fRichard Sandiford// to be in range with a longer form (branch relaxation).  A simple
1466fbb4781841a8411a772b6909a7e0de182b896fRichard Sandiford// implementation is to continually walk through the function relaxing
1566fbb4781841a8411a772b6909a7e0de182b896fRichard Sandiford// branches until no more changes are needed and a fixed point is reached.
1666fbb4781841a8411a772b6909a7e0de182b896fRichard Sandiford// However, in the pathological worst case, this implementation is
1766fbb4781841a8411a772b6909a7e0de182b896fRichard Sandiford// quadratic in the number of blocks; relaxing branch N can make branch N-1
1866fbb4781841a8411a772b6909a7e0de182b896fRichard Sandiford// go out of range, which in turn can make branch N-2 go out of range,
1966fbb4781841a8411a772b6909a7e0de182b896fRichard Sandiford// and so on.
2044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford//
2144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// An alternative approach is to assume that all branches must be
2244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// converted to their long forms, then reinstate the short forms of
2344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// branches that, even under this pessimistic assumption, turn out to be
2444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// in range (branch shortening).  This too can be implemented as a function
2544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// walk that is repeated until a fixed point is reached.  In general,
2644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// the result of shortening is not as good as that of relaxation, and
2744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// shortening is also quadratic in the worst case; shortening branch N
2844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// can bring branch N-1 in range of the short form, which in turn can do
2944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// the same for branch N-2, and so on.  The main advantage of shortening
3044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// is that each walk through the function produces valid code, so it is
3144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// possible to stop at any point after the first walk.  The quadraticness
3244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// could therefore be handled with a maximum pass count, although the
3344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// question then becomes: what maximum count should be used?
3444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford//
3544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// On SystemZ, long branches are only needed for functions bigger than 64k,
3644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// which are relatively rare to begin with, and the long branch sequences
3744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// are actually relatively cheap.  It therefore doesn't seem worth spending
3844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// much compilation time on the problem.  Instead, the approach we take is:
3944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford//
40487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford// (1) Work out the address that each block would have if no branches
41487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford//     need relaxing.  Exit the pass early if all branches are in range
42487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford//     according to this assumption.
43487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford//
44487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford// (2) Work out the address that each block would have if all branches
45487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford//     need relaxing.
46487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford//
47487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford// (3) Walk through the block calculating the final address of each instruction
48487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford//     and relaxing those that need to be relaxed.  For backward branches,
49487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford//     this check uses the final address of the target block, as calculated
50487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford//     earlier in the walk.  For forward branches, this check uses the
51487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford//     address of the target block that was calculated in (2).  Both checks
52487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford//     give a conservatively-correct range.
5344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford//
5444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford//===----------------------------------------------------------------------===//
5544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
5644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#include "SystemZTargetMachine.h"
5744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#include "llvm/ADT/Statistic.h"
5844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#include "llvm/CodeGen/MachineFunctionPass.h"
5944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#include "llvm/CodeGen/MachineInstrBuilder.h"
6044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#include "llvm/IR/Function.h"
6144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#include "llvm/Support/CommandLine.h"
6244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#include "llvm/Support/MathExtras.h"
6344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#include "llvm/Target/TargetInstrInfo.h"
6444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#include "llvm/Target/TargetMachine.h"
6544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#include "llvm/Target/TargetRegisterInfo.h"
6644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
6744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordusing namespace llvm;
6844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
69dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "systemz-long-branch"
70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
7144b486ed78c60b50aa14d4eed92ee828d4d44293Richard SandifordSTATISTIC(LongBranches, "Number of long branches.");
7244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
7344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordnamespace {
7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Represents positional information about a basic block.
7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct MBBInfo {
7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // The address that we currently assume the block has.
7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint64_t Address;
7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // The size of the block in bytes, excluding terminators.
8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // This value never changes.
8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint64_t Size;
8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // The minimum alignment of the block, as a log2 value.
8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // This value never changes.
8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned Alignment;
8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // The number of terminators in this block.  This value never changes.
8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned NumTerminators;
8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MBBInfo()
9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    : Address(0), Size(0), Alignment(0), NumTerminators(0) {}
9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Represents the state of a block terminator.
9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct TerminatorInfo {
9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // If this terminator is a relaxable branch, this points to the branch
9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // instruction, otherwise it is null.
9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MachineInstr *Branch;
9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // The address that we currently assume the terminator has.
10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint64_t Address;
10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // The current size of the terminator in bytes.
10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint64_t Size;
10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // If Branch is nonnull, this is the number of the target block,
10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // otherwise it is unused.
10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned TargetBlock;
10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // If Branch is nonnull, this is the length of the longest relaxed form,
11136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // otherwise it is zero.
11236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned ExtraRelaxSize;
11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
114dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  TerminatorInfo() : Branch(nullptr), Size(0), TargetBlock(0),
115dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                     ExtraRelaxSize(0) {}
11636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Used to keep track of the current position while iterating over the blocks.
11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct BlockPosition {
12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // The address that we assume this position has.
12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint64_t Address;
12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // The number of low bits in Address that are known to be the same
12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // as the runtime address.
12536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  unsigned KnownBits;
12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
12736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  BlockPosition(unsigned InitialAlignment)
12836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    : Address(0), KnownBits(InitialAlignment) {}
12936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
13036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
13136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass SystemZLongBranch : public MachineFunctionPass {
13236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic:
13336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static char ID;
13436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  SystemZLongBranch(const SystemZTargetMachine &tm)
135dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    : MachineFunctionPass(ID), TII(nullptr) {}
13636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
13736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const char *getPassName() const override {
13836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return "SystemZ Long Branch";
13936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
14044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
141dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool runOnMachineFunction(MachineFunction &F) override;
14236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
14336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesprivate:
14436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void skipNonTerminators(BlockPosition &Position, MBBInfo &Block);
14536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void skipTerminator(BlockPosition &Position, TerminatorInfo &Terminator,
14636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                      bool AssumeRelaxed);
14736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  TerminatorInfo describeTerminator(MachineInstr *MI);
14836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  uint64_t initMBBInfo();
14936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool mustRelaxBranch(const TerminatorInfo &Terminator, uint64_t Address);
15036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  bool mustRelaxABranch();
15136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void setWorstCaseAddresses();
15236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void splitBranchOnCount(MachineInstr *MI, unsigned AddOpcode);
15336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void splitCompareBranch(MachineInstr *MI, unsigned CompareOpcode);
15436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void relaxBranch(TerminatorInfo &Terminator);
15536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  void relaxBranches();
15636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
15736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const SystemZInstrInfo *TII;
15836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  MachineFunction *MF;
15936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  SmallVector<MBBInfo, 16> MBBs;
16036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  SmallVector<TerminatorInfo, 16> Terminators;
16136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
16236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
16336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hineschar SystemZLongBranch::ID = 0;
16436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
16536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesconst uint64_t MaxBackwardRange = 0x10000;
16636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesconst uint64_t MaxForwardRange = 0xfffe;
16736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} // end anonymous namespace
16844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
16944b486ed78c60b50aa14d4eed92ee828d4d44293Richard SandifordFunctionPass *llvm::createSystemZLongBranchPass(SystemZTargetMachine &TM) {
17044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  return new SystemZLongBranch(TM);
17144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford}
17244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
17344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// Position describes the state immediately before Block.  Update Block
17444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// accordingly and move Position to the end of the block's non-terminator
17544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// instructions.
17644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordvoid SystemZLongBranch::skipNonTerminators(BlockPosition &Position,
17744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford                                           MBBInfo &Block) {
17844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  if (Block.Alignment > Position.KnownBits) {
17944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // When calculating the address of Block, we need to conservatively
18044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // assume that Block had the worst possible misalignment.
18144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    Position.Address += ((uint64_t(1) << Block.Alignment) -
18244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford                         (uint64_t(1) << Position.KnownBits));
18344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    Position.KnownBits = Block.Alignment;
18444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  }
18544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
18644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  // Align the addresses.
18744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  uint64_t AlignMask = (uint64_t(1) << Block.Alignment) - 1;
18844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  Position.Address = (Position.Address + AlignMask) & ~AlignMask;
18944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
19044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  // Record the block's position.
19144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  Block.Address = Position.Address;
19244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
19344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  // Move past the non-terminators in the block.
19444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  Position.Address += Block.Size;
19544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford}
19644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
19744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// Position describes the state immediately before Terminator.
19844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// Update Terminator accordingly and move Position past it.
19944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// Assume that Terminator will be relaxed if AssumeRelaxed.
20044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordvoid SystemZLongBranch::skipTerminator(BlockPosition &Position,
20144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford                                       TerminatorInfo &Terminator,
20244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford                                       bool AssumeRelaxed) {
20344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  Terminator.Address = Position.Address;
20444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  Position.Address += Terminator.Size;
20544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  if (AssumeRelaxed)
20644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    Position.Address += Terminator.ExtraRelaxSize;
20744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford}
20844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
20944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// Return a description of terminator instruction MI.
21044b486ed78c60b50aa14d4eed92ee828d4d44293Richard SandifordTerminatorInfo SystemZLongBranch::describeTerminator(MachineInstr *MI) {
21144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  TerminatorInfo Terminator;
21244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  Terminator.Size = TII->getInstSizeInBytes(MI);
21344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  if (MI->isConditionalBranch() || MI->isUnconditionalBranch()) {
21444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    switch (MI->getOpcode()) {
21544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    case SystemZ::J:
21644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      // Relaxes to JG, which is 2 bytes longer.
21744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      Terminator.ExtraRelaxSize = 2;
21844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      break;
21944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    case SystemZ::BRC:
22006c3c9a9e1cc313d911e939e3e994feaf43cc3a7Richard Sandiford      // Relaxes to BRCL, which is 2 bytes longer.
22144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      Terminator.ExtraRelaxSize = 2;
22244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      break;
22393795574785de252703591e7fcc8f052c762f25eRichard Sandiford    case SystemZ::BRCT:
22493795574785de252703591e7fcc8f052c762f25eRichard Sandiford    case SystemZ::BRCTG:
22593795574785de252703591e7fcc8f052c762f25eRichard Sandiford      // Relaxes to A(G)HI and BRCL, which is 6 bytes longer.
22693795574785de252703591e7fcc8f052c762f25eRichard Sandiford      Terminator.ExtraRelaxSize = 6;
22793795574785de252703591e7fcc8f052c762f25eRichard Sandiford      break;
228d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford    case SystemZ::CRJ:
229e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    case SystemZ::CLRJ:
230e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford      // Relaxes to a C(L)R/BRCL sequence, which is 2 bytes longer.
231d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford      Terminator.ExtraRelaxSize = 2;
232d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford      break;
233d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford    case SystemZ::CGRJ:
234e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    case SystemZ::CLGRJ:
235e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford      // Relaxes to a C(L)GR/BRCL sequence, which is 4 bytes longer.
236d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford      Terminator.ExtraRelaxSize = 4;
237d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford      break;
2382d664abbfca8b9fa3d99e8a2f74bd52faf007f12Richard Sandiford    case SystemZ::CIJ:
2392d664abbfca8b9fa3d99e8a2f74bd52faf007f12Richard Sandiford    case SystemZ::CGIJ:
2402d664abbfca8b9fa3d99e8a2f74bd52faf007f12Richard Sandiford      // Relaxes to a C(G)HI/BRCL sequence, which is 4 bytes longer.
2412d664abbfca8b9fa3d99e8a2f74bd52faf007f12Richard Sandiford      Terminator.ExtraRelaxSize = 4;
2422d664abbfca8b9fa3d99e8a2f74bd52faf007f12Richard Sandiford      break;
243e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    case SystemZ::CLIJ:
244e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    case SystemZ::CLGIJ:
245e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford      // Relaxes to a CL(G)FI/BRCL sequence, which is 6 bytes longer.
246e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford      Terminator.ExtraRelaxSize = 6;
247e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford      break;
24844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    default:
24944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      llvm_unreachable("Unrecognized branch instruction");
25044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    }
25106c3c9a9e1cc313d911e939e3e994feaf43cc3a7Richard Sandiford    Terminator.Branch = MI;
25206c3c9a9e1cc313d911e939e3e994feaf43cc3a7Richard Sandiford    Terminator.TargetBlock =
25306c3c9a9e1cc313d911e939e3e994feaf43cc3a7Richard Sandiford      TII->getBranchInfo(MI).Target->getMBB()->getNumber();
25444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  }
25544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  return Terminator;
25644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford}
25744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
25844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// Fill MBBs and Terminators, setting the addresses on the assumption
25944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// that no branches need relaxation.  Return the size of the function under
26044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// this assumption.
26144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiforduint64_t SystemZLongBranch::initMBBInfo() {
26244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  MF->RenumberBlocks();
26344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  unsigned NumBlocks = MF->size();
26444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
26544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  MBBs.clear();
26644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  MBBs.resize(NumBlocks);
26744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
26844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  Terminators.clear();
26944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  Terminators.reserve(NumBlocks);
27044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
27144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  BlockPosition Position(MF->getAlignment());
27244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  for (unsigned I = 0; I < NumBlocks; ++I) {
27344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    MachineBasicBlock *MBB = MF->getBlockNumbered(I);
27444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    MBBInfo &Block = MBBs[I];
27544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
27644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // Record the alignment, for quick access.
27744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    Block.Alignment = MBB->getAlignment();
27844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
27944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // Calculate the size of the fixed part of the block.
28044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    MachineBasicBlock::iterator MI = MBB->begin();
28144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    MachineBasicBlock::iterator End = MBB->end();
28244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    while (MI != End && !MI->isTerminator()) {
28366fbb4781841a8411a772b6909a7e0de182b896fRichard Sandiford      Block.Size += TII->getInstSizeInBytes(MI);
28444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      ++MI;
28544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    }
28644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    skipNonTerminators(Position, Block);
28744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
28844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // Add the terminators.
28944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    while (MI != End) {
29044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      if (!MI->isDebugValue()) {
29144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford        assert(MI->isTerminator() && "Terminator followed by non-terminator");
29244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford        Terminators.push_back(describeTerminator(MI));
29344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford        skipTerminator(Position, Terminators.back(), false);
29444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford        ++Block.NumTerminators;
29544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      }
29644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      ++MI;
29744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    }
29844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  }
29944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
30044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  return Position.Address;
30144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford}
30244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
303487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford// Return true if, under current assumptions, Terminator would need to be
304487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford// relaxed if it were placed at address Address.
305487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandifordbool SystemZLongBranch::mustRelaxBranch(const TerminatorInfo &Terminator,
306487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford                                        uint64_t Address) {
30744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  if (!Terminator.Branch)
30844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    return false;
30944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
31044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  const MBBInfo &Target = MBBs[Terminator.TargetBlock];
311487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford  if (Address >= Target.Address) {
312487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford    if (Address - Target.Address <= MaxBackwardRange)
31344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      return false;
31444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  } else {
315487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford    if (Target.Address - Address <= MaxForwardRange)
31644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      return false;
31744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  }
31844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
31944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  return true;
32044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford}
32144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
32244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// Return true if, under current assumptions, any terminator needs
32344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// to be relaxed.
32444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordbool SystemZLongBranch::mustRelaxABranch() {
32536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  for (auto &Terminator : Terminators)
32636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    if (mustRelaxBranch(Terminator, Terminator.Address))
32744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      return true;
32844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  return false;
32944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford}
33044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
33144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// Set the address of each block on the assumption that all branches
33244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// must be long.
33344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordvoid SystemZLongBranch::setWorstCaseAddresses() {
33444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  SmallVector<TerminatorInfo, 16>::iterator TI = Terminators.begin();
33544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  BlockPosition Position(MF->getAlignment());
33636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  for (auto &Block : MBBs) {
33736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    skipNonTerminators(Position, Block);
33836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    for (unsigned BTI = 0, BTE = Block.NumTerminators; BTI != BTE; ++BTI) {
33944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      skipTerminator(Position, *TI, true);
34044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      ++TI;
34144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    }
34244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  }
34344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford}
34444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
34593795574785de252703591e7fcc8f052c762f25eRichard Sandiford// Split BRANCH ON COUNT MI into the addition given by AddOpcode followed
34693795574785de252703591e7fcc8f052c762f25eRichard Sandiford// by a BRCL on the result.
34793795574785de252703591e7fcc8f052c762f25eRichard Sandifordvoid SystemZLongBranch::splitBranchOnCount(MachineInstr *MI,
34893795574785de252703591e7fcc8f052c762f25eRichard Sandiford                                           unsigned AddOpcode) {
34993795574785de252703591e7fcc8f052c762f25eRichard Sandiford  MachineBasicBlock *MBB = MI->getParent();
35093795574785de252703591e7fcc8f052c762f25eRichard Sandiford  DebugLoc DL = MI->getDebugLoc();
35193795574785de252703591e7fcc8f052c762f25eRichard Sandiford  BuildMI(*MBB, MI, DL, TII->get(AddOpcode))
35293795574785de252703591e7fcc8f052c762f25eRichard Sandiford    .addOperand(MI->getOperand(0))
35393795574785de252703591e7fcc8f052c762f25eRichard Sandiford    .addOperand(MI->getOperand(1))
35493795574785de252703591e7fcc8f052c762f25eRichard Sandiford    .addImm(-1);
35593795574785de252703591e7fcc8f052c762f25eRichard Sandiford  MachineInstr *BRCL = BuildMI(*MBB, MI, DL, TII->get(SystemZ::BRCL))
35693795574785de252703591e7fcc8f052c762f25eRichard Sandiford    .addImm(SystemZ::CCMASK_ICMP)
35793795574785de252703591e7fcc8f052c762f25eRichard Sandiford    .addImm(SystemZ::CCMASK_CMP_NE)
35893795574785de252703591e7fcc8f052c762f25eRichard Sandiford    .addOperand(MI->getOperand(2));
35993795574785de252703591e7fcc8f052c762f25eRichard Sandiford  // The implicit use of CC is a killing use.
36093795574785de252703591e7fcc8f052c762f25eRichard Sandiford  BRCL->addRegisterKilled(SystemZ::CC, &TII->getRegisterInfo());
36193795574785de252703591e7fcc8f052c762f25eRichard Sandiford  MI->eraseFromParent();
36293795574785de252703591e7fcc8f052c762f25eRichard Sandiford}
36393795574785de252703591e7fcc8f052c762f25eRichard Sandiford
364d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford// Split MI into the comparison given by CompareOpcode followed
365d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford// a BRCL on the result.
366d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandifordvoid SystemZLongBranch::splitCompareBranch(MachineInstr *MI,
367d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford                                           unsigned CompareOpcode) {
368d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford  MachineBasicBlock *MBB = MI->getParent();
369d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford  DebugLoc DL = MI->getDebugLoc();
370d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford  BuildMI(*MBB, MI, DL, TII->get(CompareOpcode))
371d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford    .addOperand(MI->getOperand(0))
372d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford    .addOperand(MI->getOperand(1));
373d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford  MachineInstr *BRCL = BuildMI(*MBB, MI, DL, TII->get(SystemZ::BRCL))
3746824f127f90197b26af93cf5d6c13b7941567e54Richard Sandiford    .addImm(SystemZ::CCMASK_ICMP)
375d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford    .addOperand(MI->getOperand(2))
376d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford    .addOperand(MI->getOperand(3));
377d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford  // The implicit use of CC is a killing use.
3786824f127f90197b26af93cf5d6c13b7941567e54Richard Sandiford  BRCL->addRegisterKilled(SystemZ::CC, &TII->getRegisterInfo());
379d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford  MI->eraseFromParent();
380d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford}
381d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford
38244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// Relax the branch described by Terminator.
38344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordvoid SystemZLongBranch::relaxBranch(TerminatorInfo &Terminator) {
38444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  MachineInstr *Branch = Terminator.Branch;
38544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  switch (Branch->getOpcode()) {
386275428fe4abd4bd690456d29c7c54143d653cb4fRichard Sandiford  case SystemZ::J:
387275428fe4abd4bd690456d29c7c54143d653cb4fRichard Sandiford    Branch->setDesc(TII->get(SystemZ::JG));
388275428fe4abd4bd690456d29c7c54143d653cb4fRichard Sandiford    break;
389275428fe4abd4bd690456d29c7c54143d653cb4fRichard Sandiford  case SystemZ::BRC:
390275428fe4abd4bd690456d29c7c54143d653cb4fRichard Sandiford    Branch->setDesc(TII->get(SystemZ::BRCL));
391275428fe4abd4bd690456d29c7c54143d653cb4fRichard Sandiford    break;
39293795574785de252703591e7fcc8f052c762f25eRichard Sandiford  case SystemZ::BRCT:
39393795574785de252703591e7fcc8f052c762f25eRichard Sandiford    splitBranchOnCount(Branch, SystemZ::AHI);
39493795574785de252703591e7fcc8f052c762f25eRichard Sandiford    break;
39593795574785de252703591e7fcc8f052c762f25eRichard Sandiford  case SystemZ::BRCTG:
39693795574785de252703591e7fcc8f052c762f25eRichard Sandiford    splitBranchOnCount(Branch, SystemZ::AGHI);
39793795574785de252703591e7fcc8f052c762f25eRichard Sandiford    break;
398d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford  case SystemZ::CRJ:
399d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford    splitCompareBranch(Branch, SystemZ::CR);
400d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford    break;
401d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford  case SystemZ::CGRJ:
402d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford    splitCompareBranch(Branch, SystemZ::CGR);
403d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford    break;
4042d664abbfca8b9fa3d99e8a2f74bd52faf007f12Richard Sandiford  case SystemZ::CIJ:
4052d664abbfca8b9fa3d99e8a2f74bd52faf007f12Richard Sandiford    splitCompareBranch(Branch, SystemZ::CHI);
4062d664abbfca8b9fa3d99e8a2f74bd52faf007f12Richard Sandiford    break;
4072d664abbfca8b9fa3d99e8a2f74bd52faf007f12Richard Sandiford  case SystemZ::CGIJ:
4082d664abbfca8b9fa3d99e8a2f74bd52faf007f12Richard Sandiford    splitCompareBranch(Branch, SystemZ::CGHI);
4092d664abbfca8b9fa3d99e8a2f74bd52faf007f12Richard Sandiford    break;
410e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford  case SystemZ::CLRJ:
411e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    splitCompareBranch(Branch, SystemZ::CLR);
412e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    break;
413e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford  case SystemZ::CLGRJ:
414e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    splitCompareBranch(Branch, SystemZ::CLGR);
415e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    break;
416e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford  case SystemZ::CLIJ:
417e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    splitCompareBranch(Branch, SystemZ::CLFI);
418e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    break;
419e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford  case SystemZ::CLGIJ:
420e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    splitCompareBranch(Branch, SystemZ::CLGFI);
421e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    break;
422275428fe4abd4bd690456d29c7c54143d653cb4fRichard Sandiford  default:
423275428fe4abd4bd690456d29c7c54143d653cb4fRichard Sandiford    llvm_unreachable("Unrecognized branch");
424275428fe4abd4bd690456d29c7c54143d653cb4fRichard Sandiford  }
42544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
42644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  Terminator.Size += Terminator.ExtraRelaxSize;
42744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  Terminator.ExtraRelaxSize = 0;
428dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  Terminator.Branch = nullptr;
42944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
43044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  ++LongBranches;
43144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford}
43244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
433487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford// Run a shortening pass and relax any branches that need to be relaxed.
43444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordvoid SystemZLongBranch::relaxBranches() {
435487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford  SmallVector<TerminatorInfo, 16>::iterator TI = Terminators.begin();
436487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford  BlockPosition Position(MF->getAlignment());
43736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  for (auto &Block : MBBs) {
43836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    skipNonTerminators(Position, Block);
43936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    for (unsigned BTI = 0, BTE = Block.NumTerminators; BTI != BTE; ++BTI) {
440487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford      assert(Position.Address <= TI->Address &&
441487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford             "Addresses shouldn't go forwards");
442487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford      if (mustRelaxBranch(*TI, Position.Address))
443487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford        relaxBranch(*TI);
444487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford      skipTerminator(Position, *TI, false);
445487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford      ++TI;
446487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford    }
447487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford  }
44844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford}
44944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
45044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordbool SystemZLongBranch::runOnMachineFunction(MachineFunction &F) {
451fc61b6f111af79662baf273c40593a1e8f4dc719Bill Wendling  TII = static_cast<const SystemZInstrInfo *>(F.getTarget().getInstrInfo());
45244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  MF = &F;
45344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  uint64_t Size = initMBBInfo();
45444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  if (Size <= MaxForwardRange || !mustRelaxABranch())
45544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    return false;
45644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
45744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  setWorstCaseAddresses();
45844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  relaxBranches();
45944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  return true;
46044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford}
461