Exemple #1
0
        /// <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));
        }
Exemple #2
0
		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;
 }
Exemple #9
0
		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;
 }
Exemple #11
0
		public override void VisitMemoryAccess(MemoryAccess access)
		{
			base.VisitMemoryAccess(access);
			flags |= SideEffectFlags.Load;
		}
Exemple #12
0
		public override void VisitBranch(Branch b)
		{
			base.VisitBranch(b);
			flags |= SideEffectFlags.SideEffect;
		}
Exemple #13
0
		public override void VisitApplication(Application appl)
		{
			base.VisitApplication(appl);
			flags |= SideEffectFlags.Application;
		}
Exemple #14
0
		public SideEffectFlags FindSideEffect(Expression e)
		{
			flags = SideEffectFlags.None;
			e.Accept(this);
			return flags;
		}
Exemple #15
0
		public SideEffectFlags FindSideEffect(Instruction instr)
		{
			flags = SideEffectFlags.None;
			instr.Accept(this);
			return flags;
		}
 public override void VisitBranch(Branch b)
 {
     base.VisitBranch(b);
     flags |= SideEffectFlags.SideEffect;
 }
 public override void VisitSegmentedAccess(SegmentedAccess access)
 {
     base.VisitSegmentedAccess(access);
     flags |= SideEffectFlags.Load;
 }
Exemple #18
0
		public override void VisitSegmentedAccess(SegmentedAccess access)
		{
			base.VisitSegmentedAccess(access);
			flags |= SideEffectFlags.Load;
		}