From b421e5bb7c70282ba0806aa357673191a560e0d7 Mon Sep 17 00:00:00 2001
From: clc5q <clc5q@git.zephyr-software.com>
Date: Sat, 14 Apr 2012 03:09:25 +0000
Subject: [PATCH] Avoid treating stack pointer addressing registers as
 arithmetic operands in signedness inference.

---
 SMPDataFlowAnalysis.cpp | 7 ++++++-
 SMPDataFlowAnalysis.h   | 3 +++
 SMPInstr.cpp            | 3 ++-
 3 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/SMPDataFlowAnalysis.cpp b/SMPDataFlowAnalysis.cpp
index e002dc9e..261ab46c 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 72ac5a5a..c59cd50b 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 b20d5eca..d3fdf2cf 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);
-- 
GitLab