本文整理汇总了C++中IR::is_lt方法的典型用法代码示例。如果您正苦于以下问题:C++ IR::is_lt方法的具体用法?C++ IR::is_lt怎么用?C++ IR::is_lt使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IR
的用法示例。
在下文中一共展示了IR::is_lt方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ASSERT
//The followed forms
// x is signed
// IF(x > 0x7FFFFFFF) {a=1} ELSE {b=1} => b=1
// IF(x < 0x80000000) {a=1} ELSE {b=1} => b=1
//
// x is unsigned
// IF(x > 0xFFFFFFFF){a=1} ELSE {b=1} => b=1
// IF(x < 0x0) {a=1} ELSE {b=1} => b=1
bool IR_CFS_OPT::transformIf3(IR ** head, IR * ir)
{
ASSERT(head && *head, ("invalid parameter"));
if (ir == NULL || !ir->is_if()) { return false; }
IR * det = IF_det(ir);
if (det->is_gt()) {
IR * opnd0 = BIN_opnd0(det);
IR * opnd1 = BIN_opnd1(det);
if (opnd0->is_ld() &&
opnd0->is_int() &&
opnd1->is_const() &&
opnd1->is_int() &&
m_ru->getIntegerInDataTypeValueRange(opnd1) ==
m_ru->getMaxInteger(m_tm->get_dtype_bitsize(
TY_dtype(opnd1->get_type())), opnd1->is_signed())) {
//e.g:
//x is unsigned, if(x>0xFFFFFFFF) {a=1} else {b=1} => b=1
//x is signed, if(x>0x7FFFFFFF) {a=1} else {b=1} => b=1
IR * allocIR = NULL;
if (IF_falsebody(ir) != NULL) {
allocIR = m_ru->dupIRTree(IF_falsebody(ir));
}
xcom::replace(head, ir, allocIR);
if (allocIR != NULL) {
IR_parent(allocIR) = IR_parent(ir);
}
m_ru->freeIRTree(ir);
return true;
}
} else if (det->is_lt()) {
IR * opnd0 = BIN_opnd0(det);
IR * opnd1 = BIN_opnd1(det);
if (opnd0->is_ld() &&
opnd0->is_int() &&
opnd1->is_const() &&
opnd1->is_int() &&
m_ru->getIntegerInDataTypeValueRange(opnd1) ==
m_ru->getMinInteger(m_tm->get_dtype_bitsize(
TY_dtype(opnd1->get_type())), opnd1->is_signed())) {
//x is signed, IF(x < 0x80000000) {a=1} ELSE {b=1} => b=1
IR * allocIR = NULL;
if (IF_falsebody(ir) != NULL) {
allocIR = m_ru->dupIRTree(IF_falsebody(ir));
}
xcom::replace(head, ir, allocIR);
if (allocIR != NULL) {
IR_parent(allocIR) = IR_parent(ir);
}
m_ru->freeIRTree(ir);
return true;
} else if (opnd0->is_ld() &&
opnd1->is_const() &&
opnd0->is_uint() &&
CONST_int_val(opnd1) == 0) {
//x is unsigned, if(x<0) {a=1} else {b=1} => b=1
IR * allocIR = NULL;
if (IF_falsebody(ir) != NULL) {
allocIR = m_ru->dupIRTree(IF_falsebody(ir));
}
xcom::replace(head, ir, allocIR);
if (allocIR != NULL) {
IR_parent(allocIR) = IR_parent(ir);
}
m_ru->freeIRTree(ir);
return true;
}
}
return false;
}