SystemZLongBranch.cpp revision e2d6f91d63a2e8cf77b07794cda7d9ef72504769
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#define DEBUG_TYPE "systemz-long-branch"
5744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
5844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#include "SystemZTargetMachine.h"
5944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#include "llvm/ADT/Statistic.h"
6044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#include "llvm/CodeGen/MachineFunctionPass.h"
6144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#include "llvm/CodeGen/MachineInstrBuilder.h"
6244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#include "llvm/IR/Function.h"
6344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#include "llvm/Support/CommandLine.h"
6444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#include "llvm/Support/MathExtras.h"
6544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#include "llvm/Target/TargetInstrInfo.h"
6644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#include "llvm/Target/TargetMachine.h"
6744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford#include "llvm/Target/TargetRegisterInfo.h"
6844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
6944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordusing namespace llvm;
7044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
7144b486ed78c60b50aa14d4eed92ee828d4d44293Richard SandifordSTATISTIC(LongBranches, "Number of long branches.");
7244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
7344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordnamespace {
7444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  // Represents positional information about a basic block.
7544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  struct MBBInfo {
76487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford    // The address that we currently assume the block has.
7744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    uint64_t Address;
7844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
7944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // The size of the block in bytes, excluding terminators.
8044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // This value never changes.
8144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    uint64_t Size;
8244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
8344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // The minimum alignment of the block, as a log2 value.
8444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // This value never changes.
8544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    unsigned Alignment;
8644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
8744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // The number of terminators in this block.  This value never changes.
8844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    unsigned NumTerminators;
8944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
9044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    MBBInfo()
9144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      : Address(0), Size(0), Alignment(0), NumTerminators(0) {}
9244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  };
9344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
9444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  // Represents the state of a block terminator.
9544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  struct TerminatorInfo {
9644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // If this terminator is a relaxable branch, this points to the branch
9744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // instruction, otherwise it is null.
9844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    MachineInstr *Branch;
9944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
100487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford    // The address that we currently assume the terminator has.
10144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    uint64_t Address;
10244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
10344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // The current size of the terminator in bytes.
10444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    uint64_t Size;
10544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
10644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // If Branch is nonnull, this is the number of the target block,
10744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // otherwise it is unused.
10844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    unsigned TargetBlock;
10944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
11044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // If Branch is nonnull, this is the length of the longest relaxed form,
11144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // otherwise it is zero.
11244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    unsigned ExtraRelaxSize;
11344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
11444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    TerminatorInfo() : Branch(0), Size(0), TargetBlock(0), ExtraRelaxSize(0) {}
11544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  };
11644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
11744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  // Used to keep track of the current position while iterating over the blocks.
11844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  struct BlockPosition {
119487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford    // The address that we assume this position has.
12044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    uint64_t Address;
12144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
12244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // The number of low bits in Address that are known to be the same
12344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // as the runtime address.
12444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    unsigned KnownBits;
12544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
12644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    BlockPosition(unsigned InitialAlignment)
12744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      : Address(0), KnownBits(InitialAlignment) {}
12844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  };
12944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
13044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  class SystemZLongBranch : public MachineFunctionPass {
13144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  public:
13244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    static char ID;
13344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    SystemZLongBranch(const SystemZTargetMachine &tm)
134fc61b6f111af79662baf273c40593a1e8f4dc719Bill Wendling      : MachineFunctionPass(ID), TII(0) {}
13544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
13644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    virtual const char *getPassName() const {
13744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      return "SystemZ Long Branch";
13844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    }
13944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
14044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    bool runOnMachineFunction(MachineFunction &F);
14144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
14244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  private:
14344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    void skipNonTerminators(BlockPosition &Position, MBBInfo &Block);
14444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    void skipTerminator(BlockPosition &Position, TerminatorInfo &Terminator,
14544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford                        bool AssumeRelaxed);
14644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    TerminatorInfo describeTerminator(MachineInstr *MI);
14744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    uint64_t initMBBInfo();
148487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford    bool mustRelaxBranch(const TerminatorInfo &Terminator, uint64_t Address);
14944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    bool mustRelaxABranch();
15044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    void setWorstCaseAddresses();
15193795574785de252703591e7fcc8f052c762f25eRichard Sandiford    void splitBranchOnCount(MachineInstr *MI, unsigned AddOpcode);
152d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford    void splitCompareBranch(MachineInstr *MI, unsigned CompareOpcode);
15344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    void relaxBranch(TerminatorInfo &Terminator);
15444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    void relaxBranches();
15544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
15644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    const SystemZInstrInfo *TII;
15744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    MachineFunction *MF;
15844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    SmallVector<MBBInfo, 16> MBBs;
15944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    SmallVector<TerminatorInfo, 16> Terminators;
16044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  };
16144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
16244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  char SystemZLongBranch::ID = 0;
16344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
16444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  const uint64_t MaxBackwardRange = 0x10000;
16544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  const uint64_t MaxForwardRange = 0xfffe;
16644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford} // end of anonymous namespace
16744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
16844b486ed78c60b50aa14d4eed92ee828d4d44293Richard SandifordFunctionPass *llvm::createSystemZLongBranchPass(SystemZTargetMachine &TM) {
16944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  return new SystemZLongBranch(TM);
17044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford}
17144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
17244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// Position describes the state immediately before Block.  Update Block
17344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// accordingly and move Position to the end of the block's non-terminator
17444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// instructions.
17544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordvoid SystemZLongBranch::skipNonTerminators(BlockPosition &Position,
17644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford                                           MBBInfo &Block) {
17744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  if (Block.Alignment > Position.KnownBits) {
17844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // When calculating the address of Block, we need to conservatively
17944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // assume that Block had the worst possible misalignment.
18044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    Position.Address += ((uint64_t(1) << Block.Alignment) -
18144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford                         (uint64_t(1) << Position.KnownBits));
18244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    Position.KnownBits = Block.Alignment;
18344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  }
18444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
18544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  // Align the addresses.
18644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  uint64_t AlignMask = (uint64_t(1) << Block.Alignment) - 1;
18744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  Position.Address = (Position.Address + AlignMask) & ~AlignMask;
18844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
18944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  // Record the block's position.
19044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  Block.Address = Position.Address;
19144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
19244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  // Move past the non-terminators in the block.
19344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  Position.Address += Block.Size;
19444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford}
19544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
19644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// Position describes the state immediately before Terminator.
19744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// Update Terminator accordingly and move Position past it.
19844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// Assume that Terminator will be relaxed if AssumeRelaxed.
19944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordvoid SystemZLongBranch::skipTerminator(BlockPosition &Position,
20044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford                                       TerminatorInfo &Terminator,
20144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford                                       bool AssumeRelaxed) {
20244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  Terminator.Address = Position.Address;
20344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  Position.Address += Terminator.Size;
20444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  if (AssumeRelaxed)
20544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    Position.Address += Terminator.ExtraRelaxSize;
20644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford}
20744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
20844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// Return a description of terminator instruction MI.
20944b486ed78c60b50aa14d4eed92ee828d4d44293Richard SandifordTerminatorInfo SystemZLongBranch::describeTerminator(MachineInstr *MI) {
21044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  TerminatorInfo Terminator;
21144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  Terminator.Size = TII->getInstSizeInBytes(MI);
21244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  if (MI->isConditionalBranch() || MI->isUnconditionalBranch()) {
21344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    switch (MI->getOpcode()) {
21444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    case SystemZ::J:
21544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      // Relaxes to JG, which is 2 bytes longer.
21644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      Terminator.ExtraRelaxSize = 2;
21744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      break;
21844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    case SystemZ::BRC:
21906c3c9a9e1cc313d911e939e3e994feaf43cc3a7Richard Sandiford      // Relaxes to BRCL, which is 2 bytes longer.
22044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      Terminator.ExtraRelaxSize = 2;
22144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      break;
22293795574785de252703591e7fcc8f052c762f25eRichard Sandiford    case SystemZ::BRCT:
22393795574785de252703591e7fcc8f052c762f25eRichard Sandiford    case SystemZ::BRCTG:
22493795574785de252703591e7fcc8f052c762f25eRichard Sandiford      // Relaxes to A(G)HI and BRCL, which is 6 bytes longer.
22593795574785de252703591e7fcc8f052c762f25eRichard Sandiford      Terminator.ExtraRelaxSize = 6;
22693795574785de252703591e7fcc8f052c762f25eRichard Sandiford      break;
227d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford    case SystemZ::CRJ:
228e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    case SystemZ::CLRJ:
229e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford      // Relaxes to a C(L)R/BRCL sequence, which is 2 bytes longer.
230d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford      Terminator.ExtraRelaxSize = 2;
231d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford      break;
232d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford    case SystemZ::CGRJ:
233e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    case SystemZ::CLGRJ:
234e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford      // Relaxes to a C(L)GR/BRCL sequence, which is 4 bytes longer.
235d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford      Terminator.ExtraRelaxSize = 4;
236d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford      break;
2372d664abbfca8b9fa3d99e8a2f74bd52faf007f12Richard Sandiford    case SystemZ::CIJ:
2382d664abbfca8b9fa3d99e8a2f74bd52faf007f12Richard Sandiford    case SystemZ::CGIJ:
2392d664abbfca8b9fa3d99e8a2f74bd52faf007f12Richard Sandiford      // Relaxes to a C(G)HI/BRCL sequence, which is 4 bytes longer.
2402d664abbfca8b9fa3d99e8a2f74bd52faf007f12Richard Sandiford      Terminator.ExtraRelaxSize = 4;
2412d664abbfca8b9fa3d99e8a2f74bd52faf007f12Richard Sandiford      break;
242e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    case SystemZ::CLIJ:
243e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    case SystemZ::CLGIJ:
244e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford      // Relaxes to a CL(G)FI/BRCL sequence, which is 6 bytes longer.
245e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford      Terminator.ExtraRelaxSize = 6;
246e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford      break;
24744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    default:
24844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      llvm_unreachable("Unrecognized branch instruction");
24944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    }
25006c3c9a9e1cc313d911e939e3e994feaf43cc3a7Richard Sandiford    Terminator.Branch = MI;
25106c3c9a9e1cc313d911e939e3e994feaf43cc3a7Richard Sandiford    Terminator.TargetBlock =
25206c3c9a9e1cc313d911e939e3e994feaf43cc3a7Richard Sandiford      TII->getBranchInfo(MI).Target->getMBB()->getNumber();
25344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  }
25444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  return Terminator;
25544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford}
25644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
25744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// Fill MBBs and Terminators, setting the addresses on the assumption
25844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// that no branches need relaxation.  Return the size of the function under
25944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// this assumption.
26044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiforduint64_t SystemZLongBranch::initMBBInfo() {
26144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  MF->RenumberBlocks();
26244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  unsigned NumBlocks = MF->size();
26344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
26444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  MBBs.clear();
26544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  MBBs.resize(NumBlocks);
26644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
26744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  Terminators.clear();
26844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  Terminators.reserve(NumBlocks);
26944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
27044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  BlockPosition Position(MF->getAlignment());
27144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  for (unsigned I = 0; I < NumBlocks; ++I) {
27244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    MachineBasicBlock *MBB = MF->getBlockNumbered(I);
27344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    MBBInfo &Block = MBBs[I];
27444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
27544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // Record the alignment, for quick access.
27644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    Block.Alignment = MBB->getAlignment();
27744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
27844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // Calculate the size of the fixed part of the block.
27944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    MachineBasicBlock::iterator MI = MBB->begin();
28044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    MachineBasicBlock::iterator End = MBB->end();
28144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    while (MI != End && !MI->isTerminator()) {
28266fbb4781841a8411a772b6909a7e0de182b896fRichard Sandiford      Block.Size += TII->getInstSizeInBytes(MI);
28344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      ++MI;
28444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    }
28544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    skipNonTerminators(Position, Block);
28644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
28744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    // Add the terminators.
28844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    while (MI != End) {
28944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      if (!MI->isDebugValue()) {
29044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford        assert(MI->isTerminator() && "Terminator followed by non-terminator");
29144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford        Terminators.push_back(describeTerminator(MI));
29244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford        skipTerminator(Position, Terminators.back(), false);
29344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford        ++Block.NumTerminators;
29444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      }
29544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      ++MI;
29644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    }
29744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  }
29844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
29944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  return Position.Address;
30044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford}
30144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
302487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford// Return true if, under current assumptions, Terminator would need to be
303487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford// relaxed if it were placed at address Address.
304487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandifordbool SystemZLongBranch::mustRelaxBranch(const TerminatorInfo &Terminator,
305487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford                                        uint64_t Address) {
30644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  if (!Terminator.Branch)
30744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    return false;
30844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
30944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  const MBBInfo &Target = MBBs[Terminator.TargetBlock];
310487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford  if (Address >= Target.Address) {
311487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford    if (Address - Target.Address <= MaxBackwardRange)
31244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      return false;
31344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  } else {
314487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford    if (Target.Address - Address <= MaxForwardRange)
31544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      return false;
31644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  }
31744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
31844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  return true;
31944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford}
32044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
32144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// Return true if, under current assumptions, any terminator needs
32244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// to be relaxed.
32344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordbool SystemZLongBranch::mustRelaxABranch() {
3246227d5c690504c7ada5780c00a635b282c46e275Craig Topper  for (SmallVectorImpl<TerminatorInfo>::iterator TI = Terminators.begin(),
32544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford         TE = Terminators.end(); TI != TE; ++TI)
326487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford    if (mustRelaxBranch(*TI, TI->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());
3366227d5c690504c7ada5780c00a635b282c46e275Craig Topper  for (SmallVectorImpl<MBBInfo>::iterator BI = MBBs.begin(), BE = MBBs.end();
33744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford       BI != BE; ++BI) {
33844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    skipNonTerminators(Position, *BI);
33944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    for (unsigned BTI = 0, BTE = BI->NumTerminators; BTI != BTE; ++BTI) {
34044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      skipTerminator(Position, *TI, true);
34144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford      ++TI;
34244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    }
34344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  }
34444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford}
34544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
34693795574785de252703591e7fcc8f052c762f25eRichard Sandiford// Split BRANCH ON COUNT MI into the addition given by AddOpcode followed
34793795574785de252703591e7fcc8f052c762f25eRichard Sandiford// by a BRCL on the result.
34893795574785de252703591e7fcc8f052c762f25eRichard Sandifordvoid SystemZLongBranch::splitBranchOnCount(MachineInstr *MI,
34993795574785de252703591e7fcc8f052c762f25eRichard Sandiford                                           unsigned AddOpcode) {
35093795574785de252703591e7fcc8f052c762f25eRichard Sandiford  MachineBasicBlock *MBB = MI->getParent();
35193795574785de252703591e7fcc8f052c762f25eRichard Sandiford  DebugLoc DL = MI->getDebugLoc();
35293795574785de252703591e7fcc8f052c762f25eRichard Sandiford  BuildMI(*MBB, MI, DL, TII->get(AddOpcode))
35393795574785de252703591e7fcc8f052c762f25eRichard Sandiford    .addOperand(MI->getOperand(0))
35493795574785de252703591e7fcc8f052c762f25eRichard Sandiford    .addOperand(MI->getOperand(1))
35593795574785de252703591e7fcc8f052c762f25eRichard Sandiford    .addImm(-1);
35693795574785de252703591e7fcc8f052c762f25eRichard Sandiford  MachineInstr *BRCL = BuildMI(*MBB, MI, DL, TII->get(SystemZ::BRCL))
35793795574785de252703591e7fcc8f052c762f25eRichard Sandiford    .addImm(SystemZ::CCMASK_ICMP)
35893795574785de252703591e7fcc8f052c762f25eRichard Sandiford    .addImm(SystemZ::CCMASK_CMP_NE)
35993795574785de252703591e7fcc8f052c762f25eRichard Sandiford    .addOperand(MI->getOperand(2));
36093795574785de252703591e7fcc8f052c762f25eRichard Sandiford  // The implicit use of CC is a killing use.
36193795574785de252703591e7fcc8f052c762f25eRichard Sandiford  BRCL->addRegisterKilled(SystemZ::CC, &TII->getRegisterInfo());
36293795574785de252703591e7fcc8f052c762f25eRichard Sandiford  MI->eraseFromParent();
36393795574785de252703591e7fcc8f052c762f25eRichard Sandiford}
36493795574785de252703591e7fcc8f052c762f25eRichard Sandiford
365d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford// Split MI into the comparison given by CompareOpcode followed
366d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford// a BRCL on the result.
367d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandifordvoid SystemZLongBranch::splitCompareBranch(MachineInstr *MI,
368d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford                                           unsigned CompareOpcode) {
369d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford  MachineBasicBlock *MBB = MI->getParent();
370d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford  DebugLoc DL = MI->getDebugLoc();
371d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford  BuildMI(*MBB, MI, DL, TII->get(CompareOpcode))
372d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford    .addOperand(MI->getOperand(0))
373d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford    .addOperand(MI->getOperand(1));
374d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford  MachineInstr *BRCL = BuildMI(*MBB, MI, DL, TII->get(SystemZ::BRCL))
3756824f127f90197b26af93cf5d6c13b7941567e54Richard Sandiford    .addImm(SystemZ::CCMASK_ICMP)
376d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford    .addOperand(MI->getOperand(2))
377d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford    .addOperand(MI->getOperand(3));
378d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford  // The implicit use of CC is a killing use.
3796824f127f90197b26af93cf5d6c13b7941567e54Richard Sandiford  BRCL->addRegisterKilled(SystemZ::CC, &TII->getRegisterInfo());
380d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford  MI->eraseFromParent();
381d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford}
382d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford
38344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford// Relax the branch described by Terminator.
38444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordvoid SystemZLongBranch::relaxBranch(TerminatorInfo &Terminator) {
38544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  MachineInstr *Branch = Terminator.Branch;
38644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  switch (Branch->getOpcode()) {
387275428fe4abd4bd690456d29c7c54143d653cb4fRichard Sandiford  case SystemZ::J:
388275428fe4abd4bd690456d29c7c54143d653cb4fRichard Sandiford    Branch->setDesc(TII->get(SystemZ::JG));
389275428fe4abd4bd690456d29c7c54143d653cb4fRichard Sandiford    break;
390275428fe4abd4bd690456d29c7c54143d653cb4fRichard Sandiford  case SystemZ::BRC:
391275428fe4abd4bd690456d29c7c54143d653cb4fRichard Sandiford    Branch->setDesc(TII->get(SystemZ::BRCL));
392275428fe4abd4bd690456d29c7c54143d653cb4fRichard Sandiford    break;
39393795574785de252703591e7fcc8f052c762f25eRichard Sandiford  case SystemZ::BRCT:
39493795574785de252703591e7fcc8f052c762f25eRichard Sandiford    splitBranchOnCount(Branch, SystemZ::AHI);
39593795574785de252703591e7fcc8f052c762f25eRichard Sandiford    break;
39693795574785de252703591e7fcc8f052c762f25eRichard Sandiford  case SystemZ::BRCTG:
39793795574785de252703591e7fcc8f052c762f25eRichard Sandiford    splitBranchOnCount(Branch, SystemZ::AGHI);
39893795574785de252703591e7fcc8f052c762f25eRichard Sandiford    break;
399d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford  case SystemZ::CRJ:
400d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford    splitCompareBranch(Branch, SystemZ::CR);
401d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford    break;
402d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford  case SystemZ::CGRJ:
403d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford    splitCompareBranch(Branch, SystemZ::CGR);
404d50bcb2162a529534da42748ab4a418bfc9aaf06Richard Sandiford    break;
4052d664abbfca8b9fa3d99e8a2f74bd52faf007f12Richard Sandiford  case SystemZ::CIJ:
4062d664abbfca8b9fa3d99e8a2f74bd52faf007f12Richard Sandiford    splitCompareBranch(Branch, SystemZ::CHI);
4072d664abbfca8b9fa3d99e8a2f74bd52faf007f12Richard Sandiford    break;
4082d664abbfca8b9fa3d99e8a2f74bd52faf007f12Richard Sandiford  case SystemZ::CGIJ:
4092d664abbfca8b9fa3d99e8a2f74bd52faf007f12Richard Sandiford    splitCompareBranch(Branch, SystemZ::CGHI);
4102d664abbfca8b9fa3d99e8a2f74bd52faf007f12Richard Sandiford    break;
411e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford  case SystemZ::CLRJ:
412e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    splitCompareBranch(Branch, SystemZ::CLR);
413e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    break;
414e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford  case SystemZ::CLGRJ:
415e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    splitCompareBranch(Branch, SystemZ::CLGR);
416e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    break;
417e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford  case SystemZ::CLIJ:
418e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    splitCompareBranch(Branch, SystemZ::CLFI);
419e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    break;
420e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford  case SystemZ::CLGIJ:
421e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    splitCompareBranch(Branch, SystemZ::CLGFI);
422e2d6f91d63a2e8cf77b07794cda7d9ef72504769Richard Sandiford    break;
423275428fe4abd4bd690456d29c7c54143d653cb4fRichard Sandiford  default:
424275428fe4abd4bd690456d29c7c54143d653cb4fRichard Sandiford    llvm_unreachable("Unrecognized branch");
425275428fe4abd4bd690456d29c7c54143d653cb4fRichard Sandiford  }
42644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
42744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  Terminator.Size += Terminator.ExtraRelaxSize;
42844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  Terminator.ExtraRelaxSize = 0;
42944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  Terminator.Branch = 0;
43044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
43144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  ++LongBranches;
43244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford}
43344b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
434487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford// Run a shortening pass and relax any branches that need to be relaxed.
43544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordvoid SystemZLongBranch::relaxBranches() {
436487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford  SmallVector<TerminatorInfo, 16>::iterator TI = Terminators.begin();
437487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford  BlockPosition Position(MF->getAlignment());
4386227d5c690504c7ada5780c00a635b282c46e275Craig Topper  for (SmallVectorImpl<MBBInfo>::iterator BI = MBBs.begin(), BE = MBBs.end();
439487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford       BI != BE; ++BI) {
440487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford    skipNonTerminators(Position, *BI);
441487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford    for (unsigned BTI = 0, BTE = BI->NumTerminators; BTI != BTE; ++BTI) {
442487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford      assert(Position.Address <= TI->Address &&
443487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford             "Addresses shouldn't go forwards");
444487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford      if (mustRelaxBranch(*TI, Position.Address))
445487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford        relaxBranch(*TI);
446487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford      skipTerminator(Position, *TI, false);
447487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford      ++TI;
448487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford    }
449487399a60f9e4e8263317038d779caa6b68ea61aRichard Sandiford  }
45044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford}
45144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
45244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandifordbool SystemZLongBranch::runOnMachineFunction(MachineFunction &F) {
453fc61b6f111af79662baf273c40593a1e8f4dc719Bill Wendling  TII = static_cast<const SystemZInstrInfo *>(F.getTarget().getInstrInfo());
45444b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  MF = &F;
45544b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  uint64_t Size = initMBBInfo();
45644b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  if (Size <= MaxForwardRange || !mustRelaxABranch())
45744b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford    return false;
45844b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford
45944b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  setWorstCaseAddresses();
46044b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  relaxBranches();
46144b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford  return true;
46244b486ed78c60b50aa14d4eed92ee828d4d44293Richard Sandiford}
463