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(); }
public void VpEquality2() { // Makes sure that // y = x - 2 // if (y == 0) ... // doesn't get munged into // y = x - 2 // if (x == 2) var x = m.Reg32("x"); var y = m.Reg32("y"); var stmX = m.Assign(x, m.Mem32(Constant.Word32(0x1000300))); var stmY = m.Assign(y, m.ISub(x, 2)); var stm = m.BranchIf(m.Eq(y, 0), "test"); Assert.AreEqual("x = Mem2[0x1000300<32>:word32]", stmX.ToString()); Assert.AreEqual("y = x - 2<32>", stmY.ToString()); Assert.AreEqual("branch y == 0<32> test", stm.ToString()); RunValuePropagator(); Assert.AreEqual("branch x == 2<32> test", stm.Instruction.ToString()); }
public void VpEquality2() { // Makes sure that // y = x - 2 // if (y == 0) ... // doesn't get munged into // y = x - 2 // if (x == 2) var x = m.Reg32("x"); var y = m.Reg32("y"); var stmX = m.Assign(x, m.Mem32(Constant.Word32(0x1000300))); var stmY = m.Assign(y, m.ISub(x, 2)); var stm = m.BranchIf(m.Eq(y, 0), "test"); Assert.AreEqual("x = Mem2[0x01000300:word32]", stmX.ToString()); Assert.AreEqual("y = x - 0x00000002", stmY.ToString()); Assert.AreEqual("branch y == 0x00000000 test", stm.ToString()); var vp = new ValuePropagator(segmentMap, m.Ssa, listener); vp.Transform(stm); Assert.AreEqual("branch x == 0x00000002 test", stm.Instruction.ToString()); }