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