-
Notifications
You must be signed in to change notification settings - Fork 15.3k
Closed
Description
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?