[llvm] [InstCombine] Canonicalize complex boolean expressions into ~((y | z) ^ x) via 3-input truth table (PR #149530)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 22 10:11:57 PDT 2025


https://github.com/dtcxzyw commented:

Crash reproducer:
```
; bin/opt -passes=instcombine test.ll -S
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-gnu"

define void @main(<4 x i1> %broadcast.splatinsert, <4 x i1> %broadcast.splat, <4 x i1> %0, ptr %p) {
entry:
  %1 = xor <4 x i1> %broadcast.splatinsert, %0
  %2 = xor <4 x i1> %broadcast.splat, %broadcast.splatinsert
  %3 = zext <4 x i1> %1 to <4 x i32>
  %4 = zext <4 x i1> %2 to <4 x i32>
  %bin.rdx = or <4 x i32> %4, %3
  %5 = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %bin.rdx)
  br label %for.cond5.preheader.i.i

for.cond5.preheader.i.i:                          ; preds = %entry
  store i32 %5, ptr %p, align 4
  ret void
}
```
```
opt: /home/dtcxzyw/WorkSpace/Projects/compilers/llvm-project/llvm/lib/IR/Instruction.cpp:345: bool llvm::Instruction::comesBefore(const llvm::Instruction*) const: Assertion `getParent() == Other->getParent() && "cross-BB instruction order comparison"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: bin/opt -passes=instcombine reduced.ll -S
1.      Running pass "function(instcombine<max-iterations=1;verify-fixpoint>)" on module "reduced.ll"
2.      Running pass "instcombine<max-iterations=1;verify-fixpoint>" on function "main"
 #0 0x00007da9aae2eb62 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/libLLVMSupport.so.22.0git+0x22eb62)
 #1 0x00007da9aae2b12f llvm::sys::RunSignalHandlers() (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/libLLVMSupport.so.22.0git+0x22b12f)
 #2 0x00007da9aae2b27c SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
 #3 0x00007da9aa845330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330)
 #4 0x00007da9aa89eb2c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #5 0x00007da9aa89eb2c __pthread_kill_internal ./nptl/pthread_kill.c:78:10
 #6 0x00007da9aa89eb2c pthread_kill ./nptl/pthread_kill.c:89:10
 #7 0x00007da9aa84527e raise ./signal/../sysdeps/posix/raise.c:27:6
 #8 0x00007da9aa8288ff abort ./stdlib/abort.c:81:7
 #9 0x00007da9aa82881b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#10 0x00007da9aa83b517 (/lib/x86_64-linux-gnu/libc.so.6+0x3b517)
#11 0x00007da9a147ea93 (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMCore.so.22.0git+0x27ea93)
#12 0x00007da9a268a638 void std::__insertion_sort<llvm::Instruction**, __gnu_cxx::__ops::_Iter_comp_iter<extractThreeVariablesAndInstructions(llvm::Value*, llvm::SmallVectorImpl<llvm::Instruction*>&)::'lambda0'(llvm::Instruction*, llvm::Instruction*)>>(llvm::Instruction**, llvm::Instruction**, __gnu_cxx::__ops::_Iter_comp_iter<extractThreeVariablesAndInstructions(llvm::Value*, llvm::SmallVectorImpl<llvm::Instruction*>&)::'lambda0'(llvm::Instruction*, llvm::Instruction*)>) (.constprop.0) InstCombineAndOrXor.cpp:0:0
#13 0x00007da9a26ab5a7 foldThreeVarBoolExpr(llvm::Instruction&, llvm::IRBuilder<llvm::TargetFolder, llvm::IRBuilderCallbackInserter>&) InstCombineAndOrXor.cpp:0:0
#14 0x00007da9a26af3c7 llvm::InstCombinerImpl::visitOr(llvm::BinaryOperator&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMInstCombine.so.22.0git+0xaf3c7)
#15 0x00007da9a2668398 llvm::InstCombinerImpl::run() (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMInstCombine.so.22.0git+0x68398)
#16 0x00007da9a2669521 combineInstructionsOverFunction(llvm::Function&, llvm::InstructionWorklist&, llvm::AAResults*, llvm::AssumptionCache&, llvm::TargetLibraryInfo&, llvm::TargetTransformInfo&, llvm::DominatorTree&, llvm::OptimizationRemarkEmitter&, llvm::BlockFrequencyInfo*, llvm::BranchProbabilityInfo*, llvm::ProfileSummaryInfo*, llvm::InstCombineOptions const&) InstructionCombining.cpp:0:0
#17 0x00007da9a266a564 llvm::InstCombinePass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMInstCombine.so.22.0git+0x6a564)
#18 0x00007da9a4daa0e5 llvm::detail::PassModel<llvm::Function, llvm::InstCombinePass, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libPolly.so.22.0git+0x1aa0e5)
#19 0x00007da9a1522069 llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMCore.so.22.0git+0x322069)
#20 0x00007da9a98dd6c5 llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMX86CodeGen.so.22.0git+0xdd6c5)
#21 0x00007da9a1522582 llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMCore.so.22.0git+0x322582)
#22 0x00007da9ab091585 llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/libLLVMOptDriver.so.22.0git+0x20585)
#23 0x00007da9a15238ad llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMCore.so.22.0git+0x3238ad)
#24 0x00007da9ab09e86e llvm::runPassPipeline(llvm::StringRef, llvm::Module&, llvm::TargetMachine*, llvm::TargetLibraryInfoImpl*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::StringRef, llvm::ArrayRef<llvm::PassPlugin>, llvm::ArrayRef<std::function<void (llvm::PassBuilder&)>>, llvm::opt_tool::OutputKind, llvm::opt_tool::VerifierKind, bool, bool, bool, bool, bool, bool, bool, bool) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/libLLVMOptDriver.so.22.0git+0x2d86e)
#25 0x00007da9ab0a9a6a optMain (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/libLLVMOptDriver.so.22.0git+0x38a6a)
#26 0x00007da9aa82a1ca __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#27 0x00007da9aa82a28b call_init ./csu/../csu/libc-start.c:128:20
#28 0x00007da9aa82a28b __libc_start_main ./csu/../csu/libc-start.c:347:5
#29 0x0000605378783095 _start (bin/opt+0x1095)

Aborted (core dumped)
```


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


More information about the llvm-commits mailing list