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

    <tr>
        <th>Summary</th>
        <td>
            LLVM 15: use of llvm.minnum / llvm.maxnum on vectors of half floats fails to compile
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

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

<pre>
    We ran into this on an internal tool that uses LLVM for jitting custom functions.  The following small LLVM IR will reproduce the issue:

```llvm
define <16 x half> @cvt_and_clamp(<16 x float>) local_unnamed_addr #0 {

    %2 = fptrunc <16 x float> %0 to <16 x half>
    %3 = fpext <16 x half> %2 to <16 x float>
    %4 = call <16 x float> @llvm.maxnum.v16f32(<16 x float> zeroinitializer, <16 x float> %3)
    %5 = call <16 x float> @llvm.minnum.v16f32(<16 x float> %4, <16 x float> <float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0, float 1.0>)
    %6 = fptrunc <16 x float> %5 to <16 x half>
    ret <16 x half> %6
}

declare <16 x float> @llvm.maxnum.v16f32(<16 x float>, <16 x float>)
declare <16 x float> @llvm.minnum.v16f32(<16 x float>, <16 x float>)

define <16 x half> @cvt_and_clamp2(<16 x float>) local_unnamed_addr #0 {

    %2 = fptrunc <16 x float> %0 to <16 x half>
    %3 = call <16 x half> @llvm.maxnum.v16f16(<16 x half> zeroinitializer, <16 x half> %2)
    %4 = call <16 x half> @llvm.minnum.v16f16(<16 x half> %3, <16 x half> <half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0, half 1.0>)
    ret <16 x half> %4
}

declare <16 x half> @llvm.maxnum.v16f16(<16 x half>, <16 x half>)
declare <16 x half> @llvm.minnum.v16f16(<16 x half>, <16 x half>
```

See the following godbolt link: https://godbolt.org/z/M391nbd3s

This code compiles fine with LLC / Clang 14, but fails with LLC / Clang 15.  See the output from godbolt (pasted below):

