SetLocal

SetLocal<T>settervalue将Local设为指定值

消除

当变量为本地节点时,对其setter进行可能的消除详见Optimizer::eliminate_unnecessary_local_setter

约定

外部

setter

局部变量的引用不会逃逸,可忽略

usage

视为LinkTarget::Export,照常处理

步骤

  1. 找到所有settersLocal的句柄(values_out[0])被谁消费了,谁就是它的setter
  2. 找出写入值的来源里的opaque节点写入的值不一定是pure的,挪到usage那里求值可能就变了,所以要先看它从哪来从setter的value in[1]的来源开始BFS(值流不会有环):
    • 来自extern:跳过
    • 不是calc节点:这是opaque
    • 是Local节点:它所有的setter都是opaque;值是ADT(能拿到PartialMut)的话, 这个值的使用也要一起看
    • 是其它不纯的节点:拒绝优化
    • 是pure节点:把它的所有value in入队,继续
  3. 遍历每一处usage:
    1. 找到它的所有executors&mut的值被交给Modify或函数调用时不算执行点(那是写),不用回溯控制流, 但它的输入同样要改接到写入的值上 —— 否则这个local永远消不掉
    2. 根据所有executors,得到该usage类型:
    若不明确就直接拒绝优化,若有关当前setter则记录
  4. 消除该setter并将值连接到有关usages被写入的值不能依赖这个变量的旧值 —— 否则把usage改接到写入的值上会造环 (i += 1 就是这种:写入值是 i + 1,而 i 正是usage)