diff --git a/SMPDataFlowAnalysis.cpp b/SMPDataFlowAnalysis.cpp index e002dc9eb5723e5baa94fa27ca1f4ae84d4bec0c..261ab46cdacfeb7f6e6ca81ec8aba1f93366eebf 100644 --- a/SMPDataFlowAnalysis.cpp +++ b/SMPDataFlowAnalysis.cpp @@ -403,6 +403,11 @@ bool MDIsFlagsReg(op_t CurrOp) { return ((o_reg == CurrOp.type) && CurrOp.is_reg(X86_FLAGS_REG)); } +// MACHINE DEPENDENT: Is register a stack pointer or frame pointer? +bool MDIsStackPtrReg(int RegNumber, bool UseFP) { + return ((RegNumber == R_sp) || (UseFP && (RegNumber == R_bp))); +} + // MACHINE DEPENDENT: Is operand a stack memory access? bool MDIsStackAccessOpnd(op_t CurrOp, bool UseFP) { int BaseReg; @@ -415,7 +420,7 @@ bool MDIsStackAccessOpnd(op_t CurrOp, bool UseFP) { } MDExtractAddressFields(CurrOp, BaseReg, IndexReg, ScaleFactor, offset); - return ((BaseReg == R_sp) || (UseFP && (BaseReg == R_bp))); + return MDIsStackPtrReg(BaseReg, UseFP); } // end of MDIsStackAccessOpnd() // MACHINE DEPENDENT: Is operand a caller-saved register? diff --git a/SMPDataFlowAnalysis.h b/SMPDataFlowAnalysis.h index 72ac5a5a9c87bbe9c625e67ea80898277220ce43..c59cd50b1917518a0149ee70fdee426ea31c09e7 100644 --- a/SMPDataFlowAnalysis.h +++ b/SMPDataFlowAnalysis.h @@ -124,6 +124,9 @@ bool MDIsFlagsReg(op_t CurrOp); // MACHINE DEPENDENT: Is operand a stack memory access? bool MDIsStackAccessOpnd(op_t CurrOp, bool UseFP); +// MACHINE DEPENDENT: Is register a stack pointer or frame pointer? +bool MDIsStackPtrReg(int RegNumber, bool UseFP); + // MACHINE DEPENDENT: Is operand a caller-saved register? bool MDIsCallerSavedReg(op_t CurrOp); diff --git a/SMPInstr.cpp b/SMPInstr.cpp index b20d5ecacad409348e5eb062899ecd97d64d2741..d3fdf2cf706d0e95a1e7d10e7dabc6c341ea605f 100644 --- a/SMPInstr.cpp +++ b/SMPInstr.cpp @@ -4819,10 +4819,11 @@ unsigned short SMPInstr::SignMaskUnionFromUseRegs(void) { size_t RegOpCount = 0; int UseHashValue; struct FineGrainedInfo UseFGInfo, DefFGInfo; + bool UseFP = this->GetBlock()->GetFunc()->UsesFramePointer(); for (UseIter = this->GetFirstUse(); UseIter != this->GetLastUse(); ++UseIter) { UseOp = UseIter->GetOp(); - if (MDIsGeneralPurposeReg(UseOp)) { + if (MDIsGeneralPurposeReg(UseOp) && (!MDIsStackPtrReg(UseOp.reg, UseFP))) { ++RegOpCount; UseHashValue = HashGlobalNameAndSSA(UseOp, UseIter->GetSSANum()); bool LocalUseName = this->BasicBlock->IsLocalName(UseOp);