Пример #1
0
    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}")
Пример #2
0
    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))
Пример #3
0
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)