两处常量折叠后剩几条 const
按 IR 模型,[t1=2+3, t2=4*5] 两条都能折叠,折叠后有几条 const 指令?
贯穿本节的 IR 模型(判题机没 gcc,这是它的确定模型):程序是三地址码元组列表,每条 (dst, op, a, b)——op ∈ const/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)])))
全部评论