<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/117684>117684</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[X86] Unexpected Illegal Type
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
abhishek-kaushik22
</td>
</tr>
</table>
<pre>
Compiler Explorer: https://godbolt.org/z/qnfb4M8rY
```
llc: /root/llvm-project/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:969: void {anonymous}::SelectionDAGLegalize::LegalizeOp(llvm::SDNode*): Assertion `(TLI.getTypeAction(*DAG.getContext(), Op.getValueType()) == TargetLowering::TypeLegal || Op.getOpcode() == ISD::TargetConstant || Op.getOpcode() == ISD::Register) && "Unexpected illegal type!"' failed.
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 <source>
1. Running pass 'Function Pass Manager' on module '<source>'.
2. Running pass 'X86 DAG->DAG Instruction Selection' on function '@module_sf_pxlsm_mp_pxlsm_'
#0 0x0000000003c16b18 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x3c16b18)
#1 0x0000000003c1450c SignalHandler(int) Signals.cpp:0:0
#2 0x00007f34db442520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
#3 0x00007f34db4969fc pthread_kill (/lib/x86_64-linux-gnu/libc.so.6+0x969fc)
#4 0x00007f34db442476 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x42476)
#5 0x00007f34db4287f3 abort (/lib/x86_64-linux-gnu/libc.so.6+0x287f3)
#6 0x00007f34db42871b (/lib/x86_64-linux-gnu/libc.so.6+0x2871b)
#7 0x00007f34db439e96 (/lib/x86_64-linux-gnu/libc.so.6+0x39e96)
#8 0x00000000038b1b33 (anonymous namespace)::SelectionDAGLegalize::LegalizeOp(llvm::SDNode*) (.part.0) LegalizeDAG.cpp:0:0
#9 0x00000000038b4213 llvm::SelectionDAG::Legalize() (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x38b4213)
#10 0x00000000039cc57d llvm::SelectionDAGISel::CodeGenAndEmitDAG() (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x39cc57d)
#11 0x00000000039cfcd2 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x39cfcd2)
#12 0x00000000039d0ff0 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x39d0ff0)
#13 0x00000000039c18bf llvm::SelectionDAGISelLegacy::runOnMachineFunction(llvm::MachineFunction&) (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x39c18bf)
#14 0x0000000002b7ba89 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (.part.0) MachineFunctionPass.cpp:0:0
#15 0x0000000003180c10 llvm::FPPassManager::runOnFunction(llvm::Function&) (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x3180c10)
#16 0x0000000003180fc1 llvm::FPPassManager::runOnModule(llvm::Module&) (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x3180fc1)
#17 0x0000000003181877 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x3181877)
#18 0x000000000086bf88 compileModule(char**, llvm::LLVMContext&) llc.cpp:0:0
#19 0x000000000075fb4e main (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x75fb4e)
#20 0x00007f34db429d90 (/lib/x86_64-linux-gnu/libc.so.6+0x29d90)
#21 0x00007f34db429e40 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e40)
#22 0x00000000008628ce _start (/opt/compiler-explorer/clang-assertions-trunk/bin/llc+0x8628ce)
Program terminated with signal: SIGSEGV
Compiler returned: #139
```
This is happening because of this combine which produces an `i1` node, the condition checking for `i1` to check for pre-type legalization fails on AVX512.
```
// Vector FP selects don't fit the pattern of FP math ops (because the
// condition has a different type and we have to change the opcode), so deal
// with those here.
// FIXME: This is restricted to pre type legalization by ensuring the setcc
// has i1 elements. If we loosen this we need to convert vector bool to a
// scalar bool.
if (Vec.getOpcode() == ISD::VSELECT &&
Vec.getOperand(0).getOpcode() == ISD::SETCC &&
Vec.getOperand(0).getValueType().getScalarType() == MVT::i1 &&
Vec.getOperand(0).getOperand(0).getValueType() == VecVT) {
// ext (sel Cond, X, Y), 0 --> sel (ext Cond, 0), (ext X, 0), (ext Y, 0)
SDLoc DL(ExtElt);
SDValue Ext0 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL,
Vec.getOperand(0).getValueType().getScalarType(),
Vec.getOperand(0), Index);
SDValue Ext1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT,
Vec.getOperand(1), Index);
SDValue Ext2 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT,
Vec.getOperand(2), Index);
return DAG.getNode(ISD::SELECT, DL, VT, Ext0, Ext1, Ext2);
}
```
I see two ways to fix this, either we address the `FIXME` #117682 or enforce the check by actually checking the DAG combine level before the combine #117681.
Because of the first fix the quality of generated code may be poor, so which is the proper way to do it.
@topperc @phoebewang @e-kud Can you please share your thoughts on this?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMWV1T4zrS_jXipispW04c54ILkw9equAdamAp5oqS5XasRZF8JBmS8-u3JDufM3NmOIfaWoqZYMn99NPqVrdaYdaKlUK8JOMrMp5fsNbV2lyyoha2xtfBK2ttLV4pvSh0ub2c6XUjJBpYbBqpDRqS5FA711iS5IQuCV2udFlo6YbarAhd_kno8g9VFaO7zHwjUe5_06j_jXIpuUcgdGm0doQupXxbDxqj_4189-g_REHocqZLvEZF6PIBJXIntJrn14Qub3HFpPgT5_n1kDcNSfJpOvW4b1qUQCZXTGm1XevWksncE03yY4SdeDeze_rSEJoF_Z3A_P91iYTmhAbo3Fo0HgC8JTR7vL0ZrtA9bhvMAzChGaG5p7RCN9PK4caFsSmhM_jS-OEnJlv0IruJKZBkTpI5PDKzQner39EIteoo-BcDOyCTGZnsQL40PDDLjsRvHno7O5yZVtYx5T4g-BVXwjo0YY6mhKZAKP2Xwk2D3GEJQsrAxQX6MaGU0AlUTEgshyTK728X-cMCbFushQMGRbsCg402Dpw-jxnh6rYYcr0-8vlpJAhrW7SELoGpEoTisi0RXI3ADbM1FIy_OsM4et0PjvFXKNu1jwUS5dGQRNN7o1eGrYGZVbtG5Wwfebrx-LyP7AHuIpsuuWRqNWA7T9uBM616JXRZCBUYchhoD8GaxgO1rmnd0MJgk6UDZtcDu1WObUgyF8qhBJLMrG4NR5IsSJTHntXXVimhVtAwa4HQybJVIXzg3g_cMcVWnssEtIK1LluJ_q0TJDrxNtMfoT1nKczz6wFJFvP8Gm6Udabt8Pc7oAevdoo9_CjqdL3Y6qXZSLt-WTf9H3468guXRBBtot1PwuO0iDM47Bi7td0f90YoF1zy6B10sq0Me3_R1hlk6xBlMxDKdTGX_UPfEHoVbXpafnN1pOMz0qNxxOFBrBST_8dUKT141nPohm2fU6Lwr0OhPcqkSkZlMRrRMY16yl2u2mTpSzoaSKHazWCl2m6CD60epoFYEDnQSk4Bp-m04tC42iArX16FlB9DD_IH9NE53dEkhZUN5n2U9miSHoDHp8A0m1QJsMJv8g_BBsEDbPodbFx8GDAuDoCTU8BkitP0Y4BB5ACYnYRRVsRFknjAfaUBxdZomxDv00-oOR582DDjhj5q4PuSdxye0zN2IxonRzvzpHyeENgVg0_afJ3mbtX83jvNGFPOx5PyJ7xuHlB2o33Zz1W5WAsXKv6nkuxoHEjGZyQrXtJfkuxGcymvmBX8Smr-ak98uc_r3NfikOs-0wRP8mACPTWhjKoq-qUJplVf1B3jtVC4Y3tiwndzn2tDYHmwITlzQ5wV1V_Y4COYb_83LAlcD5aMji2hxaRg2RR-SsbX_SMzfsj_e-JHqeEHeGcpwpManyxvnEU8Pg6R5b2X2x0_PkznU9axI3VYx_SccsXj36B8F04yp_7vhz6bbsXjA93JGd04m0yO6MqjgD0ifrNuDvvxv0Ha0zqQPqlrUZYWVZZBr2C_kLxmJlSl3B_YDgxvb5_u9p1OoCkl_0HsnZSnaDKuihHCmgn1WWZ1kHuraHR2npiW0w8e14LIATA-B8RRBC8vXubFOmbcy5E5v60CR0cq6JknaMYROvDPWqYOtFO5644cmrVQzHd478LV0B0Sfav0cHP9sLh-IlG-vwUw6FqjsPTT4XCdTM8a_MdaWBAWatY0GFqTAjlrLYKuwPlJrteFUAjvteA1NEaXLUcLLDTWIiZpBCqcgmZdt6dVKbpCWiN_9YiVNod3ne4mwmhjcOD7U5Dd-YYFQd-jWt_y5E_P49j3TSeUoetJ4Qm50waW92BDrbFQhmbJQSVc4NIw59Aob8ryHtbM1aAb33dlOyNdjR5xB3kgXzMLDEpRVWhQudBFh872HaFmb9jZwdSq63F136qHuwOroUQmj6gGT7laW4QaTWiB9zqXN893C--gnSsMWmdE6OGd9ksE3y9RsQVUtjV-eb1-i47zY1TPX8SAEkMrPYSbylOXWltUnWPfERR2SrhWb2gcvHVLWmgt_TA7RrScSdbNdfxF5VfyCfkv7yqeHha3i9ljf08RhP3PXhQNUyWhmd9dvwR7WDzOZkdQP0U5u7zxQw_BhsPYDvzu6bEDF_HvIP9S1w73CfnTY3ieXPVm96uJm5AlLEqYaQ81g2f_37c-hiIYDEiy8KHt3_Ov796L-lf64ecfjH3bj3VKH-a3msP8ltBssXEL6ULPc7WfDfRhsXGRZw79pVjX3GT7lV88P37NZ48vT4vZ45evL4vbR6_Go87-qSP-CsIruVElbn5GOv6bpMH75sd649_RSz9fL_2p3i6V_0xbt8HONASH9p9x_0mPQMlkfpZab8AignvX8M621qeASmxCtvDiKFyNxucNVpYGrQ2ph6RRl8LSKJSYeJJmFLQBVJU2vL8DDCm_2ALjrmVSbg_VwU_P8-t9nZH4hhIKrLTpZfuJHXjs08_VcZVCqISxrieL8EfLpHBbP7lChSZUS59SYM22UCA0Wps-U3dlTXS2NEY33kK29baXGoQb9pfio8jppkHDgYyiptZY4DtTK_-Eg9e2hBlTsNUtNBKZRbA1M-gHjE_87ap2oaSFtUyWJMovysuknCZTdoGX8SShaZRNxulFfVnS6XjMiqwaF8U0GY2mxXQ8HcXFOB1Tlk3phbikER3FsReJaZIO04yOOCsijCfjoioyz2nNhBz6o99Qm9VFuJ29DMs3upCsQGl33yiYy3CTW7QrS0aRFNbZg5wTTobvHp6zlIzncHS_fNPfL_tNfNEaefn3r4x7Xm-X9D8BAAD__zp5j_I">