diff --git a/SMPInstr.cpp b/SMPInstr.cpp index e7fdc011ae39c13037fe59c82f1f39611c543a0c..7738f696a43a48afb77827aec1399890065689c5 100644 --- a/SMPInstr.cpp +++ b/SMPInstr.cpp @@ -6561,6 +6561,16 @@ bool SMPInstr::InferOperatorType(SMPRegTransfer *CurrRT) { } #endif if ((UNINIT == RightType) && (UNINIT == LeftType)) { + unsigned short TempSignMask; + if (this->MDIsReducedWidthMove() && (!this->MDIsSignedLoad(TempSignMask))) { + CurrDef = this->SetDefType(DefOp, NUMERIC); // e.g. mov al,cl cannot be a POINTER + updated = true; + if (!CurrRT->HasRightSubTree()) { + CurrUse = this->SetUseType(UseOp, NUMERIC); + } + assert(UNINIT == OperType); + CurrRT->SetOperatorType(NUMERIC, this); + } break; } else if (UNINIT == OperType) { @@ -6583,6 +6593,7 @@ bool SMPInstr::InferOperatorType(SMPRegTransfer *CurrRT) { CurrRT->SetOperatorType(LeftType, this); updated = true; UpdatedOperType = true; + OperType = LeftType; } // Speed up type propagation by passing the RightType/OperType to the Def // on this iteration. @@ -6675,6 +6686,7 @@ bool SMPInstr::InferOperatorType(SMPRegTransfer *CurrRT) { } CurrUse = this->SetUseType(UseOp, OperType); updated = true; + RightType = OperType; } break; }