跳转至

chain

不是。let hasSideEffects = 1 本身不会“加 chain”

它属于 MachineInstr 层的属性,作用是告诉后端:

Text Only
这条机器指令有不可见副作用,不能随便删、不能当普通纯计算指令处理。

但 SelectionDAG 里的 chain 是另一层东西。AITE 的 chain 来自这里:

Text Only
def cixMatMul_aite : SDNode<"RISCVISD::CIX_MATMUL_AITE", SDT_RISCVCIX_TYPE_AITE,
                            [SDNPHasChain, SDNPMayLoad, SDNPMayStore,
                             SDNPSideEffect]>;

关键是:

Text Only
SDNPHasChain

以及 lowering 里生成 MVT::Other

Text Only
SDVTList VTs = DAG.getVTList(MVT::Other);
return DAG.getNode(RISCVISD::CIX_MATMUL_AITE, DL, VTs, Ops);

然后:

Text Only
DAG.setRoot(aite_node.getValue(0));

这里才是真正在接 SelectionDAG chain。

所以分层是:

Text Only
IntrHasSideEffects
  IR intrinsic 层:说明 intrinsic 有副作用

SDNPHasChain / SDNPSideEffect
  SelectionDAG 层:让 AITE node 带 chain

let hasSideEffects = 1
  MachineInstr 层:让 pseudo/real MI 被视为有副作用

因此这个 PseudoCixMatMul 里设置:

Text Only
let hasSideEffects = 1;
let mayLoad = 1;
let mayStore = 1;

是对的,但它不是 chain 的来源。它是 chain 下降到 MachineInstr 之后,对机器调度、删除、依赖分析的补充标记。真正“加 chain”的是 SDNPHasChain 和 lowering 里的 MVT::Other/setRoot