LLVM 22.0.0git
|
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/Analysis/DomTreeUpdater.h"
#include "llvm/CodeGen/IndirectBrExpand.h"
#include "llvm/CodeGen/TargetPassConfig.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Instructions.h"
#include "llvm/InitializePasses.h"
#include "llvm/Pass.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Target/TargetMachine.h"
#include <optional>
Go to the source code of this file.
Macros | |
#define | DEBUG_TYPE "indirectbr-expand" |
Functions | |
static bool | runImpl (Function &F, const TargetLowering *TLI, DomTreeUpdater *DTU) |
INITIALIZE_PASS_BEGIN (IndirectBrExpandLegacyPass, DEBUG_TYPE, "Expand indirectbr instructions", false, false) INITIALIZE_PASS_END(IndirectBrExpandLegacyPass |
Variables | |
DEBUG_TYPE | |
Expand indirectbr | instructions |
Expand indirectbr | false |
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.
#define DEBUG_TYPE "indirectbr-expand" |
Definition at line 48 of file IndirectBrExpandPass.cpp.
INITIALIZE_PASS_BEGIN | ( | IndirectBrExpandLegacyPass | , |
DEBUG_TYPE | , | ||
"Expand indirectbr instructions" | , | ||
false | , | ||
false | ) |
References DEBUG_TYPE, and INITIALIZE_PASS_DEPENDENCY.
|
static |
Definition at line 102 of file IndirectBrExpandPass.cpp.
References llvm::GenericDomTreeUpdater< DerivedT, DomTreeT, PostDomTreeT >::applyUpdates(), assert(), llvm::cast(), llvm::SmallPtrSetImpl< PtrType >::count(), llvm::BasicBlock::Create(), llvm::BranchInst::Create(), llvm::PHINode::Create(), llvm::SwitchInst::Create(), llvm::CastInst::CreatePointerCast(), llvm::DominatorTreeBase< BasicBlock, false >::Delete, DL, llvm::dyn_cast(), llvm::SmallVectorTemplateCommon< T, typename >::empty(), llvm::Instruction::eraseFromParent(), F, llvm::find_if(), llvm::IntegerType::getBitWidth(), llvm::ConstantExpr::getIntToPtr(), llvm::ilist_node_impl< OptionsT >::getIterator(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), llvm::Value::getType(), llvm::DominatorTreeBase< BasicBlock, false >::Insert, llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::SmallPtrSetImpl< PtrType >::insert_range(), llvm::isa(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::SmallVectorImpl< T >::reserve(), llvm::seq(), llvm::SmallPtrSetImplBase::size(), llvm::SmallVectorTemplateCommon< T, typename >::size(), and llvm::IndirectBrInst::successors().
DEBUG_TYPE |
Definition at line 95 of file IndirectBrExpandPass.cpp.
Expand indirectbr false |
Definition at line 96 of file IndirectBrExpandPass.cpp.
Expand indirectbr instructions |
Definition at line 96 of file IndirectBrExpandPass.cpp.