```
fatal error: error in backend: Cannot select: 0x55882c05f798: v16f16 = X86ISD::FMIN 0x55882c06e9a8, 0x55882c063890
  0x55882c06e9a8: v16f16,ch = X86ISD::VBROADCAST_LOAD<(load (s16) from constant-pool)> 0x55882bfe2cc8, 0x55882c05f8d0
    0x55882c05f8d0: i64 = X86ISD::WrapperRIP TargetConstantPool:i64<half 0xH3C00> 0
      0x55882c05ec38: i64 = TargetConstantPool<half 0xH3C00> 0
  0x55882c063890: v16f16,ch = CopyFromReg 0x55882bfe2cc8, Register:v16f16 %5
    0x55882c05ef78: v16f16 = Register %5
In function: cvt_and_clamp2
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:
0.      Program arguments: /opt/compiler-explorer/clang-15.0.0/bin/clang++ -g -o /app/output.s -masm=intel -S -x ir -fcolor-diagnostics -fno-crash-diagnostics -O0 -march=skylake -Wno-override-module <source>
1.      Code generation
2.      Running pass 'Function Pass Manager' on module '<source>'.
3.      Running pass 'X86 DAG->DAG Instruction Selection' on function '@cvt_and_clamp2'
 #0 0x0000558823ef5f84 PrintStackTraceSignalHandler(void*) Signals.cpp:0:0
 #1 0x0000558823ef3dac llvm::sys::CleanupOnSignal(unsigned long) (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x38c8dac)
 #2 0x0000558823e31e68 llvm::CrashRecoveryContext::HandleExit(int) (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x3806e68)
 #3 0x0000558823eebeb2 llvm::sys::Process::Exit(int, bool) (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x38c0eb2)
 #4 0x000055882184f54f (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x122454f)
 #5 0x0000558823e386fa llvm::report_fatal_error(llvm::Twine const&, bool) (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x380d6fa)
 #6 0x0000558824fc8020 llvm::SelectionDAGISel::CannotYetSelect(llvm::SDNode*) (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x499d020)
 #7 0x0000558824fcd5ba llvm::SelectionDAGISel::SelectCodeCommon(llvm::SDNode*, unsigned char const*, unsigned int) (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x49a25ba)
 #8 0x0000558822aa887f (anonymous namespace)::X86DAGToDAGISel::Select(llvm::SDNode*) X86ISelDAGToDAG.cpp:0:0
 #9 0x0000558824fc5ea0 llvm::SelectionDAGISel::DoInstructionSelection() (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x499aea0)
#10 0x0000558824fd1989 llvm::SelectionDAGISel::CodeGenAndEmitDAG() (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x49a6989)
#11 0x0000558824fd54f9 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x49aa4f9)
#12 0x0000558824fd6f48 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (.part.0) SelectionDAGISel.cpp:0:0
#13 0x0000558822ab28c5 (anonymous namespace)::X86DAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) X86ISelDAGToDAG.cpp:0:0
#14 0x00005588231e3ce9 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (.part.0) MachineFunctionPass.cpp:0:0
#15 0x0000558823692f40 llvm::FPPassManager::runOnFunction(llvm::Function&) (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x3067f40)
#16 0x00005588236930b9 llvm::FPPassManager::runOnModule(llvm::Module&) (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x30680b9)
#17 0x0000558823693ca0 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x3068ca0)
#18 0x000055882429e95a clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::StringRef, llvm::Module*, clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>) (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x3c7395a)
#19 0x0000558825112eb0 clang::CodeGenAction::ExecuteAction() (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x4ae7eb0)
#20 0x0000558824a1b1d1 clang::FrontendAction::Execute() (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x43f01d1)
#21 0x00005588249a2ed3 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x4377ed3)
#22 0x0000558824af9adb clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x44ceadb)
#23 0x0000558821850b64 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x1225b64)
#24 0x000055882184a10b ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&) driver.cpp:0:0
#25 0x000055882480c969 void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::'lambda'()>(long) Job.cpp:0:0
#26 0x0000558823e31ce7 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x3806ce7)
#27 0x000055882480cf5c clang::driver::CC1Command::Execute(llvm::ArrayRef<llvm::Optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const (.part.0) Job.cpp:0:0
#28 0x00005588247d6fce clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x41abfce)
#29 0x00005588247d79ed clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x41ac9ed)
#30 0x00005588247e283c clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x41b783c)
#31 0x000055882184e8e9 clang_main(int, char**) (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x12238e9)
#32 0x00007f9bf3592083 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x24083)
#33 0x0000558821849d1e _start (/opt/compiler-explorer/clang-15.0.0/bin/clang+++0x121ed1e)
clang-15: error: clang frontend command failed with exit code 70 (use -v to see invocation)
Compiler returned: 70
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzlWltT6zgS_jXhRZWUb_HlgYcQYIYtGCigztl9SsmynHiOY2dlGcL8-u2W7MRyHHLO2cxsTS0Fwdal--tW3yQlLpOPy6-cCFqQrJAlkausImVB9DsXBc2JLEv4WFFJ6opX5P7-ywNJS0F-z6TMiiVhdSXLNUnrgsmsLKoJIa8rDkPyvHzHAdWa5rmed_dM3jN4EXwjyqRmHAhzklVVzUfubGRdj6z207f0b56_rXVTwtOs4GTkzm2fbMmK5unIvSEjz2JvckGLZMFyut6MnLAdkuYllTBm5EQkLxnNF3VR0DVPFjRJBBk5rkVGwVWXL4GfkTN1gM01STdSgFikTw9HWKCYPhaDhNuQ4Ft5iBk5dObvgHYJeIoAQ-UdAvCUYiZrui3q9eTN9lPXGZCc_MFFmRWZzGiewfPImQ9K44KKDObT72GeFZ8zRyGGObpz9UzsiYUD_u4vysQM_fknDWj6qQEJPmg1fmOrwXXXaBMOli_4z5vJ0CLtJDpN_YQdfEr9h3x7mPr_zLkN9-hg7uvc9ju423GfeGY3TPQNayAqHHDer8cgZ-3vA-zcOT625v23e-554REX8r7LhX5wNQfUedR_fnC5hkibKbIrxwvXOXWffpdlEpe5JHlWfIMkS1ZSbirMts4t_Da9k1Is4e0P-HtwI7uIE7fqkn3FwoCVCYeP9SbLoRBQDvueyRWkdkDo3JJ5ToGfrUJ-XEuS0iyvBodMoUhokZa13OBgAUVEixW0sKGV5AmJOYiBqjxSHujXlEqoVLgQpUAR1QNUMCSm7BsvEmyb06IoJal4zpnEBms7nYahw6xpGkQhtugVUP71z9C_e7lGpu7s9uHut_1on0c0RAn3LW4YWa3Z9cbtqMIMtjog_eXq-XF2PZ-9vC7u4QGWGSSHOJSgBiqcFWnFMCisJC3keAPVmFLHTcsqTrnDmAlpmoaJtfeEXjuAynzvAMxXQTcbLp7vnsgrFUsu5w3TJ-TpzmBOGyGs7a_u3LIUij2bLiPO3LDLaIjicVo93Q5ocV5uPm5BM898OaAIaM3AfNAY2kWFhDukEJ4G_bVvJ3fm3BW7-hYH93KSGvJ0fzN7uSFVHa8zSSg4wBLL3FJIzCU9pwOXqOMJuBK8qAJX_xtDVfw7mqdzq2riCl0GGIEps7xOtL8wQauVsmwpKOMo7kbV04xXFXhMVdZCN-NMWlUlyyi6EmQ7UjGRbeSkiRUSiJCkhpq59S4LuqInUS4FXRNYsnrNC4nA0XvLDSJrAoAY8-0mLwVmrluGbj0Gt7YwJN_GWdE2jpwr-CXjJRmXSANMDCkpn59UZLym1RqUjruNnIxfyHhLMkHGKSuB9jjJ6LIoK5kxGJoW5VgJbzY_WkhFsBWQqb595PQbJ-OvMLZ8gziQJXy8hq1GruJvo5s2gtoo7Ryj2pIXXFC1vqrHwZ5nKCgwgkIoqgB7cNuYAHnChgda0CVKH-COqeXhBAYbJ2h07Q4RBO8j17NfxjAS_pE7cA5RaxYvKk4hHk2_NT_F4bAqChrbVlWPtbXgR1m4y1PweY88CdCwWu9XNJqXbAlbu1-BQo4ShG9lloycGYYb3VVN2AatwlJ_O9p2j7abUEaUAasIUn1U-mGec1rUm8dCUwMOdVHBI1hhXqJRRBjg_iuTgl9r64YsBAj7tA8YHROja3M_7GCcowU9c4bW8QHxSML-TPdoddxsM4AUgrrOiBKygR8aKF0TJY957Axp8kn7tX7pYoMUq1PB2TRpAQQDo9fFaIdeOvXS83CzHccDYga3aW_dQj-lHY3oWLpQmX6hMz2kyl336zuWIypNjhz_T1CPlQAeA7DfBeylLLQcqwN458Hg2nfw0pifKkP-xaXuNmR4uf4NYlHjh2eB7UVRAqgM2EEPdjKN6UnYuhVD5bxcrzEqDeOek52jsxUV7YKYPef0LS-iDghgSBh2JXQoDcNA2S0tyuJjXdYVwX1itVHZM9IyQCgGgV_LAamPr5GqnnjeThyOmVFP31NOT5vJddlJBp1cEJ7TNCgg2e_DIbpbJtTEjsLotEWDPn7hxaxIbqDyga7zoqQ-gDBQ2j2UEEhOo9Stszy_olXGrvKSfauMhd0l930MOZ8MFCAaMjg9GfzUC0_KAAXcY_FA2QpCXQvXkOGgrxVisqFCIsSI9EkfGi3ic00Xip2QTX_KhX4S80nPQpBGfoI87zLeNYQeZSzaOpgGwXyquQF6w7jMTOZHTup1Pf72Cae25eMPIzpDMrP8ACAZBun3MLtWHH0H5gdV9poL2jSdFW8IcAy8QR8vM6JqzpeUfTQl1B753Xqzt8u_ADXrBVgjM3lOxKMpJXqiLvAggl7pM4tHtUUCJJ3u6_2-56ZYgi02pU5nyK-cJly8cNwQPW7UhYxRFXWGNoH7xCi9cT8x6B6ehoZ0IpqEHcjymadmc6v2WY9go4RZY_tzUslE99RF9u-aLzYSzHDeKQ_p-2LzLjLJF5A3OV0bkxKe0jqXiwSCn-QnJsK2TZ8qn8cMWODCKhtmYJQEU9t2eGwNrMysPXBQpT9nteSz89cBlAfAvovPMesAasd2Ynfx3QrcN-2WpwvwrNDc1ALOBjQz-UPxxxPXVJ1mdqcOmhgf1t5xWc6Z990gAHQGfDPv0zSiSWwEAA10L8Vbyegh6AMpz7ln8BjEkNiA7Zo7wakV-x5hzF6saWbG0ZkQ9APd3J2bGwB9kH2wKeicPJxrZzkFcAb6_j6W2lZMWk3P7Ve1UezW-Hhh_QWqpLJJGAOiKDNJRPbGxWAR4BhFgBdaLPIjJW0n-rWHOguhFKZ6tQOpIIRD8KIHz_oWaYE49iageTfmMLdxW0aLpO-Lgwuzb9Qxm-ZG4z5UN5GwE0gXC7bd2rZ-ibGUxqiZISilJGMwNiykoBmeIOruHjkQDu0bT-13_Thktt_AK9PQqldTRk6Q03WcUDz02ukKT831udI_ynh4Qfz-uRDjwXedCz3XxQtNef5h6PPztTvn0RHgNMw56FtWOmXk_9oyeoX6URMwy68Adl2MH9WcWjJ6kOBadRrxuDcRBxwrlT4ZOuudXO1kO0NQt2mc6r3aThtRTxtBhKc2P6YNUHV1XBXQe5-BCEdKwoMwu1v9Dc1w4ZuDzu_VXmMif6IOGaioq0PzsN0LuBO6R33xuvNs5PmBBH9M93-hDs9VTthxAEoxtGb3EjIPYeOuJrYFRYtaBY7ZmQsEF9gZeNqqLEijOHWnkWOFLlks8izGIAZxRcFq-EMrfG5Df-F74zwr6u14WdS6g02qcuIrPo4HRAwuvSLKixKbE03_XKLZHGjumLaTRu2VOD6oRrxUVlUvXucrA8C7enB_dVnPt5nUl_2BhcjqipPxG15jVpyTrFOTNozachS_clGLgqsL96ANvO1V_QW_tH0_CgLbipyL5NJNIjeiFzKTOb9UXw_UUJFdmZLOdyPUVwc6X8PAC7E3ZfQVjlTXyOrrO1XznQOA2mjxohb55c_fvoItTMOL1aUVuAy2IlA3BGDQYcJDO6XUdi0nDl2HOhc5jXleXY6mV6Pp9UV26ViOY0O_ZduhFUyiyOfM9sAKppadutbIszjYVD5RUpVieSEuFYa4Xlb4xRAIm9W-k1bq6Jy39GktV6W4XFpxXvMLhfZSQf0PNWBHAA">