本文整理汇总了C++中ConstantExpr::getAsInstruction方法的典型用法代码示例。如果您正苦于以下问题:C++ ConstantExpr::getAsInstruction方法的具体用法?C++ ConstantExpr::getAsInstruction怎么用?C++ ConstantExpr::getAsInstruction使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ConstantExpr
的用法示例。
在下文中一共展示了ConstantExpr::getAsInstruction方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: EmitBaseConstants
/// \brief Emit materialization code for all rebased constants and update their
/// users.
void ConstantHoisting::EmitBaseConstants(Function &F, User *U,
Instruction *Base, Constant *Offset,
ConstantInt *OriginalConstant) {
if (Instruction *I = dyn_cast<Instruction>(U)) {
Instruction *Mat = Base;
if (!Offset->isNullValue()) {
Mat = BinaryOperator::Create(Instruction::Add, Base, Offset,
"const_mat", getMatInsertPt(I, DT));
// Use the same debug location as the instruction we are about to update.
Mat->setDebugLoc(I->getDebugLoc());
DEBUG(dbgs() << "Materialize constant (" << *Base->getOperand(0)
<< " + " << *Offset << ") in BB "
<< I->getParent()->getName() << '\n' << *Mat << '\n');
}
DEBUG(dbgs() << "Update: " << *I << '\n');
I->replaceUsesOfWith(OriginalConstant, Mat);
DEBUG(dbgs() << "To: " << *I << '\n');
return;
}
assert(isa<ConstantExpr>(U) && "Expected a ConstantExpr.");
ConstantExpr *CE = cast<ConstantExpr>(U);
for (Value::use_iterator UU = CE->use_begin(), E = CE->use_end();
UU != E; ++UU) {
// We only handel instructions here and won't walk down a ConstantExpr chain
// to replace all ConstExpr with instructions.
if (Instruction *I = dyn_cast<Instruction>(*UU)) {
// Only update constant expressions in the current function.
if (I->getParent()->getParent() != &F)
continue;
Instruction *Mat = Base;
Instruction *InsertBefore = getMatInsertPt(I, DT);
if (!Offset->isNullValue()) {
Mat = BinaryOperator::Create(Instruction::Add, Base, Offset,
"const_mat", InsertBefore);
// Use the same debug location as the instruction we are about to
// update.
Mat->setDebugLoc(I->getDebugLoc());
DEBUG(dbgs() << "Materialize constant (" << *Base->getOperand(0)
<< " + " << *Offset << ") in BB "
<< I->getParent()->getName() << '\n' << *Mat << '\n');
}
Instruction *ICE = CE->getAsInstruction();
ICE->replaceUsesOfWith(OriginalConstant, Mat);
ICE->insertBefore(InsertBefore);
// Use the same debug location as the instruction we are about to update.
ICE->setDebugLoc(I->getDebugLoc());
DEBUG(dbgs() << "Create instruction: " << *ICE << '\n');
DEBUG(dbgs() << "Update: " << *I << '\n');
I->replaceUsesOfWith(CE, ICE);
DEBUG(dbgs() << "To: " << *I << '\n');
}
}
}