-
Notifications
You must be signed in to change notification settings - Fork 15.3k
[InstCombine] Do not keep samesign when speculatively executing icmps #127007
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
@llvm/pr-subscribers-llvm-transforms Author: Yingwei Zheng (dtcxzyw) ChangesCloses #126974. Full diff: https://github.com/llvm/llvm-project/pull/127007.diff 2 Files Affected:
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
index 0feb6160b68fb..00a8117f32e70 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -5636,6 +5636,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)
|
| // 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); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
samesign flag is still needed before this line. We can avoid isKnownNonNegative queries if samesign is set.
|
As an alternative, we can pass |
artagnon
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you confirm that the bug is in the following line?
bool IsSame = MinMax->getPredicate() == ICmpInst::getStrictPredicate(Pred);
Sounds like we need to use getMatching() here to resolve the bug? Sorry, I'm a bit confused by your fix.
Is the underlying issue |
Yeah. If |
Very sorry about this, but I'm still having trouble understanding which exact Also, could you kindly add tests for exhaustive signed-unsiged-samesign combinations? |
No. We simplify
I mean we should drop samesign at the beginning of |
I prefer the method in this patch. It is still legal to use poison-generating flags in inner expressions.
Both |
nikic
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
|
/cherry-pick 29f3a35 |
|
/pull-request #127391 |
…llvm#127007) Closes llvm#126974. (cherry picked from commit 29f3a35)
Closes #126974.