LLVM 20.0.0git
Macros | Functions | Variables
AArch64PromoteConstant.cpp File Reference
#include "AArch64.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GlobalValue.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/InlineAsm.h"
#include "llvm/IR/InstIterator.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
#include "llvm/InitializePasses.h"
#include "llvm/Pass.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cassert>
#include <utility>

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "aarch64-promote-const"
 

Functions

 STATISTIC (NumPromoted, "Number of promoted constants")
 
 STATISTIC (NumPromotedUses, "Number of promoted constants uses")
 
 INITIALIZE_PASS_BEGIN (AArch64PromoteConstant, "aarch64-promote-const", "AArch64 Promote Constant Pass", false, false) INITIALIZE_PASS_END(AArch64PromoteConstant
 
static bool isConstantUsingVectorTy (const Type *CstTy)
 Check if the given type uses a vector type.
 
static bool containsOnlyConstantData (const Constant *C)
 
static bool shouldConvertUse (const Constant *Cst, const Instruction *Instr, unsigned OpIdx)
 Check if the given use (Instruction + OpIdx) of Cst should be converted into a load of a global variable initialized with Cst.
 
static bool shouldConvertImpl (const Constant *Cst)
 Check if the given Cst should be converted into a load of a global variable initialized with Cst.
 
static bool shouldConvert (Constant &C, AArch64PromoteConstant::PromotionCacheTy &PromotionCache)
 
static void ensurePromotedGV (Function &F, Constant &C, AArch64PromoteConstant::PromotedConstant &PC)
 

Variables

static cl::opt< boolStress ("aarch64-stress-promote-const", cl::Hidden, cl::desc("Promote all vector constants"))
 
aarch64 promote const
 
aarch64 promote AArch64 Promote Constant Pass
 
aarch64 promote AArch64 Promote Constant false
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "aarch64-promote-const"

Definition at line 53 of file AArch64PromoteConstant.cpp.

Function Documentation

◆ containsOnlyConstantData()

static bool containsOnlyConstantData ( const Constant C)
static

Definition at line 255 of file AArch64PromoteConstant.cpp.

References llvm::all_of(), and llvm::CallingConv::C.

◆ ensurePromotedGV()

static void ensurePromotedGV ( Function F,
Constant C,
AArch64PromoteConstant::PromotedConstant &  PC 
)
static

◆ INITIALIZE_PASS_BEGIN()

INITIALIZE_PASS_BEGIN ( AArch64PromoteConstant  ,
"aarch64-promote-const"  ,
"AArch64 Promote Constant Pass"  ,
false  ,
false   
)

◆ isConstantUsingVectorTy()

static bool isConstantUsingVectorTy ( const Type CstTy)
static

◆ shouldConvert()

static bool shouldConvert ( Constant C,
AArch64PromoteConstant::PromotionCacheTy PromotionCache 
)
static

◆ shouldConvertImpl()

static bool shouldConvertImpl ( const Constant Cst)
static

Check if the given Cst should be converted into a load of a global variable initialized with Cst.

A constant should be converted if it is likely that the materialization of the constant will be tricky. Thus, we give up on zero or undef values.

Todo:
Currently, accept only vector related types. Also we give up on all simple vector type to keep the existing behavior. Otherwise, we should push here all the check of the lowering of BUILD_VECTOR. By giving up, we lose the potential benefit of merging constant via global merge and the fact that the same constant is stored only once with this method (versus, as many function that uses the constant for the regular approach, even for float). Again, the simplest solution would be to promote every constant and rematerialize them when they are actually cheap to create.

Definition at line 338 of file AArch64PromoteConstant.cpp.

References llvm::Value::getType(), isConstantUsingVectorTy(), llvm::Type::isVectorTy(), llvm::Constant::isZeroValue(), and Stress.

Referenced by shouldConvert().

◆ shouldConvertUse()

static bool shouldConvertUse ( const Constant Cst,
const Instruction Instr,
unsigned  OpIdx 
)
static

Check if the given use (Instruction + OpIdx) of Cst should be converted into a load of a global variable initialized with Cst.

A use should be converted if it is legal to do so. For instance, it is not legal to turn the mask operand of a shuffle vector into a load of a global variable.

Definition at line 272 of file AArch64PromoteConstant.cpp.

References llvm::CallBase::isInlineAsm().

◆ STATISTIC() [1/2]

STATISTIC ( NumPromoted  ,
"Number of promoted constants"   
)

◆ STATISTIC() [2/2]

STATISTIC ( NumPromotedUses  ,
"Number of promoted constants uses"   
)

Variable Documentation

◆ const

aarch64 promote const

Definition at line 232 of file AArch64PromoteConstant.cpp.

◆ false

aarch64 promote AArch64 Promote Constant false

Definition at line 233 of file AArch64PromoteConstant.cpp.

◆ Pass

aarch64 promote AArch64 Promote Constant Pass

Definition at line 233 of file AArch64PromoteConstant.cpp.

◆ Stress

cl::opt< bool > Stress("aarch64-stress-promote-const", cl::Hidden, cl::desc("Promote all vector constants")) ( "aarch64-stress-promote-const"  ,
cl::Hidden  ,
cl::desc("Promote all vector constants")   
)
static

Referenced by shouldConvertImpl().