chain¶
不是。let hasSideEffects = 1 本身不会“加 chain”。
它属于 MachineInstr 层的属性,作用是告诉后端:
但 SelectionDAG 里的 chain 是另一层东西。AITE 的 chain 来自这里:
Text Only
def cixMatMul_aite : SDNode<"RISCVISD::CIX_MATMUL_AITE", SDT_RISCVCIX_TYPE_AITE,
[SDNPHasChain, SDNPMayLoad, SDNPMayStore,
SDNPSideEffect]>;
关键是:
以及 lowering 里生成 MVT::Other:
Text Only
SDVTList VTs = DAG.getVTList(MVT::Other);
return DAG.getNode(RISCVISD::CIX_MATMUL_AITE, DL, VTs, Ops);
然后:
这里才是真正在接 SelectionDAG chain。
所以分层是:
Text Only
IntrHasSideEffects
IR intrinsic 层:说明 intrinsic 有副作用
SDNPHasChain / SDNPSideEffect
SelectionDAG 层:让 AITE node 带 chain
let hasSideEffects = 1
MachineInstr 层:让 pseudo/real MI 被视为有副作用
因此这个 PseudoCixMatMul 里设置:
是对的,但它不是 chain 的来源。它是 chain 下降到 MachineInstr 之后,对机器调度、删除、依赖分析的补充标记。真正“加 chain”的是 SDNPHasChain 和 lowering 里的 MVT::Other/setRoot。