<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/59742>59742</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [NVPTX] Assembly printer didn't implement `MCBinaryExpr::And`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:NVPTX
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          DataCorrupted
      </td>
    </tr>
</table>

<pre>
    While compiling the following code using nvptx64, Assembly printer hit an unreachable. https://godbolt.org/z/4xEP8js58
```
@G = global <4 x i32> <i32 7, i32 7, i32 7, i32 7>
@G_addr = global i20 ptrtoint (<4 x i32>* @G to i20)
```
```
Unhandled binary operator
UNREACHABLE executed at /root/llvm-project/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp:2129!
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: /opt/compiler-explorer/clang-assertions-trunk/bin/llc -o /app/output.s -x86-asm-syntax=intel -mtriple=nvptx64 <source>
 #0 0x00005649b897460f llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x382660f)
 #1 0x00005649b8971fd4 SignalHandler(int) Signals.cpp:0:0
 #2 0x00007f01b7dce420 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x14420)
 #3 0x00007f01b789b00b raise (/lib/x86_64-linux-gnu/libc.so.6+0x4300b)
 #4 0x00007f01b787a859 abort (/lib/x86_64-linux-gnu/libc.so.6+0x22859)
 #5 0x00005649b88d66fe (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x37886fe)
 #6 0x00005649b6ac6c71 llvm::NVPTXAsmPrinter::printMCExpr(llvm::MCExpr const&, llvm::raw_ostream&) (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x1978c71)
 #7 0x00005649b6ace505 llvm::NVPTXAsmPrinter::printModuleLevelGV(llvm::GlobalVariable const*, llvm::raw_ostream&, bool, llvm::NVPTXSubtarget const&) (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x1980505)
 #8 0x00005649b6acef87 llvm::NVPTXAsmPrinter::emitGlobals(llvm::Module const&) (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x1980f87)
 #9 0x00005649b6acfbf3 llvm::NVPTXAsmPrinter::doFinalization(llvm::Module&) (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x1981bf3)
#10 0x00005649b80653a5 llvm::FPPassManager::doFinalization(llvm::Module&) (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x2f173a5)
#11 0x00005649b8071da6 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x2f23da6)
#12 0x00005649b5cfc983 compileModule(char**, llvm::LLVMContext&) llc.cpp:0:0
#13 0x00005649b5c3f642 main (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0xaf1642)
#14 0x00007f01b787c083 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x24083)
#15 0x00005649b5cf3c5e _start (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0xba5c5e)
Compiler returned: 139
```

### Cause

When lowering `i20`, `NVPTXAsmPrinter::lowerConstantForGV` creates an `And` with -1 to extract bits. (Shown below)

https://github.com/llvm/llvm-project/blob/c823517ef5f2ac0fafede18782d089a8aa91ed7b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp#L2040-L2060

However, `And` is not handled when printing the assembly in `NVPTXAsmPrinter::printMCExpr`. (Shown below)

https://github.com/llvm/llvm-project/blob/c823517ef5f2ac0fafede18782d089a8aa91ed7b/llvm/lib/Target/NVPTX/NVPTXAsmPrinter.cpp#L2117-L2129

