llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-llvm-transforms Author: None (llvmbot) <details> <summary>Changes</summary> Backport 29f3a352068ce562bcb65e18a676c82a9991583c Requested by: @<!-- -->dtcxzyw --- Full diff: https://github.com/llvm/llvm-project/pull/127391.diff 2 Files Affected: - (modified) llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp (+5) - (modified) llvm/test/Transforms/InstCombine/umax-icmp.ll (+24) ``````````diff 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) `````````` </details> https://github.com/llvm/llvm-project/pull/127391 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits