本文整理汇总了C++中IRInstruction::getTaken方法的典型用法代码示例。如果您正苦于以下问题:C++ IRInstruction::getTaken方法的具体用法?C++ IRInstruction::getTaken怎么用?C++ IRInstruction::getTaken使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IRInstruction
的用法示例。
在下文中一共展示了IRInstruction::getTaken方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: hoistGuardJumps
// If main trace starts with guards, have them generate a patchable jump
// to the anchor trace
static void hoistGuardJumps(Trace* trace, IRFactory* irFactory) {
Block* guardLabel = nullptr;
// Check the beginning of the trace for guards
for (Block* block : trace->getBlocks()) {
for (IRInstruction& instr : *block) {
IRInstruction* inst = &instr;
Opcode opc = inst->getOpcode();
if (inst->getTaken() &&
(opc == LdLoc || opc == LdStack ||
opc == GuardLoc || opc == GuardStk)) {
Block* exitLabel = inst->getTaken();
// Find the GuardFailure's label and confirm this branches there
if (!guardLabel && exitLabel->getTrace() != trace) {
auto instIter = exitLabel->skipLabel();
// Confirm this is a GuardExit
for (auto it = instIter, end = exitLabel->end(); it != end; ++it) {
Opcode op = it->getOpcode();
if (op == Marker) {
continue;
}
if (op == ExitGuardFailure) {
guardLabel = exitLabel;
}
// Do not optimize if other instructions are on exit trace
break;
}
}
if (exitLabel == guardLabel) {
inst->setTCA(kIRDirectGuardActive);
continue;
}
return; // terminate search
}
if (opc == Marker || opc == DefLabel || opc == DefSP || opc == DefFP ||
opc == LdStack) {
continue;
}
return; // terminate search
}
}
}
示例2: hoistGuardToLoad
/*
* Looks for whether the value in tmp was defined by a load, and if
* so, changes that load into a load that guards on the given
* type. Returns true if it succeeds.
*/
static bool hoistGuardToLoad(SSATmp* tmp, Type type) {
IRInstruction* inst = tmp->getInstruction();
switch (inst->getOpcode()) {
case Mov:
case IncRef:
{
// if inst is an incref or move, then chase down its src
if (hoistGuardToLoad(inst->getSrc(0), type)) {
// guard was successfully attached to a load instruction
// refine the type of this mov/incref
// Note: We can also further simplify incref's here if type is not
// ref-counted
tmp->setType(type);
inst->setTypeParam(type);
return true;
}
break;
}
case LdLoc:
case LdStack:
case LdMem:
case LdProp:
case LdRef:
case LdClsCns:
{
if (!inst->getTaken()) {
// Not a control flow instruction, so can't give it check semantics
break;
}
Type instType = tmp->getType();
if (instType == Type::Gen ||
(instType == Type::Cell && !type.isBoxed())) {
tmp->setType(type);
inst->setTypeParam(type);
return true;
}
break;
}
default:
break;
}
return false;
}