[llvm] [DAGCombine] Transform `shl X, cttz(Y)` to `mul (Y & -Y), X` if cttz is unsupported (PR #85066)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Fri May 31 09:13:28 PDT 2024


dtcxzyw wrote:

> This patch causes a crash when building the Linux kernel for PowerPC.
> 
> A reduced C reproducer from `cvise`:
> 
> ```c
> struct {
>   short active_links;
> } *iwl_mvm_exit_esr_vif;
> short iwl_mvm_exit_esr_new_active_links;
> void iwl_mvm_exit_esr(int link_to_keep) {
>   int __trans_tmp_10;
>   if (({
>         int __ret_warn_on =
>             iwl_mvm_exit_esr_vif->active_links & 1UL << link_to_keep;
>         __asm__("");
>         __builtin_expect(__ret_warn_on, 0);
>       })) {
>     long word = iwl_mvm_exit_esr_vif->active_links;
>     __trans_tmp_10 = __builtin_ctzl(word);
>     link_to_keep = __trans_tmp_10;
>   }
>   iwl_mvm_exit_esr_new_active_links = 1UL << link_to_keep;
> }
> ```
> 
>  ```
> $ clang --target=powerpc64le-linux-gnu -O2 -c -o /dev/null link.i
> clang: /home/nathan/tmp/cvise.5XHgoAhXPL/src/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:6878: SDValue llvm::SelectionDAG::getNode(unsigned int, const SDLoc &, EVT, SDValue, SDValue, const SDNodeFlags): Assertion `N1.getValueType() == N2.getValueType() && N1.getValueType() == VT && "Binary operator types must match!"' failed.
> 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: clang --target=powerpc64le-linux-gnu -O2 -c -o /dev/null link.i
> 1.      <eof> parser at end of file
> 2.      Code generation
> 3.      Running pass 'Function Pass Manager' on module 'link.i'.
> 4.      Running pass 'PowerPC DAG->DAG Pattern Instruction Selection' on function '@iwl_mvm_exit_esr'
>  #0 0x00000000049d6f1c llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x49d6f1c)
>  #1 0x00000000049d4e64 llvm::sys::RunSignalHandlers() (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x49d4e64)
>  #2 0x000000000495fc50 CrashRecoverySignalHandler(int) CrashRecoveryContext.cpp:0:0
>  #3 0x0000ffffa59ea810 (linux-vdso.so.1+0x810)
>  #4 0x0000ffffa52b85e0 __pthread_kill_implementation (/lib64/libc.so.6+0x985e0)
>  #5 0x0000ffffa52659c0 gsignal (/lib64/libc.so.6+0x459c0)
>  #6 0x0000ffffa5250288 abort (/lib64/libc.so.6+0x30288)
>  #7 0x0000ffffa525e3c0 __assert_fail_base (/lib64/libc.so.6+0x3e3c0)
>  #8 0x0000ffffa525e434 (/lib64/libc.so.6+0x3e434)
>  #9 0x0000000005a020c0 llvm::SelectionDAG::getNode(unsigned int, llvm::SDLoc const&, llvm::EVT, llvm::SDValue, llvm::SDValue, llvm::SDNodeFlags) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x5a020c0)
> #10 0x00000000059e2980 llvm::SelectionDAG::getNegative(llvm::SDValue, llvm::SDLoc const&, llvm::EVT) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x59e2980)
> #11 0x00000000058da048 (anonymous namespace)::DAGCombiner::visitSHL(llvm::SDNode*) DAGCombiner.cpp:0:0
> #12 0x00000000058cbf14 (anonymous namespace)::DAGCombiner::combine(llvm::SDNode*) DAGCombiner.cpp:0:0
> #13 0x00000000058c92c8 llvm::SelectionDAG::Combine(llvm::CombineLevel, llvm::AAResults*, llvm::CodeGenOptLevel) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x58c92c8)
> #14 0x0000000005a3761c llvm::SelectionDAGISel::CodeGenAndEmitDAG() (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x5a3761c)
> #15 0x0000000005a35d1c llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x5a35d1c)
> #16 0x0000000005a32cb0 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x5a32cb0)
> #17 0x00000000035e4b74 (anonymous namespace)::PPCDAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) PPCISelDAGToDAG.cpp:0:0
> #18 0x0000000003febc68 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x3febc68)
> #19 0x0000000004527398 llvm::FPPassManager::runOnFunction(llvm::Function&) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x4527398)
> #20 0x000000000452ee20 llvm::FPPassManager::runOnModule(llvm::Module&) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x452ee20)
> #21 0x0000000004527cb8 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x4527cb8)
> #22 0x0000000005123024 clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::HeaderSearchOptions const&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>, clang::BackendConsumer*) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x5123024)
> #23 0x0000000005143aec clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x5143aec)
> #24 0x00000000062f18cc clang::ParseAST(clang::Sema&, bool, bool) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x62f18cc)
> #25 0x00000000054db43c clang::FrontendAction::Execute() (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x54db43c)
> #26 0x0000000005462164 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x5462164)
> #27 0x00000000055a62a8 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x55a62a8)
> #28 0x0000000002d186d0 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x2d186d0)
> #29 0x0000000002d15528 ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&) driver.cpp:0:0
> #30 0x00000000053081b4 void llvm::function_ref<void ()>::callback_fn<clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const::$_0>(long) Job.cpp:0:0
> #31 0x000000000495f9b8 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x495f9b8)
> #32 0x0000000005307964 clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x5307964)
> #33 0x00000000052cf6a8 clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x52cf6a8)
> #34 0x00000000052cf8f4 clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x52cf8f4)
> #35 0x00000000052e86b4 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x52e86b4)
> #36 0x0000000002d148a0 clang_main(int, char**, llvm::ToolContext const&) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x2d148a0)
> #37 0x0000000002d229d8 main (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x2d229d8)
> #38 0x0000ffffa5250b1c __libc_start_call_main (/lib64/libc.so.6+0x30b1c)
> #39 0x0000ffffa5250bfc __libc_start_main at GLIBC_2.17 (/lib64/libc.so.6+0x30bfc)
> #40 0x0000000002d130f0 _start (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/clang-19+0x2d130f0)
> clang: error: clang frontend command failed with exit code 134 (use -v to see invocation)
>> ```
> 
> A reduced LLVM IR reproducer from `llvm-reduce`:
> 
> ```llvm
> target datalayout = "e-m:e-Fn32-i64:64-n32:64-S128-v256:256:256-v512:512:512"
> target triple = "powerpc64le-unknown-linux-gnu"
> 
> define void @iwl_mvm_exit_esr(i16 %0) {
> entry:
>   %1 = tail call i16 @llvm.cttz.i16(i16 %0, i1 false)
>   %2 = zext i16 %1 to i64
>   %.pre9 = shl i64 1, %2
>   %conv7 = trunc i64 %.pre9 to i16
>   store i16 %conv7, ptr null, align 2
>   ret void
> }
> 
> ; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
> declare i16 @llvm.cttz.i16(i16, i1 immarg) #0
> 
> attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
> ```
> 
>  ```
> $ llc -o /dev/null reduced.ll 
> llc: /home/nathan/tmp/cvise.5XHgoAhXPL/src/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:6878: SDValue llvm::SelectionDAG::getNode(unsigned int, const SDLoc &, EVT, SDValue, SDValue, const SDNodeFlags): Assertion `N1.getValueType() == N2.getValueType() && N1.getValueType() == VT && "Binary operator types must match!"' failed.
> PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
> Stack dump:
> 0.      Program arguments: llc -o /dev/null reduced.ll
> 1.      Running pass 'Function Pass Manager' on module 'reduced.ll'.
> 2.      Running pass 'PowerPC DAG->DAG Pattern Instruction Selection' on function '@iwl_mvm_exit_esr'
>  #0 0x00000000048c153c llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/llc+0x48c153c)
>  #1 0x00000000048bf3e4 llvm::sys::RunSignalHandlers() (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/llc+0x48bf3e4)
>  #2 0x00000000048c1c58 SignalHandler(int) Signals.cpp:0:0
>  #3 0x0000ffff81a05810 (linux-vdso.so.1+0x810)
>  #4 0x0000ffff812b85e0 __pthread_kill_implementation (/lib64/libc.so.6+0x985e0)
>  #5 0x0000ffff812659c0 gsignal (/lib64/libc.so.6+0x459c0)
>  #6 0x0000ffff81250288 abort (/lib64/libc.so.6+0x30288)
>  #7 0x0000ffff8125e3c0 __assert_fail_base (/lib64/libc.so.6+0x3e3c0)
>  #8 0x0000ffff8125e434 (/lib64/libc.so.6+0x3e434)
>  #9 0x00000000046cb000 llvm::SelectionDAG::getNode(unsigned int, llvm::SDLoc const&, llvm::EVT, llvm::SDValue, llvm::SDValue, llvm::SDNodeFlags) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/llc+0x46cb000)
> #10 0x00000000046ab460 llvm::SelectionDAG::getNegative(llvm::SDValue, llvm::SDLoc const&, llvm::EVT) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/llc+0x46ab460)
> #11 0x0000000004571a8c (anonymous namespace)::DAGCombiner::visitSHL(llvm::SDNode*) DAGCombiner.cpp:0:0
> #12 0x0000000004563958 (anonymous namespace)::DAGCombiner::combine(llvm::SDNode*) DAGCombiner.cpp:0:0
> #13 0x0000000004560d0c llvm::SelectionDAG::Combine(llvm::CombineLevel, llvm::AAResults*, llvm::CodeGenOptLevel) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/llc+0x4560d0c)
> #14 0x0000000004702a64 llvm::SelectionDAGISel::CodeGenAndEmitDAG() (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/llc+0x4702a64)
> #15 0x0000000004701164 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/llc+0x4701164)
> #16 0x00000000046fe0f8 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/llc+0x46fe0f8)
> #17 0x0000000002ebf9d8 (anonymous namespace)::PPCDAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) PPCISelDAGToDAG.cpp:0:0
> #18 0x0000000003a85f44 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/llc+0x3a85f44)
> #19 0x0000000003f9cc50 llvm::FPPassManager::runOnFunction(llvm::Function&) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/llc+0x3f9cc50)
> #20 0x0000000003fa4794 llvm::FPPassManager::runOnModule(llvm::Module&) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/llc+0x3fa4794)
> #21 0x0000000003f9d600 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/llc+0x3f9d600)
> #22 0x0000000002665bb8 main (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/llc+0x2665bb8)
> #23 0x0000ffff81250b1c __libc_start_call_main (/lib64/libc.so.6+0x30b1c)
> #24 0x0000ffff81250bfc __libc_start_main at GLIBC_2.17 (/lib64/libc.so.6+0x30bfc)
> #25 0x00000000026602b0 _start (/home/nathan/tmp/cvise.5XHgoAhXPL/install/llvm-bad/bin/llc+0x26602b0)
> ```

I will have a look.

https://github.com/llvm/llvm-project/pull/85066


More information about the llvm-commits mailing list