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

    <tr>
        <th>Summary</th>
        <td>
            [AArch64/GlobalISel] `fcmp true` / `fcmp false` used in `and` / `or` branching condition causes crash `Unknown FP condition!`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    ## Description

When `fcmp true` / `fcmp false` is used in `and` / `or` branching condition, `llc` crashes with error `Unknown FP condition!` for AArch64 when using GlobalISel.

## Cause

The direct cause of the problem is that [`AArch64GISelUtils::changeFCMPPredToAArch64CC`](https://github.com/llvm/llvm-project/blob/f231821e6e9b6837e190314f45a92899baf6dc14/llvm/lib/Target/AArch64/GISel/AArch64GlobalISelUtils.cpp#L99) does not map predicates `CmpInst::FCMP_TRUE` and `CmpInst::FCMP_FALSE` to some `AArch64CC::CondCode`.

The root cause is that the developers might have assumed that `fcmp true` and `fcmp false` will be translated to an `G_CONSTANT i1` in Generic MIR by `IRTranslator` before Instruction Selection. Such an assumption is true in most situations due to the special handing of `CmpInst::FCMP_TRUE` and `CmpInst::FCMP_FALSE` in [`IRTranslator::translateCompare`](https://github.com/llvm/llvm-project/blob/f231821e6e9b6837e190314f45a92899baf6dc14/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp#L329). However, when such instruction is used in an `and` / `or` branching condition, `IRTranslator::emitSwitchCase` called by `IRTranslator::translateBr` will emit `G_FCMP floatpred(false)` instruction to Generic MIR [here](https://github.com/llvm/llvm-project/blob/f231821e6e9b6837e190314f45a92899baf6dc14/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp#L851), thus failing the assumption.

## Minimal Reproduction

https://godbolt.org/z/MMcG6fxer

### Code

```ll
define void @f() {
BB:
  br label %BB1

BB1:                                              ; preds = %BB1, %BB
  %A1 = fcmp false float 0.5, 0.5
  %A2 = or i1 %A1, false
  br i1 %A2, label %BB1, label %BB2

BB2:                                              ; preds = %BB1
  ret void
}
```

### Stack Trace

```
Unknown FP condition!
UNREACHABLE executed at /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Target/AArch64/GISel/AArch64GlobalISelUtils.cpp:105!
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: ./llvm-project/build-debug/bin/llc -mtriple=aarch64 -global-isel crash-reports/gisel-aarch64/1.ll
1.      Running pass 'Function Pass Manager' on module 'crash-reports/gisel-aarch64/1.ll'.
2.      Running pass 'InstructionSelect' on function '@f'
 #0 0x0000000003adad2a llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Support/Unix/Signals.inc:569:11
 #1 0x0000000003adaedb PrintStackTraceSignalHandler(void*) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Support/Unix/Signals.inc:636:1
 #2 0x0000000003ad9526 llvm::sys::RunSignalHandlers() /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Support/Signals.cpp:103:5
 #3 0x0000000003adb605 SignalHandler(int) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Support/Unix/Signals.inc:407:1
 #4 0x00007ff7231a5980 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x12980)
 #5 0x00007ff722095e87 raise /build/glibc-uZu3wS/glibc-2.27/signal/../sysdeps/unix/sysv/linux/raise.c:51:0
 #6 0x00007ff7220977f1 abort /build/glibc-uZu3wS/glibc-2.27/stdlib/abort.c:81:0
 #7 0x0000000003a017a0 llvm::install_out_of_memory_new_handler() /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Support/ErrorHandling.cpp:193:0
 #8 0x00000000016a3f3e llvm::AArch64GISelUtils::changeFCMPPredToAArch64CC(llvm::CmpInst::Predicate, llvm::AArch64CC::CondCode&, llvm::AArch64CC::CondCode&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Target/AArch64/GISel/AArch64GlobalISelUtils.cpp:107:5
 #9 0x00000000016d22e2 (anonymous namespace)::AArch64InstructionSelector::selectCompareBranchFedByFCmp(llvm::MachineInstr&, llvm::MachineInstr&, llvm::MachineIRBuilder&) const /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp:1629:32
#10 0x00000000016ba4d3 (anonymous namespace)::AArch64InstructionSelector::selectCompareBranch(llvm::MachineInstr&, llvm::MachineFunction&, llvm::MachineRegisterInfo&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp:1749:5
#11 0x00000000016a564a (anonymous namespace)::AArch64InstructionSelector::select(llvm::MachineInstr&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp:2471:5
#12 0x0000000003fa4472 llvm::InstructionSelect::runOnMachineFunction(llvm::MachineFunction&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/GlobalISel/InstructionSelect.cpp:187:11
#13 0x0000000002894c85 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/CodeGen/MachineFunctionPass.cpp:91:8
#14 0x0000000002f797d6 llvm::FPPassManager::runOnFunction(llvm::Function&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1430:23
#15 0x0000000002f7e602 llvm::FPPassManager::runOnModule(llvm::Module&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1476:16
#16 0x0000000002f7a0a9 (anonymous namespace)::MPPassManager::runOnModule(llvm::Module&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1545:23
#17 0x0000000002f79c1d llvm::legacy::PassManagerImpl::run(llvm::Module&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:535:16
#18 0x0000000002f7e8e1 llvm::legacy::PassManager::run(llvm::Module&) /home/henry/aflplusplus-isel/llvm-project/llvm/lib/IR/LegacyPassManager.cpp:1672:3
#19 0x0000000000d2cdbc compileModule(char**, llvm::LLVMContext&) /home/henry/aflplusplus-isel/llvm-project/llvm/tools/llc/llc.cpp:737:41
#20 0x0000000000d2b162 main /home/henry/aflplusplus-isel/llvm-project/llvm/tools/llc/llc.cpp:418:13
#21 0x00007ff722078c87 __libc_start_main /build/glibc-uZu3wS/glibc-2.27/csu/../csu/libc-start.c:344:0
#22 0x0000000000d2a96a _start (./llvm-project/build-debug/bin/llc+0xd2a96a)
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzNWV1zo7gS_TXOi8ouEN8PfrCdOJOqZDaVZO6t2heXQMKwC8glYJLsr99uAeYjntlkJpvZlGMjJKQ-p49a3XYo-fNyRi14kXNRRio9VKksZsb5zFg17_9PREFmrhFH-YFUqhZwTWZ0e7wXs6zUN9OS1KXgJNXjWcEHI6XCRqhYESVpsSeRLHiql6Ib7M-yCAdEipWJKMljWiVEKCUVdn4p_izkY0G2t8PnTHwghhGrlYoS1yaPaGld4vSXmQxZdnUvssUQS4t0w8DO4f2HRBCeKhFVJMI-ImNSwb2DkmEmckRWJawiM2cNi7brXeL0X6o0K2fWCl5Rwoq92G5ubm-V4A-yHbbZwCMz53xG_aSqDnow3cJrDxjrcBHJHBpZ9rX7mMOqf4Ap0AwBBnzE1DJ9agpXBKHrW54wA8My7dh2WED9IAhZ7PLItAfzpPjcA1N7gfO0psCVNrq_0_OkgSyiwwEIug6CGQ0Il-CJQlYkZwegQvA0YhXcAjyb_HBVlFUDHCHvHu6-XKBDwO2nB2xX1_d6RCVJKXNBeiaBIj1uA87dSI5iWkzdo6TsnNN5Az3ExVeRyYNQJcnTfVKRhH0VhJVlnYMSG6dNtNtaONbuY5plJBQwiBVlBjA52sm0ki93m98-3z-sPj-QVIsOBH4pCqHSiNxc3ZHwGUdd3T20z7ZaF6BNQZAFVUcoWQI0C321IPd1lOD02lK95zQsMBFnz2VZkTKtaoY9JeFwG8xBwOVBRCnLACdsBFA6KPUn_YHbVet6hEAPPLKxkfmBKfHLlIyqAMpRwEfFQmNocaddi6J4F-STfARtKIwvOjCUyHg68MYgXLEfiFgv2RJ5Wt1D5IqSDWtUFbEsgxVOCGRM71odNYiTNKJDL5E4k6zCvQekN2IFeNppPRBQxlCO4MxEgK_-647yHRPBAJtgVAlbMc2QZxR5vytOhe-btEhz2AJ3AszmDQnDYRPMkocyqxZS7aH1F_zf3ESXbvwE2ngxtz4dMAINe0D0-pVlzQ0u4rQQ5KtMYWvZRgw0Y7iceeumf73GxfUlAQGRjIUiA1k567U5nBibFgx5y9_MWutQDFHYOu_mREHiVbcmNFamHtAHuUZJxFg4OBw_BoOpHgxHaWo2D-OYRm49jLaPYt8I0rhNxxDp-0BszVCi0ry3a3jnExed9uh9xaI_CSgwOu3YpvmtLKPp_Hx3sdp8Wq2vL4h4ElGNJwQeLnSbwGGGH6JQz_DJ4uyQ1SX-z9NSq3-yxd7hjLZWpuEcjbu9vljdX0CECzF4MBLWe2DqIFWFseHNISCF3SdKDIN4eKRFlNVc6H2p0zMSApsVktluzoZeDjv2qHs8v4NbJfeK5QQQwmlcVGgEWZwIOXWa8TkXYDa20kIPicg8ryAfzQTIgLEmxZvvNRma2MaaeQO01NDg7rwdCm1z0e1YE825q4sCA8wBogv4zdvWRRM_b_HGDSvYHo8Lj0g8gHmdCRz1qkWo11JBTy00SAGaDKBdJO4MgHYTR7xW5yBagxhPRvdnMc44ZUT7Sx8d5XObdd6qtKi0Bxp9U78fpNjjDjIJJRh42cV9CmN1qPpZ1d7XByQErr4U6RPeSPcFxIsFqAUWdtwAJWr2cMwpHMFDMrG9meMTiC5DR_h6o9PVRxjsWi4a3NtLJ_YGDnVP0Q--HplddofB-xncWdrtewsJ7i21JpaGruGQKZUf5Hfb8MY02q1xXhx7IALmBL5BdjslSkgExE5hAPWPsz_57s6155AG1E_zfVE3HYcqAQXzRSkXxoyujSeTwiyYOhyXcYbLUCNwhO8RxQAQ6eILbl2YLJrXv9fW4_2xSRew6-i21DjgYoEBCtzLxQG3e93AhBtftTVgGXzqqRda6XiEG70l7sQSz4tNwkKpkb7Okoo3bOin9CL-ZBFv7HLD9JgxECfmhpB47mRd7WS8y0Uu1fOuEI-75CiId1bDBZbqWm4Q-DqlBtbYbH9otukyK7bEwOw3l9XDUDeqb267WlWnJtMFXlSbTWh83bh3YO3HT3xvvPODMZ-cUkFxP7FCFs-5hJy6YLkoD_pYCEbYXhxJXUlS6lZb7q118bMVfP28BYJHhN8wLIuEnugFg6_qvFvjbhCq5RVyrvJD8qkT2DuGXU2TRY8JpGmMOQ6Zza1_geM3U9slL9_qvxOQqFRCXRWx_Djhfodazw569SKz5iQaOK7N3ofZ75P5i4mgtmeOiRinGjGzbY8OHPoye2xyu7r4rXghhpfAR0J5B-zfKvCnVnZ-971BJohwR_kK9QM78p1v6xtz8wHgk0j_PYgnjGlxBehEv0dlj1DFXuDxYb64vcVnuxrjg_Fc3cHbtdiz6HlgRecg2zJQllaPxZlgEa5BX4HlRtdMYw22tz4Eh6dTeLfH4U5wMIMF_xRhbv6b4BzbmTjJmwouMvnASZmeqU2H-vmu8kN2RPWr0DiWM_GUP1WcL8x_BvPLgZiuh19vDbwySskMTiMeRpDZ5Ic0E0cJQUardF27Gh_d19f_u4FksxJP1c-bX0mZlboZNe-tzZ6FAdnuAzI1JjaHkAaRnOHPAu-_vG36SFxPGTXHFZPnR1C77XZYEu2gjlHVrrPlNdVTVGLVqIu45lJ36nl0KWXZdl-U4PJ0gp4FLiPNwhgrXv91lS5Nm-ePtenkG8YzsTRd17ZNw3CtM760eGAF7KxKq0wsZ856kE70Z6tz_rpfX9_-02vzc1rZfqv33d9Zz2qVLX_8i0THNxzjLFnG3Itdl_mW6_muy0Pux6HtwIaPuWP5oX2mv0cukYsZpVCxEj0FXAMNZ-mSGlhT0wDlYlsLNza4FQbcNIPY5b47sw0BYskWaAd-4X-mltokcFUJnRmkxGXfCfsZqn6hqcf5WV0lUi0_sb-ewfTkTK-91Lb_DX0OkaQ">