diff --git a/src/mapleall/maple_me/src/dse.cpp b/src/mapleall/maple_me/src/dse.cpp index e6b31d30572800bf6eaa5d9186ff21d0fab1117b..17ed67c1bf87b7b4d683c2f15ce8107f92ee23e1 100644 --- a/src/mapleall/maple_me/src/dse.cpp +++ b/src/mapleall/maple_me/src/dse.cpp @@ -37,6 +37,10 @@ using namespace utils; bool DSE::ExprHasSideEffect(const BaseNode &expr) const { Opcode op = expr.GetOpCode(); + // in c language, OP_array and OP_div has no side-effect + if (ssaTab.GetModule().IsCModule() && (op == OP_array || op == OP_div)) { + return false; + } if (kOpcodeInfo.HasSideEffect(op)) { return true; } diff --git a/src/mapleall/maple_me/src/hdse.cpp b/src/mapleall/maple_me/src/hdse.cpp index 6326d9581acf8f5fa6dbcb89176b942f73fdd1d8..e09600b96ee312c41e2fc1c6cc86cd1e31ed8f51 100644 --- a/src/mapleall/maple_me/src/hdse.cpp +++ b/src/mapleall/maple_me/src/hdse.cpp @@ -378,8 +378,8 @@ void HDSE::PropagateUseLive(MeExpr &meExpr) { bool HDSE::ExprHasSideEffect(const MeExpr &meExpr) const { Opcode op = meExpr.GetOp(); - // in c language, OP_array has no side-effect - if (mirModule.IsCModule() && op == OP_array) { + // in c language, OP_array and OP_div has no side-effect + if (mirModule.IsCModule() && (op == OP_array || op == OP_div)) { return false; } if (kOpcodeInfo.HasSideEffect(op)) { diff --git a/src/mapleall/maple_me/src/lfo_iv_canon.cpp b/src/mapleall/maple_me/src/lfo_iv_canon.cpp index 5b5ba3ecc95b7d020ce1502f44d51cf97f0a7570..a4389619a72e519fab7b119ea4a1655c0ca9c869 100644 --- a/src/mapleall/maple_me/src/lfo_iv_canon.cpp +++ b/src/mapleall/maple_me/src/lfo_iv_canon.cpp @@ -40,6 +40,14 @@ bool IVCanon::ResolveExprValue(MeExpr *x, ScalarMeExpr *phiLHS) { return false; } AssignMeStmt *defStmt = static_cast(scalar->GetDefStmt()); + if (defStmt->GetOp() == OP_dassign) { + // defstmt is %post = i, i is identified as IV + // set %post is IV and use i's step value + scalar = dynamic_cast(defStmt->GetRHS()); + if (scalar && scalar->GetOst() && IsScalarIV(scalar->GetOst())) { + return true; + } + } return ResolveExprValue(defStmt->GetRHS(), phiLHS); } case kMeOpOp: { // restricting to only + and - for now @@ -74,6 +82,17 @@ int32 IVCanon::ComputeIncrAmt(MeExpr *x, ScalarMeExpr *phiLHS, int32 *appearance ScalarMeExpr *scalar = static_cast(x); CHECK_FATAL(scalar->GetDefBy() == kDefByStmt, "ComputeIncrAmt: cannot be here"); AssignMeStmt *defstmt = static_cast(scalar->GetDefStmt()); +<<<<<<< fredchow_hdse3 + if (defstmt->GetOp() == OP_dassign) { + scalar = dynamic_cast(defstmt->GetRHS()); + if (scalar && scalar->GetOst() && IsScalarIV(scalar->GetOst())) { + int32_t stepVal = 0; + if (IsScalarIV(scalar->GetOst(), &stepVal)) { + *appearances = 1; + return stepVal; + } + } + } return ComputeIncrAmt(defstmt->GetRHS(), phiLHS, appearances); } case kMeOpOp: {