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);