https://github.com/el-ev updated https://github.com/llvm/llvm-project/pull/136467
>From 66a876c54233d7bf928b72753485ac2733563b0f Mon Sep 17 00:00:00 2001 From: Iris Shi <0...@owo.li> Date: Sun, 20 Apr 2025 10:32:29 +0800 Subject: [PATCH] "Recommit "[ConstraintElim] Simplify cmp after uadd.sat/usub.sat (#135603)" --- .../Transforms/Scalar/ConstraintElimination.cpp | 16 ++++++++++++++++ .../ConstraintElimination/uadd-usub-sat.ll | 7 ++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp index 8684420b73671..9fd6b067debdf 100644 --- a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp +++ b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp @@ -1139,6 +1139,8 @@ void State::addInfoFor(BasicBlock &BB) { // when simplifying uses of the min/max intrinsics. [[fallthrough]]; case Intrinsic::abs: + case Intrinsic::uadd_sat: + case Intrinsic::usub_sat: if (!isGuaranteedNotToBePoison(&I)) break; WorkList.push_back(FactOrCheck::getInstFact(DT.getNode(&BB), &I)); @@ -1896,6 +1898,20 @@ static bool eliminateConstraints(Function &F, DominatorTree &DT, LoopInfo &LI, AddFact(Pred, MinMax, MinMax->getRHS()); continue; } + if (auto *USatI = dyn_cast<SaturatingInst>(CB.Inst)) { + switch (USatI->getIntrinsicID()) { + default: + llvm_unreachable("Unexpected intrinsic."); + case Intrinsic::uadd_sat: + AddFact(ICmpInst::ICMP_UGE, USatI, USatI->getLHS()); + AddFact(ICmpInst::ICMP_UGE, USatI, USatI->getRHS()); + break; + case Intrinsic::usub_sat: + AddFact(ICmpInst::ICMP_ULE, USatI, USatI->getLHS()); + break; + } + continue; + } } Value *A = nullptr, *B = nullptr; diff --git a/llvm/test/Transforms/ConstraintElimination/uadd-usub-sat.ll b/llvm/test/Transforms/ConstraintElimination/uadd-usub-sat.ll index 42bbe67024e58..c19a0548d78b2 100644 --- a/llvm/test/Transforms/ConstraintElimination/uadd-usub-sat.ll +++ b/llvm/test/Transforms/ConstraintElimination/uadd-usub-sat.ll @@ -8,9 +8,7 @@ define i1 @uadd_sat_uge(i64 noundef %a, i64 noundef %b) { ; CHECK-LABEL: define i1 @uadd_sat_uge( ; CHECK-SAME: i64 noundef [[A:%.*]], i64 noundef [[B:%.*]]) { ; CHECK-NEXT: [[ADD_SAT:%.*]] = call i64 @llvm.uadd.sat.i64(i64 [[A]], i64 [[B]]) -; CHECK-NEXT: [[CMP1:%.*]] = icmp uge i64 [[ADD_SAT]], [[A]] -; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i64 [[ADD_SAT]], [[B]] -; CHECK-NEXT: [[CMP:%.*]] = and i1 [[CMP1]], [[CMP2]] +; CHECK-NEXT: [[CMP:%.*]] = and i1 true, true ; CHECK-NEXT: ret i1 [[CMP]] ; %add.sat = call i64 @llvm.uadd.sat.i64(i64 %a, i64 %b) @@ -24,8 +22,7 @@ define i1 @usub_sat_ule_lhs(i64 noundef %a, i64 noundef %b) { ; CHECK-LABEL: define i1 @usub_sat_ule_lhs( ; CHECK-SAME: i64 noundef [[A:%.*]], i64 noundef [[B:%.*]]) { ; CHECK-NEXT: [[SUB_SAT:%.*]] = call i64 @llvm.usub.sat.i64(i64 [[A]], i64 [[B]]) -; CHECK-NEXT: [[CMP:%.*]] = icmp ule i64 [[SUB_SAT]], [[A]] -; CHECK-NEXT: ret i1 [[CMP]] +; CHECK-NEXT: ret i1 true ; %sub.sat = call i64 @llvm.usub.sat.i64(i64 %a, i64 %b) %cmp = icmp ule i64 %sub.sat, %a _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits