diff --git a/src/mapleall/maple_ir/src/mir_lower.cpp b/src/mapleall/maple_ir/src/mir_lower.cpp index 0f9d654a6af65bc878958a62574593c364c518df..a328eaa8ff87167ab3efdf9295e656890f04fc6c 100644 --- a/src/mapleall/maple_ir/src/mir_lower.cpp +++ b/src/mapleall/maple_ir/src/mir_lower.cpp @@ -506,7 +506,7 @@ BaseNode *MIRLower::LowerCArray(ArrayNode *array) { mpyNode->SetOpnd(mulSize, 0); if (resNode->GetPrimType() != array->GetPrimType()) { resNode = mirModule.CurFuncCodeMemPool()->New(OP_cvt, array->GetPrimType(), - resNode->GetPrimType(), resNode); + GetSignedPrimType(resNode->GetPrimType()), resNode); } mpyNode->SetOpnd(resNode, 1); } @@ -519,7 +519,7 @@ BaseNode *MIRLower::LowerCArray(ArrayNode *array) { newResNode->SetOpnd(mpyNode, 0); if (prevNode->GetPrimType() != array->GetPrimType()) { prevNode = mirModule.CurFuncCodeMemPool()->New(OP_cvt, array->GetPrimType(), - prevNode->GetPrimType(), prevNode); + GetSignedPrimType(prevNode->GetPrimType()), prevNode); } newResNode->SetOpnd(prevNode, 1); prevNode = newResNode; @@ -544,7 +544,7 @@ BaseNode *MIRLower::LowerCArray(ArrayNode *array) { rMul->SetPrimType(array->GetPrimType()); if (resNode->GetPrimType() != array->GetPrimType()) { resNode = mirModule.CurFuncCodeMemPool()->New(OP_cvt, array->GetPrimType(), - resNode->GetPrimType(), resNode); + GetSignedPrimType(resNode->GetPrimType()), resNode); } rMul->SetOpnd(resNode, 0); rMul->SetOpnd(eSize, 1); diff --git a/src/mapleall/mpl2mpl/src/constantfold.cpp b/src/mapleall/mpl2mpl/src/constantfold.cpp index 56614f99d5bd14402d56e87bf68601a30c2b15e5..c9d55e0b1af77e818b3e104a58caa3255c383707 100644 --- a/src/mapleall/mpl2mpl/src/constantfold.cpp +++ b/src/mapleall/mpl2mpl/src/constantfold.cpp @@ -1447,6 +1447,11 @@ std::pair ConstantFold::FoldTypeCvt(TypeCvtNode *node) { (IsPossible32BitAddress(node->FromType()) && IsPossible32BitAddress(node->GetPrimType()))) { return p; // the cvt is redundant } + } else if (node->GetOpCode() == OP_cvt && p.second != 0 && + IsUnsignedInteger(node->GetPrimType()) && IsSignedInteger(node->FromType()) && + GetPrimTypeSize(node->GetPrimType()) > GetPrimTypeSize(node->FromType())) { + result = mirModule->CurFuncCodeMemPool()->New(OP_cvt, node->GetPrimType(), node->FromType(), p.first); + return std::make_pair(result, p.second); } if (result == nullptr) { BaseNode *e = PairToExpr(node->Opnd(0)->GetPrimType(), p); @@ -1612,6 +1617,13 @@ std::pair ConstantFold::FoldBinary(BinaryNode *node) { // 1 * X --> X sum = rp.second; result = r; + } else if (op == OP_mul && rp.second != 0) { + // lConst * (X + konst) -> the pair [(lConst*X), (lConst*konst)] + sum = cst * rp.second; + if (GetPrimTypeSize(primType) > GetPrimTypeSize(rp.first->GetPrimType())) { + rp.first = mirModule->CurFuncCodeMemPool()->New(OP_cvt, primType, PTY_i32, rp.first); + } + result = NewBinaryNode(node, OP_mul, primType, lConst, rp.first); } else if (op == OP_bior && cst == -1) { // (-1) | X -> -1 sum = 0; @@ -1666,6 +1678,13 @@ std::pair ConstantFold::FoldBinary(BinaryNode *node) { // case [X / 1 = X] sum = lp.second; result = l; + } else if (op == OP_mul && lp.second != 0) { + // (X + konst) * rConst -> the pair [(X*rConst), (konst*rConst)] + sum = lp.second * cst; + if (GetPrimTypeSize(primType) > GetPrimTypeSize(lp.first->GetPrimType())) { + lp.first = mirModule->CurFuncCodeMemPool()->New(OP_cvt, primType, PTY_i32, lp.first); + } + result = NewBinaryNode(node, OP_mul, primType, lp.first, rConst); } else if (op == OP_band && cst == -1) { // X & (-1) -> X sum = lp.second;