LLVM  9.0.0svn
IndirectBrExpandPass.cpp File Reference

Implements an expansion pass to turn indirectbr instructions in the IR into switch instructions. More...

#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/Sequence.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/CodeGen/TargetPassConfig.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/InstIterator.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/Pass.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetMachine.h"
Include dependency graph for IndirectBrExpandPass.cpp:

Go to the source code of this file.

## Macros

#define DEBUG_TYPE   "indirectbr-expand"

## Functions

INITIALIZE_PASS (IndirectBrExpandPass, DEBUG_TYPE, "Expand indirectbr instructions", false, false) FunctionPass *llvm

## Detailed Description

Implements an expansion pass to turn indirectbr instructions in the IR into switch instructions.

This works by enumerating the basic blocks in a dense range of integers, replacing each blockaddr constant with the corresponding integer constant, and then building a switch that maps from the integers to the actual blocks. All of the indirectbr instructions in the function are redirected to this common switch.

While this is generically useful if a target is unable to codegen indirectbr natively, it is primarily useful when there is some desire to get the builtin non-jump-table lowering of a switch even when the input source contained an explicit indirect branch construct.

Note that it doesn't make any sense to enable this pass unless a target also disables jump-table lowering of switches. Doing that is likely to pessimize the code.

Definition in file IndirectBrExpandPass.cpp.

## ◆ DEBUG_TYPE

 #define DEBUG_TYPE   "indirectbr-expand"

Definition at line 47 of file IndirectBrExpandPass.cpp.

## ◆ INITIALIZE_PASS()

 INITIALIZE_PASS ( IndirectBrExpandPass , DEBUG_TYPE , "Expand indirectbr instructions" , false , false )