[llvm] [DAGCombine] Transform `shl X, cttz(Y)` to `mul (Y & -Y), X` if cttz is unsupported (PR #85066)
Nathan Chancellor via llvm-commits
llvm-commits at lists.llvm.org
Fri May 31 09:00:01 PDT 2024
nathanchance 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)
```
https://github.com/llvm/llvm-project/pull/85066
More information about the llvm-commits
mailing list