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