You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

新增自定义内联函数后LLVM DAG指令选择失败求助

RISC-V自定义加载指令导致LLVM -O3编译崩溃问题求助

背景与实现

我正在为RISC-V核扩展一条自定义加载指令,功能与普通加载指令完全一致,仅opcode不同。实现了供开发者调用的内联函数:

uint16_t x = __builtin_riscv_customload16(pointer_here);

并在SelectionDAG中按如下逻辑处理该内联函数调用:

case Intrinsic::customload16: {
    SDValue Ops[2];
    SDValue Root = getRoot();
    Ops[0] = getValue(I.getArgOperand(0));
    MachineSDNode* Op = DAG.getMachineNode(TargetOpcode::H_LOAD16, sdl, Ops[0].getValueType(), Ops[0]);
    SDValue Op_new1 = SDValue(Op, 0);
    setValue(&I, Op_new1);
    DAG.setRoot(Root);
    return;
  }

问题现象

该实现在以下场景运行正常:

  • 带优化的小函数
  • 无优化的大函数

但在包含大量二进制运算的大函数中使用-O3编译时,LLVM发生崩溃。

崩溃触发点为指令选择阶段处理XOR节点时,触发llvm::SelectionDAG::getNode()中的第二个断言:N1类型为i16,N2类型为i32,违反二元操作数类型匹配要求。原本预期LLVM会自动处理整型提升,对此问题原因感到困惑,寻求解决方案。

使用LLVM版本为17,崩溃调用栈如下:

#10 0x000055d8479f4566 llvm::SelectionDAG::getNode(unsigned int, llvm::SDLoc const&, llvm::EVT, llvm::SDValue, llvm::SDValue, llvm::SDNodeFlags) /home/hidev/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:6427:14
#11 0x000055d847969902 llvm::SelectionDAGBuilder::visitBinary(llvm::User const&, unsigned int) /home/hidev/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp:3266:37
#12 0x000055d8479acc46 llvm::SelectionDAGBuilder::visitXor(llvm::User const&) /home/hidev/llvm-project/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h:567:61
#13 0x000055d84795c626 llvm::SelectionDAGBuilder::visit(unsigned int, llvm::User const&) /home/hidev/llvm-project/llvm/include/llvm/IR/Instruction.def:166:1

内容的提问来源于stack exchange,提问作者Florian S.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 02:13:23