It shouldn't be a hard fix, if anyone can tell me what are the expected syntax for bit wise `And` in NVPTX
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUWN9v2zgS_mvoF8IGRerngx9cJ24XSBfBpZe9N2NEjWxuaVIgqdrZv_5AyW4sb3vb28vdYQEnFill5ptvPnFmAt6rnUFckuwdye5m0Ie9dcs7CLC2zvVdwGZW2-Zl-cteaaTSHjqlldnRsEfaWq3tMa6kbZD2Pl6aL1045Snha7ryHg-1fqGdUyago3sVKBjaG4cg91BrXNB9CJ0nYkX4hvDNzja11WFh3Y7wzW-Eb9LT_WP5q89Kwu4IW5GcnT_jMmXvKRF3dKdtDZoSsU7piSrBibiPKyU4LSKY712I-1dLW2gad21OcUa74IJVJlDCy4l5wld08B9sfJDw6tsQp8u_mz2YRmNDa2XAvVDboYNg3fn2z3-7X60_rN493FM8oewDNhSi842zNhC-0frLYd45-yvKyzJ-qZrwzSdwO4y7Pz8_fvrH5XvlD49jBhay64hY8YRXhCejx8eH-9XTPfV9fYjpoXW_ow4760IM7CY9Kuz7eiHt4crzFI_yvkdP-IaCaagyUvcNDnKRDvye1iA_BwcSF6P7pwDyM236QwQ2brEFYdWjszsHBwpu1x_QhAgismC76GUUIro5njptHbq4p8Hs5uA9uqCs8fPgevOZ8E2tzIBT0rmNJqDroqE-dH1YeDo_lfkc_GHuX0yAExF3kStN54fgVKeRiLuzqKOgvO2dxK-yoYQLRtmJMcayPK3qsirSnLV0YEesiFj5Fz9eDEkY4v0UCSC8fH3IwXFrfXAIB8LzQZ4mEF4NqvvPoib8HTuJkuc5a7-KNOJObnAnbZPSJ7UzoD8MGnWEl2cY47Y_C4gNP18N8bOhomVJXTQSU87oduvQB-tw68I5ilGkpzLf5ulcK9Of5jvTjze6sHcIzcLbBRsQJ2l69VJFN2LipqxqxmrqQHn8AfsyWs4Hy6lgrJ5YTqeWCyizikJtfwj5lWXOy6yaWM4mHJdNnrf4ZjktyjJvceIvv_aXg8xlkVxp8eY8GDeH4_nj-v7UuYkmxy0qrfHhLMrvC_bNlJpURSmLZBJVcRMVZiz7sahs02t8wC-o3z9Pgns_nPDP4FSsQ5cgV_86yDWtrdXTZwbnT30dhrP3iq03ZKRkGcsmjJS3jLRl8UeM4EGFMWw_zfNA0n8LeVsWE-TVDfK2bsUfIW_sRhnQ6jeI3r4B_s1hJ3UrXis6F8n0kGd5JuBagpvHR_D-IxjY_Z9A8zYpBGQT0NMTnhVJA_kVaI07kC_n4vQK_6dDp8_67_8XuLloIJ_g5te4M9nKqhTn5hMvGEq5Bze8sTcv7cPD88e1NQFPFzVrLX9fuKIfMfUj2jzl9ADKvFVw0CZ5yiex3dYayUpBt9tYSLY-gAvbKwA_WndSVk7lmt0wKGSGdLT_VrHVkMnstfqsz5aow9A7g01s2BLxnab4AnT80DX0Hq9v_bJHQ7U9ootDBclZ7LBzFjNNcvbNQ2J4eh0PMTBhY937Z5IzKh1CQB_nDpKzlWni5lGFPZ0nscHFU-xGA61V8ItIzdPeHg2tUdvjK6PD73-7F661jemTJRdZUmCbtRwka6HFBpOyKHnDygpKgCrBpqj_VDfPxQNnKZs_cDYl94M94peYz_VV4MpTYwO9jCDHyPJQKC8zHVxmNmW-S_R1v5CzvyppSVLMH4ZJ6ArtT4H6ve11YwgvAq2RAt2Da2irTkNT3lIwL9YglWBoQK3pAelxD4GCG8ccPHUo49Q2jhO0tS6Kix6HPvU1E4YOyGbNUjSVqGCGyyQvuMjSipez_TIBgWXRZhmmDSSyFSlUbZs2UlRl0hTpTC054zzhvOKCcVYuyippskyWLZQZr_KapAwPoPQiEhRH6tkwnC2zqkj5TEON2g-TP-dxKkPTXOov4ZxkdzO3HHJT9ztPUqaVD_7VVlBBD_84GP8iu_v9vN-oM4_q0GmMU1wk4OP63TD5DvoZBDVSMuudXv75eXOI6p8BAAD__8IHI00">