def testB(self): code = io.StringIO(r""" .fun main NORMAL [S32] = [S32 A64] .bbl %start poparg argc:S32 poparg argv:A64 mov b:S32 1 add a:S32 b 1 add x:S32 a 1 blt argc 2 if_1_true bra if_1_end .bbl if_1_true pusharg 1:S32 ret .bbl if_1_end pusharg 0:S32 ret """) unit = serialize.UnitParseFromAsm(code) fun = unit.fun_syms["main"] optimize.FunCfgInit(fun, unit) liveness.FunComputeLivenessInfo(fun) liveness.FunRemoveUselessInstructions(fun) # print ("@@@@\n", "\n".join(serialize.FunRenderToAsm(fun))) for bbl in fun.bbls: for ins in bbl.inss: self.assertTrue( ins.opcode in {o.POPARG, o.PUSHARG, o.RET, o.BLT}, f"bad ins {ins}")
def testC(self): code = io.StringIO(r""" .fun main NORMAL [S32] = [] .bbl %start mov %out:S32 3 bra next .bbl next pusharg %out ret """) unit = serialize.UnitParseFromAsm(code) fun = unit.fun_syms["main"] optimize.FunCfgInit(fun, unit) liveness.FunComputeLivenessInfo(fun) # print ("@@@@\n", "\n".join(serialize.FunRenderToAsm(fun))) liveness.FunRemoveUselessInstructions(fun) # print ("@@@@\n", "\n".join(serialize.FunRenderToAsm(fun))) self.assertEqual(1, len(fun.bbls[0].inss)) self.assertEqual(2, len(fun.bbls[1].inss))
def PhaseOptimize(fun: ir.Fun, unit: ir.Unit, opt_stats: Dict[str, int], fout): optimize.FunCfgInit(fun, unit) optimize.FunOptBasic(fun, opt_stats, allow_conv_conversion=True)