INTRINSIC_W_CHAIN¶
setOperationAction(ISD::INTRINSIC_W_CHAIN, MVT::i32, Custom);
setOperationAction(ISD::INTRINSIC_W_CHAIN, MVT::Other, Custom);
这两句通常是配套使用,
它们的含义是:
对
ISD::INTRINSIC_W_CHAIN这种 DAG 节点,当它的 result type 涉及i32或Other时,都交给 RISC-V 后端 custom lowering。
1. INTRINSIC_W_CHAIN 本身表示什么?¶
ISD::INTRINSIC_W_CHAIN 表示:
也就是:
例如一个 LLVM IR intrinsic:
如果它有 side effect / memory / chain,那么 SelectionDAG 中可能长这样:
这个 DAG node 有两个 result:
所以可以理解为:
但不要写成“返回值是 i32:chain”。更准确是:
2. MVT::Other 是什么?¶
MVT::Other 不是普通 C/LLVM IR 返回值类型。
它在 SelectionDAG 里表示 chain/token 类型,用来描述副作用顺序,比如:
- load/store;
- volatile;
- CSR read/write;
- intrinsic side effect;
- memory intrinsic;
- 不能被随意重排的操作。
所以:
不是说返回值是 Other,而是说:
对这个带 chain 的 intrinsic,它的 chain result 也需要 custom legalize/lowering。
3. 为什么这两句要一起写?¶
因为一个 INTRINSIC_W_CHAIN 节点通常有两个 result:
所以你需要分别告诉 Legalizer:
处理普通返回值 result:
以及:
处理 chain result:
它们是一个逻辑整体,表示:
+xcxnai下,返回i32且带 chain 的 intrinsic,由 RISC-V 后端自定义 lowering。
4. 如果没有返回值,应该是什么?¶
如果 intrinsic 没有普通返回值,只有副作用,一般不是 INTRINSIC_W_CHAIN,而是:
例如:
SelectionDAG 里类似:
这种情况下不会有:
只有:
所以“无返回值”的 intrinsic 应该对应:
而不是:
5. 这两句可以这样理解¶
你的代码:
if (Subtarget.hasStdExtXcxnai()) {
setOperationAction(ISD::INTRINSIC_W_CHAIN, MVT::i32, Custom);
setOperationAction(ISD::INTRINSIC_W_CHAIN, MVT::Other, Custom);
}
可以解释为:
当开启 +xcxnai 时,
对于带 chain 且返回 i32 的 intrinsic:
i32,ch = intrinsic_w_chain ...
这个 opcode 的 i32 result 和 chain result 都交给 RISCVTargetLowering 自定义处理。
也就是最终允许它进入:
6. 推荐表述¶
建议不要说:
这个说法不准确。
更推荐说:
这两句是配套的,用来 custom lower 返回 i32 且带 chain 的 INTRINSIC_W_CHAIN 节点。
其中 MVT::i32 对应普通数据返回值,MVT::Other 对应 chain result。
或者更短一点: