diff --git a/SMPFunction.cpp b/SMPFunction.cpp index d876acd48aa785d1b54f459e51f5a7cbc2b645ac..699b4d88e557558a8e4adfe0746060f6a98b0986 100644 --- a/SMPFunction.cpp +++ b/SMPFunction.cpp @@ -89,7 +89,7 @@ using namespace std; #define SMP_DECLARE_INDIRECT_TARGETS_UNSAFE 1 #define SMP_AUDIT_STACK_POINTER_DELTAS 0 #define SMP_COMPARE_IDA_STARS_STACK_POINTER_DELTAS 1 -#define STARS_AGGRESSIVE_SIGNEDNESS_PROPAGATION 0 +#define STARS_AGGRESSIVE_SIGNEDNESS_PROPAGATION 1 // Compute LVA/SSA or not? Turn it off for NICECAP demo on 31-JAN-2008 #define SMP_COMPUTE_LVA_SSA 1 diff --git a/SMPInstr.cpp b/SMPInstr.cpp index c3b905f04db14c8c86e21764eeb10fe831a1f118..6019786115f8674c25eb6305f609cd1174007647 100644 --- a/SMPInstr.cpp +++ b/SMPInstr.cpp @@ -5370,6 +5370,13 @@ bool SMPInstr::UpdateDefOpFGInfo(op_t DefOp, struct FineGrainedInfo NewFG) { // Get old FG info from function level. OldFG = this->BasicBlock->GetFunc()->GetDefFGInfo(DefHashValue); } + + // Get rid of stack access bits being passed around in InferOperatorFGInfo() + // for register operands in RTLs. + if (o_reg == DefOp.type) { + NewFG.SignMiscInfo &= FG_MASK_SIGNEDNESS_BITS; + } + UnionFG.SignMiscInfo = OldFG.SignMiscInfo | NewFG.SignMiscInfo; UnionFG.SizeInfo = OldFG.SizeInfo | NewFG.SizeInfo; if ((OldFG.SignMiscInfo != UnionFG.SignMiscInfo) || (OldFG.SizeInfo != UnionFG.SizeInfo)) { @@ -5403,6 +5410,13 @@ bool SMPInstr::UpdateUseOpFGInfo(op_t UseOp, struct FineGrainedInfo NewFG) { // Get old FG info from function level. OldFG = this->BasicBlock->GetFunc()->GetUseFGInfo(UseHashValue); } + + // Get rid of stack access bits being passed around in InferOperatorFGInfo() + // for register operands in RTLs. + if (o_reg == UseOp.type) { + NewFG.SignMiscInfo &= FG_MASK_SIGNEDNESS_BITS; + } + UnionFG.SignMiscInfo = OldFG.SignMiscInfo | NewFG.SignMiscInfo; UnionFG.SizeInfo = OldFG.SizeInfo | NewFG.SizeInfo; if ((OldFG.SignMiscInfo != UnionFG.SignMiscInfo) || (OldFG.SizeInfo != UnionFG.SizeInfo)) {