https://github.com/llvmbot created https://github.com/llvm/llvm-project/pull/127391
Backport 29f3a352068ce562bcb65e18a676c82a9991583c Requested by: @dtcxzyw >From aa1a0484c95e085b5014e6cae48d2167fc54217d Mon Sep 17 00:00:00 2001 From: Yingwei Zheng <dtcxzyw2...@gmail.com> Date: Sun, 16 Feb 2025 20:18:29 +0800 Subject: [PATCH] [InstCombine] Do not keep samesign when speculatively executing icmps (#127007) Closes https://github.com/llvm/llvm-project/issues/126974. (cherry picked from commit 29f3a352068ce562bcb65e18a676c82a9991583c) --- .../InstCombine/InstCombineCompares.cpp | 5 ++++ llvm/test/Transforms/InstCombine/umax-icmp.ll | 24 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index b64ac20ab0533..810ce7d382ae1 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -5609,6 +5609,11 @@ Instruction *InstCombinerImpl::foldICmpWithMinMax(Instruction &I, return false; return std::nullopt; }; + // Remove samesign here since it is illegal to keep it when we speculatively + // execute comparisons. For example, `icmp samesign ult umax(X, -46), -32` + // cannot be decomposed into `(icmp samesign ult X, -46) or (icmp samesign ult + // -46, -32)`. `X` is allowed to be non-negative here. + Pred = static_cast<CmpInst::Predicate>(Pred); auto CmpXZ = IsCondKnownTrue(simplifyICmpInst(Pred, X, Z, Q)); auto CmpYZ = IsCondKnownTrue(simplifyICmpInst(Pred, Y, Z, Q)); if (!CmpXZ.has_value() && !CmpYZ.has_value()) diff --git a/llvm/test/Transforms/InstCombine/umax-icmp.ll b/llvm/test/Transforms/InstCombine/umax-icmp.ll index b4eea30bfc6af..0c42d26750e4b 100644 --- a/llvm/test/Transforms/InstCombine/umax-icmp.ll +++ b/llvm/test/Transforms/InstCombine/umax-icmp.ll @@ -804,4 +804,28 @@ end: ret void } +define i1 @pr126974(i8 %x) { +; CHECK-LABEL: @pr126974( +; CHECK-NEXT: entry: +; CHECK-NEXT: [[COND:%.*]] = icmp sgt i8 [[X:%.*]], -2 +; CHECK-NEXT: br i1 [[COND]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] +; CHECK: if.then: +; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[X]], -1 +; CHECK-NEXT: ret i1 [[CMP]] +; CHECK: if.else: +; CHECK-NEXT: ret i1 false +; +entry: + %cond = icmp sgt i8 %x, -2 + br i1 %cond, label %if.then, label %if.else + +if.then: + %umax = call i8 @llvm.umax.i8(i8 %x, i8 -46) + %cmp = icmp samesign ult i8 %umax, -32 + ret i1 %cmp + +if.else: + ret i1 false +} + declare i32 @llvm.umax.i32(i32, i32) _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits