Skip to content

Commit 006aeef

Browse files
author
git apple-llvm automerger
committed
Merge commit 'e719550e6f01' from llvm.org/main into next
2 parents ff5e69e + e719550 commit 006aeef

File tree

2 files changed

+32
-26
lines changed

2 files changed

+32
-26
lines changed

llvm/lib/Transforms/InstCombine/InstCombineSelect.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,20 @@ Instruction *InstCombinerImpl::foldSelectOpOp(SelectInst &SI, Instruction *TI,
378378
}
379379
}
380380
}
381+
382+
// icmp eq/ne with a common operand also can have the common operand
383+
// pulled after the select.
384+
ICmpInst::Predicate TPred, FPred;
385+
if (match(TI, m_ICmp(TPred, m_Value(), m_Value())) &&
386+
match(FI, m_ICmp(FPred, m_Value(), m_Value()))) {
387+
if (TPred == FPred && ICmpInst::isEquality(TPred)) {
388+
if (Value *MatchOp = getCommonOp(TI, FI, true)) {
389+
Value *NewSel = Builder.CreateSelect(Cond, OtherOpT, OtherOpF,
390+
SI.getName() + ".v", &SI);
391+
return new ICmpInst(TPred, NewSel, MatchOp);
392+
}
393+
}
394+
}
381395
}
382396

383397
// Only handle binary operators (including two-operand getelementptr) with

llvm/test/Transforms/InstCombine/select-cmp.ll

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,8 @@ define i1 @f(i1 %cond, i32 %x, i32 %x2) {
1313

1414
define i1 @icmp_ne_common_op00(i1 %c, i6 %x, i6 %y, i6 %z) {
1515
; CHECK-LABEL: @icmp_ne_common_op00(
16-
; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i6 [[X:%.*]], [[Y:%.*]]
17-
; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i6 [[X]], [[Z:%.*]]
18-
; CHECK-NEXT: [[R:%.*]] = select i1 [[C:%.*]], i1 [[CMP1]], i1 [[CMP2]]
16+
; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i6 [[Y:%.*]], i6 [[Z:%.*]]
17+
; CHECK-NEXT: [[R:%.*]] = icmp ne i6 [[R_V]], [[X:%.*]]
1918
; CHECK-NEXT: ret i1 [[R]]
2019
;
2120
%cmp1 = icmp ne i6 %x, %y
@@ -26,9 +25,8 @@ define i1 @icmp_ne_common_op00(i1 %c, i6 %x, i6 %y, i6 %z) {
2625

2726
define i1 @icmp_ne_common_op01(i1 %c, i3 %x, i3 %y, i3 %z) {
2827
; CHECK-LABEL: @icmp_ne_common_op01(
29-
; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i3 [[X:%.*]], [[Y:%.*]]
30-
; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i3 [[Z:%.*]], [[X]]
31-
; CHECK-NEXT: [[R:%.*]] = select i1 [[C:%.*]], i1 [[CMP1]], i1 [[CMP2]]
28+
; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i3 [[Y:%.*]], i3 [[Z:%.*]]
29+
; CHECK-NEXT: [[R:%.*]] = icmp ne i3 [[R_V]], [[X:%.*]]
3230
; CHECK-NEXT: ret i1 [[R]]
3331
;
3432
%cmp1 = icmp ne i3 %x, %y
@@ -39,9 +37,8 @@ define i1 @icmp_ne_common_op01(i1 %c, i3 %x, i3 %y, i3 %z) {
3937

4038
define i1 @icmp_ne_common_op10(i1 %c, i4 %x, i4 %y, i4 %z) {
4139
; CHECK-LABEL: @icmp_ne_common_op10(
42-
; CHECK-NEXT: [[CMP1:%.*]] = icmp ne i4 [[Y:%.*]], [[X:%.*]]
43-
; CHECK-NEXT: [[CMP2:%.*]] = icmp ne i4 [[X]], [[Z:%.*]]
44-
; CHECK-NEXT: [[R:%.*]] = select i1 [[C:%.*]], i1 [[CMP1]], i1 [[CMP2]]
40+
; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i4 [[Y:%.*]], i4 [[Z:%.*]]
41+
; CHECK-NEXT: [[R:%.*]] = icmp ne i4 [[R_V]], [[X:%.*]]
4542
; CHECK-NEXT: ret i1 [[R]]
4643
;
4744
%cmp1 = icmp ne i4 %y, %x
@@ -52,9 +49,8 @@ define i1 @icmp_ne_common_op10(i1 %c, i4 %x, i4 %y, i4 %z) {
5249

5350
define <3 x i1> @icmp_ne_common_op11(<3 x i1> %c, <3 x i17> %x, <3 x i17> %y, <3 x i17> %z) {
5451
; CHECK-LABEL: @icmp_ne_common_op11(
55-
; CHECK-NEXT: [[CMP1:%.*]] = icmp ne <3 x i17> [[Y:%.*]], [[X:%.*]]
56-
; CHECK-NEXT: [[CMP2:%.*]] = icmp ne <3 x i17> [[Z:%.*]], [[X]]
57-
; CHECK-NEXT: [[R:%.*]] = select <3 x i1> [[C:%.*]], <3 x i1> [[CMP1]], <3 x i1> [[CMP2]]
52+
; CHECK-NEXT: [[R_V:%.*]] = select <3 x i1> [[C:%.*]], <3 x i17> [[Y:%.*]], <3 x i17> [[Z:%.*]]
53+
; CHECK-NEXT: [[R:%.*]] = icmp ne <3 x i17> [[R_V]], [[X:%.*]]
5854
; CHECK-NEXT: ret <3 x i1> [[R]]
5955
;
6056
%cmp1 = icmp ne <3 x i17> %y, %x
@@ -65,9 +61,8 @@ define <3 x i1> @icmp_ne_common_op11(<3 x i1> %c, <3 x i17> %x, <3 x i17> %y, <3
6561

6662
define i1 @icmp_eq_common_op00(i1 %c, i5 %x, i5 %y, i5 %z) {
6763
; CHECK-LABEL: @icmp_eq_common_op00(
68-
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i5 [[X:%.*]], [[Y:%.*]]
69-
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i5 [[X]], [[Z:%.*]]
70-
; CHECK-NEXT: [[R:%.*]] = select i1 [[C:%.*]], i1 [[CMP1]], i1 [[CMP2]]
64+
; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i5 [[Y:%.*]], i5 [[Z:%.*]]
65+
; CHECK-NEXT: [[R:%.*]] = icmp eq i5 [[R_V]], [[X:%.*]]
7166
; CHECK-NEXT: ret i1 [[R]]
7267
;
7368
%cmp1 = icmp eq i5 %x, %y
@@ -78,9 +73,8 @@ define i1 @icmp_eq_common_op00(i1 %c, i5 %x, i5 %y, i5 %z) {
7873

7974
define <5 x i1> @icmp_eq_common_op01(<5 x i1> %c, <5 x i7> %x, <5 x i7> %y, <5 x i7> %z) {
8075
; CHECK-LABEL: @icmp_eq_common_op01(
81-
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq <5 x i7> [[X:%.*]], [[Y:%.*]]
82-
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq <5 x i7> [[Z:%.*]], [[X]]
83-
; CHECK-NEXT: [[R:%.*]] = select <5 x i1> [[C:%.*]], <5 x i1> [[CMP1]], <5 x i1> [[CMP2]]
76+
; CHECK-NEXT: [[R_V:%.*]] = select <5 x i1> [[C:%.*]], <5 x i7> [[Y:%.*]], <5 x i7> [[Z:%.*]]
77+
; CHECK-NEXT: [[R:%.*]] = icmp eq <5 x i7> [[R_V]], [[X:%.*]]
8478
; CHECK-NEXT: ret <5 x i1> [[R]]
8579
;
8680
%cmp1 = icmp eq <5 x i7> %x, %y
@@ -91,9 +85,8 @@ define <5 x i1> @icmp_eq_common_op01(<5 x i1> %c, <5 x i7> %x, <5 x i7> %y, <5 x
9185

9286
define i1 @icmp_eq_common_op10(i1 %c, i32 %x, i32 %y, i32 %z) {
9387
; CHECK-LABEL: @icmp_eq_common_op10(
94-
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i32 [[Y:%.*]], [[X:%.*]]
95-
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i32 [[X]], [[Z:%.*]]
96-
; CHECK-NEXT: [[R:%.*]] = select i1 [[C:%.*]], i1 [[CMP1]], i1 [[CMP2]]
88+
; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i32 [[Y:%.*]], i32 [[Z:%.*]]
89+
; CHECK-NEXT: [[R:%.*]] = icmp eq i32 [[R_V]], [[X:%.*]]
9790
; CHECK-NEXT: ret i1 [[R]]
9891
;
9992
%cmp1 = icmp eq i32 %y, %x
@@ -104,9 +97,8 @@ define i1 @icmp_eq_common_op10(i1 %c, i32 %x, i32 %y, i32 %z) {
10497

10598
define i1 @icmp_eq_common_op11(i1 %c, i64 %x, i64 %y, i64 %z) {
10699
; CHECK-LABEL: @icmp_eq_common_op11(
107-
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i64 [[Y:%.*]], [[X:%.*]]
108-
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i64 [[Z:%.*]], [[X]]
109-
; CHECK-NEXT: [[R:%.*]] = select i1 [[C:%.*]], i1 [[CMP1]], i1 [[CMP2]]
100+
; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i64 [[Y:%.*]], i64 [[Z:%.*]]
101+
; CHECK-NEXT: [[R:%.*]] = icmp eq i64 [[R_V]], [[X:%.*]]
110102
; CHECK-NEXT: ret i1 [[R]]
111103
;
112104
%cmp1 = icmp eq i64 %y, %x
@@ -119,8 +111,8 @@ define i1 @icmp_common_one_use_1(i1 %c, i8 %x, i8 %y, i8 %z) {
119111
; CHECK-LABEL: @icmp_common_one_use_1(
120112
; CHECK-NEXT: [[CMP1:%.*]] = icmp eq i8 [[Y:%.*]], [[X:%.*]]
121113
; CHECK-NEXT: call void @use(i1 [[CMP1]])
122-
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[Z:%.*]], [[X]]
123-
; CHECK-NEXT: [[R:%.*]] = select i1 [[C:%.*]], i1 [[CMP1]], i1 [[CMP2]]
114+
; CHECK-NEXT: [[R_V:%.*]] = select i1 [[C:%.*]], i8 [[Y]], i8 [[Z:%.*]]
115+
; CHECK-NEXT: [[R:%.*]] = icmp eq i8 [[R_V]], [[X]]
124116
; CHECK-NEXT: ret i1 [[R]]
125117
;
126118
%cmp1 = icmp eq i8 %y, %x

0 commit comments

Comments
 (0)