public static void SpecialAssignAny(IReference lhs, Expression rhs) { var f=FuncBuilder.Instance; var lhsWasLivePriorToThisAssignment=f.IsLive(lhs); var rhsReadable=rhs.EvaluateTo(lhs); if(!ReferenceEquals(lhs, rhsReadable)) { var lhsReg=lhs.ProposeRegisterOrScratch0(); var rhsReg=rhsReadable.ToRegister(lhsReg); lhs.FromRegister(rhsReg); } //Don't decide that a variable is live just because it was referenced (or it was used as temporary storage) //in its very-own assignment. if(!lhsWasLivePriorToThisAssignment) { f.UndoNoteRead(new[] {lhs}); } }
public static void SpecialAssignAny(IReference lhs, Expression rhs) { var f = FuncBuilder.Instance; var lhsWasLivePriorToThisAssignment = f.IsLive(lhs); var rhsReadable = rhs.EvaluateTo(lhs); if (!ReferenceEquals(lhs, rhsReadable)) { var lhsReg = lhs.ProposeRegisterOrScratch0(); var rhsReg = rhsReadable.ToRegister(lhsReg); lhs.FromRegister(rhsReg); } //Don't decide that a variable is live just because it was referenced (or it was used as temporary storage) //in its very-own assignment. if (!lhsWasLivePriorToThisAssignment) { f.UndoNoteRead(new[] { lhs }); } }
protected override IReadable EvaluateToHelper(IReference storage) { return(inner.EvaluateTo(storage)); }