两处常量折叠后剩几条 const

👁️ 3 人浏览 💬 0 人评论 ❤️ 添加收藏

按 IR 模型,[t1=2+3, t2=4*5] 两条都能折叠,折叠后有几条 const 指令?

贯穿本节的 IR 模型(判题机没 gcc,这是它的确定模型):程序是三地址码元组列表,每条 (dst, op, a, b)——opconst/copy/+/-/*,操作数 a/b 是整数(常量)或字符串(变量名)。

常量折叠 fold:两个操作数都是常量的运算,直接算成 const;常量传播 propagate:操作数是已知常量的变量就换成值;count_const 数 const 指令。

def is_num(x):
    """操作数是不是常量(整数)。"""
    return isinstance(x, int)


def fold1(op, a, b):
    """两个常量做一次运算,交回结果。"""
    return {"+": a + b, "-": a - b, "*": a * b}[op]


def fold(prog):
    """常量折叠:两个操作数都是常量的运算,直接算成 const。"""
    out = []
    for (dst, op, a, b) in prog:
        if op in ("+", "-", "*") and is_num(a) and is_num(b):
            out.append((dst, "const", fold1(op, a, b), None))
        else:
            out.append((dst, op, a, b))
    return out


def consts(prog):
    """扫一遍,收集已知是常量的变量:名 -> 值。"""
    env = {}
    for (dst, op, a, b) in prog:
        if op == "const":
            env[dst] = a
    return env


def propagate(prog):
    """常量传播:操作数是已知常量的变量,就换成它的值。"""
    env = consts(prog)
    out = []
    for (dst, op, a, b) in prog:
        na = env[a] if isinstance(a, str) and a in env else a
        nb = env[b] if isinstance(b, str) and b in env else b
        out.append((dst, op, na, nb))
    return out


def count_const(prog):
    """程序里有几条 const 指令。"""
    return sum(1 for ins in prog if ins[1] == "const")

print(count_const(fold([("t1", "+", 2, 3), ("t2", "*", 4, 5)])))
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论