本文整理汇总了C++中IR::is_goto方法的典型用法代码示例。如果您正苦于以下问题:C++ IR::is_goto方法的具体用法?C++ IR::is_goto怎么用?C++ IR::is_goto使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IR
的用法示例。
在下文中一共展示了IR::is_goto方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ASSERT
//The followed forms
// if (cond) {
// t=1
// a=1
// goto L1;
// }
// f=1
// goto L2;
// L1:
//
//is replaced with
//
// if (!cond) {
// f=1
// goto L2;
// }
// t=1
// a=1
// L1:
//
//'goto L1' is removed and free, and L1 is removed if it is not a target
//of some other instruction.
bool IR_CFS_OPT::transformIf1(IR ** head, IR * ir)
{
ASSERT(head && *head, ("invalid parameter"));
if (ir == NULL || !ir->is_if()) { return false; }
//Check true part.
IR * t = IF_truebody(ir);
while (t != NULL) {
if (!is_non_branch_ir(t)) {
break;
}
t = t->get_next();
}
if (t != NULL && t->get_next() == NULL && t->is_goto()) {
IR * first_goto = t;
t = ir->get_next();
while (t != NULL) {
if (!is_non_branch_ir(t)) { break; }
t = t->get_next();
}
if (t != NULL && t->is_goto()) {
IR * second_goto = t;
if (IR_next(second_goto) != NULL &&
IR_next(second_goto)->is_lab() &&
isSameLabel(GOTO_lab(first_goto),
LAB_lab(IR_next(second_goto)))) {
//Start transforming.
m_ru->invertCondition(&IF_det(ir));
IR * new_list1 = NULL;
IR * new_list2 = NULL;
t = IF_truebody(ir);
//Split true body of IF.
IR * last = NULL;
while (t != first_goto) {
IR * c = t;
t = t->get_next();
xcom::remove(&IF_truebody(ir), c);
xcom::add_next(&new_list1, &last, c);
}
ASSERT(t && t == first_goto, ("invalid control flow"));
xcom::remove(&IF_truebody(ir), first_goto);
m_ru->freeIRTree(first_goto);
//Split all irs between IF and L1.
t = ir->get_next();
while (t != second_goto) {
IR * c = t;
t = t->get_next();
xcom::remove(head, c);
xcom::add_next(&new_list2, c);
}
ASSERT(t != NULL && t == second_goto, ("???"));
xcom::remove(head, second_goto);
xcom::add_next(&new_list2, second_goto);
//Swap new_list1 and new_list2
xcom::insertbefore(&IF_truebody(ir), IF_truebody(ir), new_list2);
//Update the IR_parent for new_list2.
for (IR * tmp = new_list2; tmp != NULL; tmp = IR_next(tmp)) {
IR_parent(tmp) = ir;
}
ASSERT(IF_truebody(ir) == new_list2, ("illegal insertbefore<T>"));
xcom::insertafter(&ir, new_list1);
//Update the IR_parent for new_list1.
for (IR * tmp = new_list1; tmp != NULL; tmp = IR_next(tmp)) {
IR_parent(tmp) = IR_parent(ir);
}
//.........这里部分代码省略.........