From d933332606b90eb29edfed4fe37689e548dc4b72 Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Thu, 24 Jun 2021 20:33:16 -0700 Subject: [PATCH 1/3] Make constantfold accumulate constant add/sub across multipliation-by-constant --- src/mapleall/maple_ir/src/mir_lower.cpp | 6 +++--- src/mapleall/mpl2mpl/src/constantfold.cpp | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/mapleall/maple_ir/src/mir_lower.cpp b/src/mapleall/maple_ir/src/mir_lower.cpp index 0f9d654a6a..a328eaa8ff 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 56614f99d5..ddb541374b 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()) && IsPrimitiveInteger(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; -- Gitee From fa6c461c49809823a783bc0cae1ca8afbd882b0a Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Thu, 24 Jun 2021 20:33:16 -0700 Subject: [PATCH 2/3] Make constantfold accumulate constant add/sub across multipliation-by-constant --- src/mapleall/maple_ir/src/mir_lower.cpp | 6 +++--- src/mapleall/mpl2mpl/src/constantfold.cpp | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/mapleall/maple_ir/src/mir_lower.cpp b/src/mapleall/maple_ir/src/mir_lower.cpp index 0f9d654a6a..a328eaa8ff 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 56614f99d5..ddb541374b 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()) && IsPrimitiveInteger(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; -- Gitee From ae16a254bd1e55fc4583acbee0c78af71d169461 Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Tue, 29 Jun 2021 17:22:38 -0700 Subject: [PATCH 3/3] adjust the code related to accumulating constants across OP_cvt to fix a bug --- src/mapleall/mpl2mpl/src/constantfold.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mapleall/mpl2mpl/src/constantfold.cpp b/src/mapleall/mpl2mpl/src/constantfold.cpp index ddb541374b..c9d55e0b1a 100644 --- a/src/mapleall/mpl2mpl/src/constantfold.cpp +++ b/src/mapleall/mpl2mpl/src/constantfold.cpp @@ -1448,7 +1448,7 @@ std::pair ConstantFold::FoldTypeCvt(TypeCvtNode *node) { return p; // the cvt is redundant } } else if (node->GetOpCode() == OP_cvt && p.second != 0 && - IsUnsignedInteger(node->GetPrimType()) && IsPrimitiveInteger(node->FromType()) && + 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); -- Gitee