[llvm] [SelectionDAG] Make `(a & x) | (~a & y) -> (a & (x ^ y)) ^ y` available for all targets (PR #137641)
Nathan Chancellor via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 10 18:55:50 PDT 2025
nathanchance wrote:
I am seeing a crash when building the Linux kernel for x86_64 after this change. `llvm-reduce` spits out:
```llvm
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux"
define i32 @try_qad_pin({ i8, i32 } %0) {
entry:
%asmresult1.i = extractvalue { i8, i32 } %0, 1
%not = xor i32 %asmresult1.i, 1
%and = and i32 1, %not
%and1 = and i32 %asmresult1.i, 200
%1 = or i32 %and, %and1
ret i32 %1
}
```
from the following reduced C reproducer:
```c
enum { false, true };
int arch_atomic_try_cmpxchg_v_0, try_qad_pin_flags, try_qad_pin_bound;
_Bool atomic_try_cmpxchg___trans_tmp_4, atomic_try_cmpxchg_success;
_Bool atomic_try_cmpxchg(int *old) {
int *__trans_tmp_8 = old, *__trans_tmp_5 = __trans_tmp_8;
atomic_try_cmpxchg___trans_tmp_4 = ({
__typeof__(&arch_atomic_try_cmpxchg_v_0) _old = __trans_tmp_5;
__typeof__(arch_atomic_try_cmpxchg_v_0) __old = *_old;
asm(".pushsection .smp_locks,\"a\"\n"
".popsection\n"
: "=@cc"
"z"(atomic_try_cmpxchg_success),
"+a"(__old));
if (__builtin_expect(!atomic_try_cmpxchg_success, 0))
*_old = __old;
__builtin_expect(atomic_try_cmpxchg_success, 1);
});
return atomic_try_cmpxchg___trans_tmp_4;
}
_Bool try_qad_pin() {
do {
if (__builtin_expect(try_qad_pin_flags & ~try_qad_pin_bound, 0))
return false;
if (__builtin_expect(try_qad_pin_bound & 200, 0))
return false;
} while (!atomic_try_cmpxchg(&try_qad_pin_bound));
return true;
}
```
```
$ llc -o /dev/null reduced.ll
llc: .../src/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:7364: 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 'X86 DAG->DAG Instruction Selection' on function '@try_qad_pin'
#0 0x00000000050ae5cc llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (.../install/llvm-bfb48363b0c9a2978be9ec2b31dcb32910e0f274/bin/llc+0x50ae5cc)
#1 0x00000000050ac39c llvm::sys::RunSignalHandlers() (.../install/llvm-bfb48363b0c9a2978be9ec2b31dcb32910e0f274/bin/llc+0x50ac39c)
#2 0x00000000050aed04 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
#3 0x0000ffffb8b5f868 (linux-vdso.so.1+0x868)
#4 0x0000ffffb856f71c __pthread_kill_implementation (/lib64/libc.so.6+0x8f71c)
#5 0x0000ffffb851b63c gsignal (/lib64/libc.so.6+0x3b63c)
#6 0x0000ffffb8505b88 abort (/lib64/libc.so.6+0x25b88)
#7 0x0000ffffb85140a0 __assert_fail_base (/lib64/libc.so.6+0x340a0)
#8 0x0000000004e93f94 llvm::SelectionDAG::getNode(unsigned int, llvm::SDLoc const&, llvm::EVT, llvm::SDValue, llvm::SDValue, llvm::SDNodeFlags) (.../install/llvm-bfb48363b0c9a2978be9ec2b31dcb32910e0f274/bin/llc+0x4e93f94)
#9 0x0000000004e6e480 llvm::SelectionDAG::getNode(unsigned int, llvm::SDLoc const&, llvm::EVT, llvm::SDValue, llvm::SDValue) (.../install/llvm-bfb48363b0c9a2978be9ec2b31dcb32910e0f274/bin/llc+0x4e6e480)
#10 0x0000000004d7efac foldMaskedMergeImpl(llvm::SDValue, llvm::SDValue, llvm::SDValue, llvm::SDValue, llvm::SDLoc const&, llvm::SelectionDAG&) DAGCombiner.cpp:0:0
#11 0x0000000004d7db80 foldMaskedMerge(llvm::SDNode*, llvm::SelectionDAG&, llvm::TargetLowering const&, llvm::SDLoc const&) DAGCombiner.cpp:0:0
#12 0x0000000004d22480 (anonymous namespace)::DAGCombiner::visitOR(llvm::SDNode*) DAGCombiner.cpp:0:0
#13 0x0000000004d14aac (anonymous namespace)::DAGCombiner::combine(llvm::SDNode*) DAGCombiner.cpp:0:0
#14 0x0000000004d12954 llvm::SelectionDAG::Combine(llvm::CombineLevel, llvm::BatchAAResults*, llvm::CodeGenOptLevel) (.../install/llvm-bfb48363b0c9a2978be9ec2b31dcb32910e0f274/bin/llc+0x4d12954)
#15 0x0000000004ece25c llvm::SelectionDAGISel::CodeGenAndEmitDAG() (.../install/llvm-bfb48363b0c9a2978be9ec2b31dcb32910e0f274/bin/llc+0x4ece25c)
#16 0x0000000004ecd544 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (.../install/llvm-bfb48363b0c9a2978be9ec2b31dcb32910e0f274/bin/llc+0x4ecd544)
#17 0x0000000004eca76c llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) (.../install/llvm-bfb48363b0c9a2978be9ec2b31dcb32910e0f274/bin/llc+0x4eca76c)
#18 0x0000000004ec81b4 llvm::SelectionDAGISelLegacy::runOnMachineFunction(llvm::MachineFunction&) (.../install/llvm-bfb48363b0c9a2978be9ec2b31dcb32910e0f274/bin/llc+0x4ec81b4)
#19 0x00000000041d0cf4 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (.../install/llvm-bfb48363b0c9a2978be9ec2b31dcb32910e0f274/bin/llc+0x41d0cf4)
#20 0x00000000047109a4 llvm::FPPassManager::runOnFunction(llvm::Function&) (.../install/llvm-bfb48363b0c9a2978be9ec2b31dcb32910e0f274/bin/llc+0x47109a4)
#21 0x00000000047183ac llvm::FPPassManager::runOnModule(llvm::Module&) (.../install/llvm-bfb48363b0c9a2978be9ec2b31dcb32910e0f274/bin/llc+0x47183ac)
#22 0x000000000471132c llvm::legacy::PassManagerImpl::run(llvm::Module&) (.../install/llvm-bfb48363b0c9a2978be9ec2b31dcb32910e0f274/bin/llc+0x471132c)
#23 0x0000000002c160e8 compileModule(char**, llvm::LLVMContext&) llc.cpp:0:0
#24 0x0000000002c13f18 main (.../install/llvm-bfb48363b0c9a2978be9ec2b31dcb32910e0f274/bin/llc+0x2c13f18)
#25 0x0000ffffb850639c __libc_start_call_main (/lib64/libc.so.6+0x2639c)
#26 0x0000ffffb850647c __libc_start_main at GLIBC_2.17 (/lib64/libc.so.6+0x2647c)
#27 0x0000000002c10030 _start (.../install/llvm-bfb48363b0c9a2978be9ec2b31dcb32910e0f274/bin/llc+0x2c10030)
```
https://github.com/llvm/llvm-project/pull/137641
More information about the llvm-commits
mailing list