[llvm] [ConstraintElim] Simplify `sadd_with_overflow` if A and B have different signs (PR #135784)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 15 07:37:16 PDT 2025
================
@@ -1675,6 +1676,38 @@ void ConstraintInfo::addFactImpl(CmpInst::Predicate Pred, Value *A, Value *B,
}
}
+static bool replaceAddOverflowUses(IntrinsicInst *II, Value *A, Value *B,
+ SmallVectorImpl<Instruction *> &ToRemove) {
+ bool Changed = false;
+ IRBuilder<> Builder(II->getParent(), II->getIterator());
+ Value *Add = nullptr;
+ for (User *U : make_early_inc_range(II->users())) {
+ if (match(U, m_ExtractValue<0>(m_Value()))) {
+ if (!Add)
+ Add = Builder.CreateAdd(A, B);
+ U->replaceAllUsesWith(Add);
+ Changed = true;
+ } else if (match(U, m_ExtractValue<1>(m_Value()))) {
+ U->replaceAllUsesWith(Builder.getFalse());
+ Changed = true;
+ } else
+ continue;
+
+ if (U->use_empty()) {
----------------
dtcxzyw wrote:
```
; bin/opt -passes=constraint-elimination reduced.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 fastcc i32 @io_recvmsg_copy_hdr() {
%1 = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 0, i32 0)
ret i32 0
}
; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare { i32, i1 } @llvm.sadd.with.overflow.i32(i32, i32) #0
attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
```
```
opt: /home/dtcxzyw/WorkSpace/Projects/compilers/llvm-project/llvm/include/llvm/Support/Casting.h:578: decltype(auto) llvm::cast(From*) [with To = IntegerType; From = Type]: Assertion `isa<To>(Val) && "cast<Ty>() argument of incompatible type!"' 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=constraint-elimination reduced.ll -S
1. Running pass "function(constraint-elimination)" on module "reduced.ll"
2. Running pass "constraint-elimination" on function "io_recvmsg_copy_hdr"
#0 0x0000703857a24712 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/libLLVMSupport.so.21.0git+0x224712)
#1 0x0000703857a215ef llvm::sys::RunSignalHandlers() (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/libLLVMSupport.so.21.0git+0x2215ef)
#2 0x0000703857a21734 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
#3 0x0000703857445330 (/lib/x86_64-linux-gnu/libc.so.6+0x45330)
#4 0x000070385749eb2c __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
#5 0x000070385749eb2c __pthread_kill_internal ./nptl/pthread_kill.c:78:10
#6 0x000070385749eb2c pthread_kill ./nptl/pthread_kill.c:89:10
#7 0x000070385744527e raise ./signal/../sysdeps/posix/raise.c:27:6
#8 0x00007038574288ff abort ./stdlib/abort.c:81:7
#9 0x000070385742881b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#10 0x000070385743b517 (/lib/x86_64-linux-gnu/libc.so.6+0x3b517)
#11 0x000070384e379ded llvm::ConstantInt::get(llvm::Type*, unsigned long, bool) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMCore.so.21.0git+0x179ded)
#12 0x000070384fed88ca eliminateConstraints(llvm::Function&, llvm::DominatorTree&, llvm::LoopInfo&, llvm::ScalarEvolution&, llvm::OptimizationRemarkEmitter&) ConstraintElimination.cpp:0:0
#13 0x000070384fed95f3 llvm::ConstraintEliminationPass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMScalarOpts.so.21.0git+0xd95f3)
#14 0x00007038516e8855 llvm::detail::PassModel<llvm::Function, llvm::ConstraintEliminationPass, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMPasses.so.21.0git+0xe8855)
#15 0x000070384e523b64 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.21.0git+0x323b64)
#16 0x00007038564d7865 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.21.0git+0xd7865)
#17 0x000070384e522440 llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/../lib/libLLVMCore.so.21.0git+0x322440)
#18 0x00007038564d8225 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/../lib/libLLVMX86CodeGen.so.21.0git+0xd8225)
#19 0x000070384e522a35 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.21.0git+0x322a35)
#20 0x0000703857bf7329 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) (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/libLLVMOptDriver.so.21.0git+0x2c329)
#21 0x0000703857c02366 optMain (/home/dtcxzyw/WorkSpace/Projects/compilers/LLVM/llvm-build/bin/../lib/libLLVMOptDriver.so.21.0git+0x37366)
#22 0x000070385742a1ca __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:74:3
#23 0x000070385742a28b call_init ./csu/../csu/libc-start.c:128:20
#24 0x000070385742a28b __libc_start_main ./csu/../csu/libc-start.c:347:5
#25 0x00005b737a52c095 _start (bin/opt+0x1095)
```
https://github.com/llvm/llvm-project/pull/135784
More information about the llvm-commits
mailing list