-
Notifications
You must be signed in to change notification settings - Fork 14.9k
[SimplifyCFG] Support trunc nuw in chain of comparisons. #155087
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: Andreas Jonson (andjo403) Changesproof: https://alive2.llvm.org/ce/z/haMf3h Full diff: https://github.com/llvm/llvm-project/pull/155087.diff 2 Files Affected:
diff --git a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
index 48a99543d7083..7666d3d088fc2 100644
--- a/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -612,6 +612,15 @@ struct ConstantComparesGatherer {
/// If CompValue is already set, the function is expected to fail if a match
/// is found but the value compared to is different.
bool matchInstruction(Instruction *I, bool isEQ) {
+ Value *Val;
+ if (!isEQ && match(I, m_NUWTrunc(m_Value(Val)))) {
+ // If we already have a value for the switch, it has to match!
+ if (!setValueOnce(Val))
+ return false;
+ UsedICmps++;
+ Vals.push_back(ConstantInt::get(cast<IntegerType>(Val->getType()), 0));
+ return true;
+ }
// If this is an icmp against a constant, handle this as one of the cases.
ICmpInst *ICI;
ConstantInt *C;
diff --git a/llvm/test/Transforms/SimplifyCFG/switch_create.ll b/llvm/test/Transforms/SimplifyCFG/switch_create.ll
index a06e64f74b3ac..74e9731e0a3e6 100644
--- a/llvm/test/Transforms/SimplifyCFG/switch_create.ll
+++ b/llvm/test/Transforms/SimplifyCFG/switch_create.ll
@@ -1192,3 +1192,54 @@ if.end:
ret void
}
+
+define void @chain_trunc_nuw_i1_condition(i8 %x) {
+; CHECK-LABEL: @chain_trunc_nuw_i1_condition(
+; CHECK-NEXT: switch i8 [[X:%.*]], label [[IF_THEN:%.*]] [
+; CHECK-NEXT: i8 4, label [[COMMON_RET:%.*]]
+; CHECK-NEXT: i8 3, label [[COMMON_RET]]
+; CHECK-NEXT: i8 2, label [[COMMON_RET]]
+; CHECK-NEXT: i8 0, label [[COMMON_RET]]
+; CHECK-NEXT: ]
+; CHECK: common.ret:
+; CHECK-NEXT: ret void
+; CHECK: if.then:
+; CHECK-NEXT: tail call void @foo1()
+; CHECK-NEXT: br label [[COMMON_RET]]
+;
+ %add = add nsw i8 %x, -2
+ %icmp = icmp ugt i8 %add, 2
+ %trunc = trunc nuw i8 %x to i1
+ %or.cond.i = select i1 %icmp, i1 %trunc, i1 false
+ br i1 %or.cond.i, label %if.then, label %if.end
+if.then:
+ tail call void @foo1()
+ ret void
+if.end:
+ ret void
+}
+
+define void @neg_chain_trunc_i1_condition(i8 %x) {
+; CHECK-LABEL: @neg_chain_trunc_i1_condition(
+; CHECK-NEXT: [[ADD:%.*]] = add nsw i8 [[X:%.*]], -2
+; CHECK-NEXT: [[ICMP:%.*]] = icmp ugt i8 [[ADD]], 2
+; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[X]] to i1
+; CHECK-NEXT: [[OR_COND_I:%.*]] = select i1 [[ICMP]], i1 [[TRUNC]], i1 false
+; CHECK-NEXT: br i1 [[OR_COND_I]], label [[IF_THEN:%.*]], label [[COMMON_RET:%.*]]
+; CHECK: common.ret:
+; CHECK-NEXT: ret void
+; CHECK: if.then:
+; CHECK-NEXT: tail call void @foo1()
+; CHECK-NEXT: br label [[COMMON_RET]]
+;
+ %add = add nsw i8 %x, -2
+ %icmp = icmp ugt i8 %add, 2
+ %trunc = trunc i8 %x to i1
+ %or.cond.i = select i1 %icmp, i1 %trunc, i1 false
+ br i1 %or.cond.i, label %if.then, label %if.end
+if.then:
+ tail call void @foo1()
+ ret void
+if.end:
+ ret void
+}
|
99fe8a3
to
654bb71
Compare
@zyw-bot csmith-quick-fuzz |
@zyw-bot csmith-fuzz |
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.
LG
@@ -612,6 +612,15 @@ struct ConstantComparesGatherer { | |||
/// If CompValue is already set, the function is expected to fail if a match | |||
/// is found but the value compared to is different. | |||
bool matchInstruction(Instruction *I, bool isEQ) { | |||
Value *Val; | |||
if (!isEQ && match(I, m_NUWTrunc(m_Value(Val)))) { |
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.
I don't know whether it's useful, for the isEq case we could use 1 instead? trunc nuw is either != 0 or == 1.
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.
Good catch, this was a more common case.
654bb71
to
caf3f62
Compare
also common with not ( icmp ) so will make a separat PR for that when this is merged |
caf3f62
to
c8ec9ed
Compare
ping for update after review, have rebase so ci passes also |
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/88/builds/15592 Here is the relevant piece of the build log for the reference
|
proof: https://alive2.llvm.org/ce/z/5PNCds