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