Created attachment 20273 [details] IR When attempting to compile the attached IR (reduced with bugpoint) with `llc` it yields: $ llc foo.ll -filetype=obj -O0 llc: /home/alex/code/rust2/src/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:3432: bool {anonymous}::SelectionDAGLegalize::ExpandNode(llvm::SDNode*): Assertion `TLI.isTypeLegal(HalfType)' failed. Stack dump: 0. Program arguments: ./build/x86_64-unknown-linux-gnu/llvm/bin/llc -filetype=obj -O0 bugpoint-reduced-simplified.ll 1. Running pass 'Function Pass Manager' on module 'bugpoint-reduced-simplified.ll'. 2. Running pass 'ARM Instruction Selection' on function '@_ZN3lib3ptr19swap_nonoverlapping17he2ab85414b948373E' #0 0x00007f202a6e7dda llvm::sys::PrintStackTrace(llvm::raw_ostream&) (/home/alex/code/rust2/build/x86_64-unknown-linux-gnu/llvm/bin/../lib/libLLVM-7svn.so+0x8f8dda) #1 0x00007f202a6e5b7e llvm::sys::RunSignalHandlers() (/home/alex/code/rust2/build/x86_64-unknown-linux-gnu/llvm/bin/../lib/libLLVM-7svn.so+0x8f6b7e) #2 0x00007f202a6e5cf2 SignalHandler(int) (/home/alex/code/rust2/build/x86_64-unknown-linux-gnu/llvm/bin/../lib/libLLVM-7svn.so+0x8f6cf2) #3 0x00007f20296d84b0 (/lib/x86_64-linux-gnu/libc.so.6+0x354b0) #4 0x00007f20296d8428 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x35428) #5 0x00007f20296da02a abort (/lib/x86_64-linux-gnu/libc.so.6+0x3702a) #6 0x00007f20296d0bd7 (/lib/x86_64-linux-gnu/libc.so.6+0x2dbd7) #7 0x00007f20296d0c82 (/lib/x86_64-linux-gnu/libc.so.6+0x2dc82) #8 0x00007f202acc83a2 (anonymous namespace)::SelectionDAGLegalize::ExpandNode(llvm::SDNode*) (/home/alex/code/rust2/build/x86_64-unknown-linux-gnu/llvm/bin/../lib/libLLVM-7svn.so+0xed93a2) #9 0x00007f202acb5041 (anonymous namespace)::SelectionDAGLegalize::LegalizeOp(llvm::SDNode*) (.part.276) (/home/alex/code/rust2/build/x86_64-unknown-linux-gnu/llvm/bin/../lib/libLLVM-7svn.so+0xec6041) #10 0x00007f202acc8952 llvm::SelectionDAG::Legalize() (/home/alex/code/rust2/build/x86_64-unknown-linux-gnu/llvm/bin/../lib/libLLVM-7svn.so+0xed9952) #11 0x00007f202adee224 llvm::SelectionDAGISel::CodeGenAndEmitDAG() (/home/alex/code/rust2/build/x86_64-unknown-linux-gnu/llvm/bin/../lib/libLLVM-7svn.so+0xfff224) #12 0x00007f202adf3e6a llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (/home/alex/code/rust2/build/x86_64-unknown-linux-gnu/llvm/bin/../lib/libLLVM-7svn.so+0x1004e6a) #13 0x00007f202adf608c llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (.part.875.constprop.898) (/home/alex/code/rust2/build/x86_64-unknown-linux-gnu/llvm/bin/../lib/libLLVM-7svn.so+0x100708c) #14 0x00007f202bdc79d4 (anonymous namespace)::ARMDAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) (/home/alex/code/rust2/build/x86_64-unknown-linux-gnu/llvm/bin/../lib/libLLVM-7svn.so+0x1fd89d4) #15 0x00007f202a9fc375 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (/home/alex/code/rust2/build/x86_64-unknown-linux-gnu/llvm/bin/../lib/libLLVM-7svn.so+0xc0d375) #16 0x00007f202a7f4403 llvm::FPPassManager::runOnFunction(llvm::Function&) (/home/alex/code/rust2/build/x86_64-unknown-linux-gnu/llvm/bin/../lib/libLLVM-7svn.so+0xa05403) #17 0x00007f202a7f44cc llvm::FPPassManager::runOnModule(llvm::Module&) (/home/alex/code/rust2/build/x86_64-unknown-linux-gnu/llvm/bin/../lib/libLLVM-7svn.so+0xa054cc) #18 0x00007f202a7f3f6d llvm::legacy::PassManagerImpl::run(llvm::Module&) (/home/alex/code/rust2/build/x86_64-unknown-linux-gnu/llvm/bin/../lib/libLLVM-7svn.so+0xa04f6d) #19 0x00000000004196a0 compileModule(char**, llvm::LLVMContext&) (.constprop.391) (./build/x86_64-unknown-linux-gnu/llvm/bin/llc+0x4196a0) #20 0x000000000040c266 main (./build/x86_64-unknown-linux-gnu/llvm/bin/llc+0x40c266) #21 0x00007f20296c3830 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x20830) #22 0x000000000040c409 _start (./build/x86_64-unknown-linux-gnu/llvm/bin/llc+0x40c409)
A bisection of this issue turned up r322738 (https://reviews.llvm.org/D40922) as the cause
Looks like `{S,U}MUL_LOHI` are expanded in Thumb1 so a stop-gap approach could be not implementing this optimisation in that subtarget.
I've implemented proposed fix in https://reviews.llvm.org/D48846
Fixed in r336144.