Exemplo n.º 1
0
        public void SrtReg685()
        {
            var m   = new SsaProcedureBuilder(nameof(SrtReg685));
            var i_1 = m.Reg32("i_1");
            var i_2 = m.Reg32("i_2");
            var i_3 = m.Reg32("i_3");

            m.Assign(i_1, m.Int32(0));

            m.Label("m1");
            m.Phi(i_2, i_1, i_3);
            m.SideEffect(m.Fn("foo", i_2));
            m.SideEffect(m.Fn("foo", m.IAdd(i_2, 1)));
            m.Assign(i_3, m.IAdd(i_2, 2));
            m.BranchIf(m.Eq(i_3, 10), "m1");

            m.Label("m2");
            m.Return();

            var dom = m.Procedure.CreateBlockDominatorGraph();
            var lif = new LinearInductionVariableFinder(m.Procedure, m.Ssa.Identifiers, dom);

            lif.Find();
            Assert.AreEqual("(0 0x00000002 0x0000000C)", lif.InductionVariables[0].ToString());

            var ctx = lif.Contexts[lif.InductionVariables[0]];

            var str = new StrengthReduction(m.Ssa, lif.InductionVariables[0], ctx);

            str.ClassifyUses();
            Assert.AreEqual(2, str.IncrementedUses.Count);
            str.ModifyUses();
        }
Exemplo n.º 2
0
        public void DeadDpbApplication()
        {
            var dead = m.Reg32("dead");

            m.Assign(dead, m.Dpb(m.Word32(0), m.Fn("foo", Constant.Word32(1)), 0));

            EliminateDeadCode();

            var sExp =
                @"
foo(1<32>)
";

            AssertProcedureCode(sExp);
        }
Exemplo n.º 3
0
        public void CoaCallUses()
        {
            var r2 = m.Reg32("r2");
            var r3 = m.Reg32("r3");
            var r4 = m.Reg32("r4");

            m.Assign(r4, m.Fn(r2));
            var uses    = new Identifier[] { r2, r3, r4 };
            var defines = new Identifier[] { };

            m.Call(r3, 4, uses, defines);

            RunCoalescer();

            var expected =
                @"
call r3 (retsize: 4;)
	uses: r2:r2,r3:r3,r4:r2()
";

            AssertProcedureCode(expected);
        }
 private void __lwl(Identifier reg, Expression mem)
 {
     m.Assign(
         reg,
         m.Fn(
             new PseudoProcedure(PseudoProcedure.LwL, PrimitiveType.Word32, 2),
             reg, mem));
 }