public void OutpReplacePhi() { var m = new ProcedureBuilder(); var foo = new Identifier("foo", PrimitiveType.Word32, null); var foo1 = new Identifier("foo1", PrimitiveType.Word32, null); var foo2 = new Identifier("foo2", PrimitiveType.Word32, null); var foo3 = new Identifier("foo3", PrimitiveType.Word32, null); var pfoo = new Identifier("pfoo", PrimitiveType.Ptr32, null); m.Label("block1"); m.Assign(foo1, Constant.Word32(1)); Statement stmFoo1 = m.Block.Statements.Last; m.Label("block2"); m.Assign(foo2, Constant.Word32(2)); Statement stmFoo2 = m.Block.Statements.Last; m.Label("block3"); Statement stmFoo3 = m.Phi(foo3, foo1, foo2); SsaIdentifierCollection ssaIds = new SsaIdentifierCollection(); ssaIds.Add(foo1, new SsaIdentifier(foo1, foo, stmFoo1, null, false)); ssaIds.Add(foo2, new SsaIdentifier(foo2, foo, stmFoo2, null, false)); ssaIds.Add(foo3, new SsaIdentifier(foo3, foo, stmFoo3, null, false)); OutParameterTransformer opt = new OutParameterTransformer(null, ssaIds); opt.ReplaceDefinitionsWithOutParameter(foo3, pfoo); Assert.AreEqual("*pfoo = 0x00000001", stmFoo1.Instruction.ToString()); Assert.AreEqual("*pfoo = 0x00000002", stmFoo2.Instruction.ToString()); Assert.AreEqual("foo3 = PHI(foo1, foo2)", stmFoo3.Instruction.ToString()); }
public void OutpReplaceManyUses() { ProcedureBuilder m = new ProcedureBuilder(); Identifier foo = new Identifier("foo", PrimitiveType.Word32, null); Identifier bar = new Identifier("bar", PrimitiveType.Word32, null); Identifier pfoo = new Identifier("pfoo", PrimitiveType.Ptr32, null); Block block = m.Label("block"); m.Assign(foo, 1); Statement stmFoo = m.Block.Statements.Last; m.Assign(bar, foo); Statement stmBar = m.Block.Statements.Last; SsaIdentifier ssaFoo = new SsaIdentifier(foo, foo, stmFoo, ((Assignment)stmFoo.Instruction).Src, false); ssaFoo.Uses.Add(stmBar); SsaIdentifier ssaBar = new SsaIdentifier(bar, bar, stmBar, ((Assignment)stmBar.Instruction).Src, false); SsaIdentifierCollection ssaIds = new SsaIdentifierCollection(); ssaIds.Add(foo, ssaFoo); ssaIds.Add(bar, ssaBar); OutParameterTransformer opt = new OutParameterTransformer(m.Procedure, ssaIds); opt.ReplaceDefinitionsWithOutParameter(foo, pfoo); Assert.AreEqual(3, block.Statements.Count); Assert.AreEqual("foo = 0x00000001", block.Statements[0].Instruction.ToString()); Assert.AreEqual("*pfoo = foo", block.Statements[1].Instruction.ToString()); Assert.AreEqual("bar = foo", block.Statements[2].Instruction.ToString()); }
private Identifier Reg32(string name) { var mr = new RegisterStorage(name, ssaIds.Count, 0, PrimitiveType.Word32); var id = new Identifier(name, PrimitiveType.Word32, mr); return(ssaIds.Add(id, null, null, false).Identifier); }
private Identifier Reg32(string name) { var mr = new RegisterStorage(name, ssaIds.Count, 0, PrimitiveType.Word32); Identifier id = new Identifier(mr.Name, mr.DataType, mr); SsaIdentifier sid = new SsaIdentifier(id, id, null, null, false); ssaIds.Add(id, sid); return(sid.Identifier); }
private SsaIdentifierCollection BuildSsaIdentifiers() { var mrFoo = new RegisterStorage("foo", 1, 0, PrimitiveType.Word32); var mrFoo64 = new RegisterStorage("foo64", 2, 0, PrimitiveType.Word64); var mrBar = new RegisterStorage("bar", 3, 0, PrimitiveType.Word32); foo = new Identifier(mrFoo.Name, mrFoo.DataType, mrFoo); foo64 = new Identifier(mrFoo64.Name, mrFoo64.DataType, mrFoo64); var coll = new SsaIdentifierCollection(); var src = Constant.Word32(1); foo = coll.Add(foo, new Statement(0, new Assignment(foo, src), null), src, false).Identifier; foo64 = coll.Add(foo64, new Statement(0, new Assignment(foo64, Constant.Word64(1)), null), src, false).Identifier; return(coll); }
private SsaIdentifier AddSid(string name) { Identifier id = new Identifier(name, null, null); SsaIdentifier sid = sids.Add(id, new Statement(0, new DefInstruction(id), null), null, false); return(sid); }
public void Liv_CreateBareMinimum() { ssaIds = new SsaIdentifierCollection(); Identifier id0 = new Identifier("foo", PrimitiveType.Word32, new TemporaryStorage("foo", 1, PrimitiveType.Word32)); Identifier id1 = new Identifier("bar", PrimitiveType.Word32, new TemporaryStorage("bar", 1, PrimitiveType.Word32)); Identifier phi = new Identifier("i_3", PrimitiveType.Word32, null); ssaIds.Add(id0, new SsaIdentifier(id0, id0, null, null, false)); ssaIds.Add(id1, new SsaIdentifier(id1, id1, null, null, false)); ssaIds.Add(phi, new SsaIdentifier(phi, phi, null, null, false)); LinearInductionVariableFinder liv = new LinearInductionVariableFinder(null, ssaIds, null); liv.Context.PhiStatement = new Statement(0, null, null); liv.Context.PhiIdentifier = phi; liv.Context.DeltaValue = Constant.Word32(1); LinearInductionVariable iv = liv.CreateInductionVariable(); Assert.AreEqual("(? 0x00000001 ?)", iv.ToString()); }
private SsaIdentifierCollection BuildSsaIdentifiers() { var mrFoo = new RegisterStorage("foo", 1, 0, PrimitiveType.Word32); var mrBar = new RegisterStorage("bar", 2, 1, PrimitiveType.Word32); foo = new Identifier(mrFoo.Name, mrFoo.DataType, mrFoo); var coll = new SsaIdentifierCollection(); var src = Constant.Word32(1); foo = coll.Add(foo, new Statement(0, new Assignment(foo, src), null), src, false).Identifier; return coll; }
public void SetUp() { m = new ProcedureBuilder(); id = m.Local32("id"); x = m.Local32("x"); ssaIds = new SsaIdentifierCollection(); foreach (Identifier i in m.Procedure.Frame.Identifiers) { ssaIds.Add(i, null, null, false); } }
public void Liv_CreateIncInitialValue() { ssaIds = new SsaIdentifierCollection(); LinearInductionVariableFinder liv = new LinearInductionVariableFinder(null, ssaIds, null); liv.Context.InitialValue = Constant.Word32(0); liv.Context.PhiStatement = new Statement(0, null, null); liv.Context.PhiIdentifier = new Identifier("foo_0", PrimitiveType.Word32, null); ssaIds.Add(liv.Context.PhiIdentifier, new SsaIdentifier(liv.Context.PhiIdentifier, liv.Context.PhiIdentifier, liv.Context.PhiStatement, null, false)); liv.Context.DeltaValue = Constant.Word32(1); liv.Context.DeltaStatement = new Statement(0, new Assignment(new Identifier("foo_1", PrimitiveType.Word32, null), new BinaryExpression(Operator.IAdd, PrimitiveType.Word32, liv.Context.PhiIdentifier, liv.Context.DeltaValue)), null); ssaIds[liv.Context.PhiIdentifier].Uses.Add(liv.Context.DeltaStatement); LinearInductionVariable iv = liv.CreateInductionVariable(); Assert.AreEqual("(0x00000001 0x00000001 ?)", iv.ToString()); }
public void Idc_ConstantPropagate() { Identifier ds = m.Frame.EnsureRegister(Registers.ds); var c = Constant.Word16(0x1234); m.Assign(ds, c); m.SideEffect(ds); var def = m.Block.Statements[0]; var use = m.Block.Statements[1]; SsaIdentifier sid_ds = ssa.Add(ds, def, c, false); var ass = (Assignment)def.Instruction; ass.Dst = sid_ds.Identifier; ((SideEffect)use.Instruction).Expression = sid_ds.Identifier; sid_ds.Uses.Add(use); IdConstant ic = new IdConstant(new SsaEvaluationContext(null, ssa), new Unifier(null), listener); Assert.IsTrue(ic.Match(sid_ds.Identifier)); Expression e = ic.Transform(); Assert.AreEqual("selector", e.DataType.ToString()); }
private Identifier Given_Tmp(string name, DataType dt) { var tmp = m.Procedure.Frame.CreateTemporary(name, dt); return(ssaIds.Add(tmp, new Statement(0, new DefInstruction(tmp), null), null, false).Identifier); }
public void OutpReplacePhi() { var m = new ProcedureBuilder(); var foo = new Identifier("foo", PrimitiveType.Word32, null); var foo1 = new Identifier("foo1", PrimitiveType.Word32, null); var foo2 = new Identifier("foo2", PrimitiveType.Word32, null); var foo3 = new Identifier("foo3", PrimitiveType.Word32, null); var pfoo = new Identifier("pfoo", PrimitiveType.Pointer32, null); Block block1 = m.Label("block1"); m.Assign(foo1, Constant.Word32(1)); Statement stmFoo1 = m.Block.Statements.Last; Block block2 = m.Label("block2"); m.Assign(foo2, Constant.Word32(2)); Statement stmFoo2 = m.Block.Statements.Last; Block block3 = m.Label("block3"); Statement stmFoo3 = m.Phi(foo3, foo1, foo2); SsaIdentifierCollection ssaIds = new SsaIdentifierCollection(); ssaIds.Add(foo1, new SsaIdentifier(foo1, foo, stmFoo1, null, false)); ssaIds.Add(foo2, new SsaIdentifier(foo2, foo, stmFoo2, null, false)); ssaIds.Add(foo3, new SsaIdentifier(foo3, foo, stmFoo3, null, false)); OutParameterTransformer opt = new OutParameterTransformer(null, ssaIds); opt.ReplaceDefinitionsWithOutParameter(foo3, pfoo); Assert.AreEqual("*pfoo = 0x00000001", stmFoo1.Instruction.ToString()); Assert.AreEqual("*pfoo = 0x00000002", stmFoo2.Instruction.ToString()); Assert.AreEqual("foo3 = PHI(foo1, foo2)", stmFoo3.Instruction.ToString()); }
public void OutpReplaceManyUses() { ProcedureBuilder m = new ProcedureBuilder(); Identifier foo = new Identifier("foo", PrimitiveType.Word32, null); Identifier bar = new Identifier("bar", PrimitiveType.Word32, null); Identifier pfoo = new Identifier("pfoo", PrimitiveType.Pointer32, null); Block block = m.Label("block"); m.Assign(foo, 1); Statement stmFoo = m.Block.Statements.Last; m.Assign(bar, foo); Statement stmBar = m.Block.Statements.Last; SsaIdentifier ssaFoo = new SsaIdentifier(foo, foo, stmFoo, ((Assignment) stmFoo.Instruction).Src, false); ssaFoo.Uses.Add(stmBar); SsaIdentifier ssaBar = new SsaIdentifier(bar, bar, stmBar, ((Assignment) stmBar.Instruction).Src, false); SsaIdentifierCollection ssaIds = new SsaIdentifierCollection(); ssaIds.Add(foo, ssaFoo); ssaIds.Add(bar, ssaBar); OutParameterTransformer opt = new OutParameterTransformer(m.Procedure, ssaIds); opt.ReplaceDefinitionsWithOutParameter(foo, pfoo); Assert.AreEqual(3, block.Statements.Count); Assert.AreEqual("foo = 0x00000001", block.Statements[0].Instruction.ToString()); Assert.AreEqual("*pfoo = foo", block.Statements[1].Instruction.ToString()); Assert.AreEqual("bar = foo", block.Statements[2].Instruction.ToString()); }
private void SsaId(Identifier id, Statement stm, Expression expr, bool isSideEffect) { ssaIds.Add(id, new SsaIdentifier(id, id, stm, expr, isSideEffect)); }
private Identifier Given_Tmp(string name, Expression defExpr) { var tmp = m.Procedure.Frame.CreateTemporary(name, defExpr.DataType); return(ssaIds.Add(tmp, new Statement(0, new Assignment(tmp, defExpr), null), defExpr, false).Identifier); }