<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/110978>110978</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[RISC-V]llvm-project/llvm/include/llvm/CodeGen/MachineOperand.h:557: int64_t llvm::MachineOperand::getImm() const: Assertion `isImm() && "Wrong MachineOperand accessor"' failed.
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
ChiHungWei
</td>
</tr>
</table>
<pre>
Ubuntu 24.04.1 LTS on x86_64, LLVM 20.0.0git with riscv-gnu-toolchain installed at /opt/riscv_2
The following problem occurs while cross compiling [ggml.c](https://github.com/ggerganov/llama.cpp/blob/master/ggml/src/ggml.c) ,
```
clang: /home/tomlord/workspace/jason/llvm-project/llvm/include/llvm/CodeGen/MachineOperand.h:557: int64_t llvm::MachineOperand::getImm() const: Assertion `isImm() && "Wrong MachineOperand accessor"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
1. <eof> parser at end of file
2. Code generation
3. Running pass 'Function Pass Manager' on module 'ggml/src/ggml.c'.
4. Running pass 'Prologue/Epilogue Insertion & Frame Finalization' on function '@ggml_compute_forward_conv_transpose_2d'
```
Compiling flags(under the directory of `/llama.cpp`):
`/home/tomlord/workspace/jason/llvm-project/riscv-custom/bin/clang -Iggml/include -Iggml/src -Iinclude -Isrc -Icommon -I/home/tomlord/workspace/jason/llvm-project/riscv-custom/include -D_XOPEN_SOURCE=600 -D_GNU_SOURCE -D_GLIBCXX_ASSERTIONS -DGGML_USE_LLAMAFILE --gcc-toolchain=/opt/riscv_2 --sysroot=/opt/riscv_2/sysroot --target=riscv64-unknown-linux-gnu -fopenmp=libomp -v -std=c11 -fuse-ld=lld -fPIC -march=rv64gc -mabi=lp64d -O0 -g -Wall -Wextra -Wpedantic -Wcast-qual -Wno-unused-function -Wshadow -Wstrict-prototypes -Wpointer-arith -Wmissing-prototypes -Werror=implicit-int -Werror=implicit-function-declaration -pthread -Wunreachable-code-break -Wunreachable-code-return -Wdouble-promotion -c ggml/src/ggml.c -o ggml/src/ggml.o`
Reduced .bc file that bugpoint emits:
[https://github.com/ChiHungWei/For-LLVM-Bug-Report](https://github.com/ChiHungWei/For-LLVM-Bug-Report)
I've added a custom instruction in [llvm-project/llvm/lib/Target/RISCV/RISCVInstrInfo.td](https://github.com/llvm/llvm-project/blob/main/llvm/lib/Target/RISCV/RISCVInstrInfo.td) as following,
```
//===----------------------------------------------------------------------===//
// Instruction class templates
//===----------------------------------------------------------------------===//
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
class ALU_rrr<bits<2> funct2, bits<3> funct3, string opcodestr,
bit Commutable = 0>
: RVInstR4<funct2, funct3, OPC_OP, (outs GPR:$rd), (ins GPR:$rs1, GPR:$rs2, GPR:$rs3),
opcodestr, "$rd, $rs1, $rs2, $rs3"> {
let isCommutable = Commutable;
}
//===----------------------------------------------------------------------===//
//Instructions
//===----------------------------------------------------------------------===//
def MULADD : ALU_rrr<0b10, 0b100,"muladd">,
Sched<[WriteIMul, ReadIMul, ReadIMul]>;
//===----------------------------------------------------------------------===//
//codegen pattern
//===----------------------------------------------------------------------===//
def : Pat< (add (mul (XLenVT GPR:$rs1), (XLenVT GPR:$rs2)), GPR:$rs3),
(MULADD GPR:$rs1, GPR:$rs2, GPR:$rs3) >;
```
Also, in [llvm-project/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp](https://github.com/llvm/llvm-project/blob/main/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp). I add a case inside the `switch (Opcode)` of function `void RISCVDAGToDAGISel::Select(SDNode *Node)` to help select the new custom instruction "MULADD",
```
case ISD::ADD: {
SDValue opn_0 = Node->getOperand(0);
SDValue opn_1 = Node->getOperand(1);
//None of the operand comes from the result of mul
if(!(opn_0.getOpcode() == ISD::MUL || opn_1.getOpcode() == ISD::MUL)){
break;
}
//operand 0 is the mul node
else if(opn_0.getOpcode() == ISD::MUL){
SDValue rs1 = opn_0.getNode()->getOperand(0);
SDValue rs2 = opn_0.getNode()->getOperand(1);
SDValue rs3 = opn_1;
SDNode *mul_node = opn_0.getNode();
//create a new node with muladd target-specific instruction
SDNode *muladd = CurDAG->getMachineNode(RISCV::MULADD, DL, VT, rs1,rs2,rs3);
ReplaceNode(Node, muladd);
CurDAG->RemoveDeadNode(mul_node);
return;
}
//operand 1 is the mul node
else {
SDValue rs1 = opn_1.getNode()->getOperand(0);
SDValue rs2 = opn_1.getNode()->getOperand(1);
SDValue rs3 = opn_0;
SDNode *mul_node = opn_1.getNode();
//create a new node with muladd target-specific instruction
SDNode *muladd = CurDAG->getMachineNode(RISCV::MULADD, DL, VT, rs1,rs2,rs3);
ReplaceNode(Node, muladd);
CurDAG->RemoveDeadNode(mul_node);
return;
}
}
```
The newly defined instruction works well in a simple c file like this,
```
#include <stdlib.h>
#include <stdio.h>
int main() {
int a = 3;
int b = 103;
int c = 127;
a = a * b + c;
printf("The answer of 3*103 + 127 = %d", a);
return 0;
}
```
However, it fails when compiling` ggml.c ` as shown above.
I've surveyed vendor extension like [RISCVInstrInfoXTHead.td](https://github.com/llvm/llvm-project/blob/main/llvm/lib/Target/RISCV/RISCVInstrInfoXTHead.td) and [RISCVInstrInfoXVentana.td](https://github.com/llvm/llvm-project/blob/main/llvm/lib/Target/RISCV/RISCVInstrInfoXVentana.td), and they use roughly the same way defining custom instructions. So I am confused what causes this issue.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsOdlu2zyzT8PcDGTIlJf4IheOHecz4DRBnDa9M2hyLPEvReqQVNycpz8gJW-Ju3xF0QIHfxBY4pCzcHZSzDmZa8Qr0r8m_ekFq31h7NWkkP_UOn9GebE24vUKPq5r7WugvU7a63Rh8bQEo-Hr5WA16BE6gcXi0x3QtJN20lx62EpfgJWOvyS5rhNvjOIFkxqkdp4phQKYB0JnpvKEzuLKFSXplKTj5vepQNgYpcxW6hwqa9YKSzCc19bBtpAKgVvjHHBTVlKFRaR_neel6nDSnxJ6WXhfOZKNCZ0ROsulL-p1h5syDHK0OdPmhdCZUqxkHV5VhM7WyqwJnZXMebRxXakInTnL20GHEzoCQietqIO0_Y9DrpjOSTYOGytMiYTOvCmVsYLQ2dbYL65iPED_w5zRkfdLmVTW_Ae5b4eEzqTmqhZ4AEyMwFsMCHeMF1LjfYWWadEpSDbu94eBpdR-0Ft5iCjZmGTj07UNLEc_L0tCL8M2uNHOB9yxc2i9NBrIIJXusILQAaEDIJQ-W6NzOCUJjHN0zlhCKaFD2DCpUHQaXTwsbsbLG3D1upQeGKzrHCxWxnrwBr5jm3bPb1QjnavRETqDwLjVEPgieAFzBawZ_-Jt1O4EKouVNUE2FOBMbRtwFNk5wyXzKMDWGhy3svKtyEvP-BcQdVkFySKo2wGSTdBsSHYDFbMObXBc1ALMBjZSYbOOdiD-BUtBjhotC_psJrN28rHWOjozcw4IHc5qzaPWHwLgjmmWB68bhsgqjagVhlVnfXDYitz7BukHa5TJ6-BDN5WMrzDXeyvTAcwsKxFmUjMl_7cRtuG82UlF6JD00sBxFWKs9rjaGLtlVqy40S8rb5l2lXG4oiKsPRcRk31wbhTLHaGXtRZoo-GEtMi9sa9BlQHjOBbDcBRDaU_212KqSUK8dj5611qGNTFQIZm3ut250x7gLIdkfgA3Y27K0mhI5r9HlD356erz_cPNh9Xy_uPj5IZk00GaBujth48tLI4W8-vJ58-r8XJ58_g0v_-whGR6e3u3WH1c3qwWi_HdeDZf3ECS5JwfMi7Jpm_TLCSJe3XWGH9mMuy-mYQk8czmGFbFyUEvqfUXbbY6UVLXX0Nqh2RjKtQhZKZKrk1ZQfICifOCZFPe7UKyqR0mKgyVEpBsHuYTSEpmeRHovgx6OQ_jtQwrqkFPQHKfQpJD8syUguQZv3rLIHmuUDDtJYfkmTPnk_-pWZjWJql17VAke89Nnl3BhNmGF28l98EI3vjXCl0gZKT2aBNmQ5VKnkvpnNT56SK01liSTWVZKcmlT6T258A7polArlgT9pBUvrDIBCTPtbbIeMHWChNuBCZri-zLuQmLvrZBeGHqAKysKU1DjsOZLACJOQM2-9hrfh9R1BwFdNY85ivwBfMhG0ctAJbSu326I_3r72TmQ1NA6GxmbBKKfnJd58ljTOw_LLs_JEBHx6LPCR2-IDAhQrsATeDEDsLWjaGlDkX_fBVVMpTyp8aD6exxvpx82j3ngcZcb0zHix9Kfb4g7VsFqX-BJx0Bc4f-5tBQnEuijUwhVuN_8lv-9uRa6kecYH6kYq5CSfFYVop5dH9aIoUeCuaWUuDNZoPcOyDZFNJQz0v2ujBMnACW3lhsICD1vi1zDsaLjytrLckm6-jyExpqegxfGpBbaLaHZgEa8ofOwVQhRJ23e0vB8d9aepiYsqx9COdWoOzmsDJUssfoAo89kk0OXA-c7h8mq_uH8Ebopam9g9uHx-iRvVBgRu2M1McTrhvAR2P6Zpw1mGdkPtkTxBYuMgrvO8IHkjtiUWlkeH2wjnRvdn4YkqxdR4bTE__-ww595M9_3IEFbuDu42I8nUYnOHhhuu5Gpw3P8EIoLWvFhGiUfNZoS16gINmE9K-frfQ4v6tVoPGITLx7708Dmb0J_ormg4flqKFi3qPVf0P5QesPzJMshg8TIjzKWoXH5wXqT09v4mkXae8naZwcfS_ECL1srf0vgxROjHVaAMbKmYDyy-VuiWo6vn0y0_Ft7K7_VMl7y5eOOjAPBT2Uc-YwFHPZnuPIIHVb6XkRdH8fc1NQ7CCNJ639oWSQvhgpINLf0Q58mvPtElWU9XI5_RCOYoSOPxwIhYMnqgpcXBW5atyeaywIpY0ZY16cwHeqc9zHfDltBAgo4dSyy5AxaqefmKoRTKVXaUyRQaaEZDc5-t3xnF42J55v4HW_jdc9wWus-cFoDHoLWzTtaZ2bEh1srCkj2KKrlQ-Lylq1yHITD_7dUIGCsJ3IqDFFcyEQQ-yw3buPCyDDCRlOGil_BqENor2GYkN8svF9uYiDw1vc2m47KUgXNxJiWQeO-4Wogmtt_s0uTiSCY-1b1-h-T-rDntCPTXhMhv40me73yGR7Mt13a3Y-X9ZqpeP7eY5vENtcbZF5BBZjImLHW7ymKEFzFExchVxuJD-Olm_KEJNt6AhqOx3fttts75BaYZp8sbNCDLgJTBfh99NT-G2yZ5Mz21y7F_4RK8X4jlTzmMCuir7d5UGKRyzNC06RiRZ1p68TpOY8dt4xv-WU3R845cHHzrlX9_e414_I_KR7pT_vXt3_utdvda93nvb2RLi_Ite4Va8gcCM1ipMSFi-kYItKhb6BgZNlpRDaWwAlv4SyK9237rIJzXYXVCSbOC-UXHeK_aHm3bQ0x7PxV2oPTbPQZN2974cJFk2XHfYfgOsI7KZvwLwB0-EB3KCz4AkBi14DP0xWVmrflDIalMS026INpS4jdNxNs4jQpcNIhNC-aMs8O7ZQex-TnjnFnKrqH7PFF4zHKOnjLbiDbYH68GkiNB_tpU14ZQ5cYbYa2Nq8YOfktsPV9gVfUcALamEs4FeP2gWDRpOR_vXpbcLnp3-Qib9xj3HgTEfxbv29bJ9Qe6bZX5HuiHfTsgcRfYGvUDsEa-q8UK8xVztWImxZG0bhuP--I3QdWJrQu5bAjd7UDgVsC-aBs9qhi6EE8SNF56RZvBBXmRhlI3aBV90hHY56I5peXhRXfcEw2_RG3c2w291cXuJ6k476TGxwTXEkBhfyiqa0103TLB31M3rZGXXXos_7w_WwL2h_MyC9FEsmVSeopWNsfhH5X3W76Wh4eaHYGpWL3_UoDTk3zgZH708v7FVU9LrOHemlSjrvDmS89Cp-EAwaTT6R_vT_5Xeqi9qqq1__ENWq-eWK_l8AAAD__0LqkFU">