/// <summary> /// Tries to move the assigment as far down the block as is possible. /// </summary> /// <param name="ass"></param> /// <param name="block"></param> /// <param name="i"></param> /// <returns>true if a change was made</returns> public bool TryMoveAssignment(Statement stmDef, SsaIdentifier sidDef, Expression defExpr, Block block, int initialPosition) { SideEffectFlags flagsDef = sef.FindSideEffect(stmDef.Instruction); for (int i = initialPosition + 1; i < block.Statements.Count; ++i) { Statement stm = block.Statements[i]; if (sidDef.Uses.Contains(stm)) { if (CanCoalesce(sidDef, stmDef, stm)) { Coalesced = true; return(CoalesceStatements(sidDef, defExpr, stmDef, stm)); } else { return(MoveAssignment(initialPosition, i, block)); } } if (stm.Instruction.IsControlFlow) { return(MoveAssignment(initialPosition, i, block)); } SideEffectFlags flagsStm = sef.FindSideEffect(stm.Instruction); if (sef.Conflict(flagsDef, flagsStm)) { return(MoveAssignment(initialPosition, i, block)); } } return(MoveAssignment(initialPosition, block.Statements.Count, block)); }
public bool Conflict(SideEffectFlags defFlags, SideEffectFlags curFlags) { if (defFlags == SideEffectFlags.None || curFlags == SideEffectFlags.None) return false; if (defFlags == SideEffectFlags.Load && curFlags == SideEffectFlags.Load) return false; return true; }
public bool Conflict(SideEffectFlags defFlags, SideEffectFlags curFlags) { if (defFlags == SideEffectFlags.None || curFlags == SideEffectFlags.None) { return(false); } if (defFlags == SideEffectFlags.Load && curFlags == SideEffectFlags.Load) { return(false); } return(true); }
public bool AreConstrained(Statement def, Statement use) { SideEffectFlags defFlags = FindSideEffect(def.Instruction); int iUse = use.Block.Statements.IndexOf(use); for (int i = def.Block.Statements.IndexOf(def) + 1; i < def.Block.Statements.Count; ++i) { if (i == iUse) { return(false); } if (Conflict(defFlags, FindSideEffect(def.Block.Statements[i].Instruction))) { return(true); } } return(true); }
public override void VisitApplication(Application appl) { base.VisitApplication(appl); flags |= SideEffectFlags.Application; }
public SideEffectFlags FindSideEffect(Expression e) { flags = SideEffectFlags.None; e.Accept(this); return(flags); }
public SideEffectFlags FindSideEffect(Instruction instr) { flags = SideEffectFlags.None; instr.Accept(this); return(flags); }
public override void VisitStore(Store store) { store.Dst.Accept(this); store.Src.Accept(this); flags |= SideEffectFlags.Store; }
public override void VisitMemoryAccess(MemoryAccess access) { base.VisitMemoryAccess(access); flags |= SideEffectFlags.Load; }
public override void VisitBranch(Branch b) { base.VisitBranch(b); flags |= SideEffectFlags.SideEffect; }
public SideEffectFlags FindSideEffect(Expression e) { flags = SideEffectFlags.None; e.Accept(this); return flags; }
public SideEffectFlags FindSideEffect(Instruction instr) { flags = SideEffectFlags.None; instr.Accept(this); return flags; }
public override void VisitSegmentedAccess(SegmentedAccess access) { base.VisitSegmentedAccess(access); flags |= SideEffectFlags.Load; }