Skip to content

Commit e6d6d0a

Browse files
committed
[ValueTracking] Handle non-canonical operand order in isImpliedCondICmps
We don't always have canonical order here, so do it manually.
1 parent d144e08 commit e6d6d0a

File tree

5 files changed

+28
-21
lines changed

5 files changed

+28
-21
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8532,6 +8532,16 @@ static std::optional<bool> isImpliedCondICmps(const ICmpInst *LHS,
85328532
CmpInst::Predicate LPred =
85338533
LHSIsTrue ? LHS->getPredicate() : LHS->getInversePredicate();
85348534

8535+
// We can have non-canonical operands, so try to normalize any common operand
8536+
// to L0/R0.
8537+
if (L0 == R1) {
8538+
std::swap(R0, R1);
8539+
RPred = ICmpInst::getSwappedPredicate(RPred);
8540+
}
8541+
if (R0 == L1) {
8542+
std::swap(L0, L1);
8543+
LPred = ICmpInst::getSwappedPredicate(LPred);
8544+
}
85358545
// Can we infer anything when the 0-operands match and the 1-operands are
85368546
// constants (not necessarily matching)?
85378547
const APInt *LC, *RC;

llvm/test/Transforms/InstCombine/assume.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ define i1 @nonnull5(ptr %a) {
386386
define i32 @assumption_conflicts_with_known_bits(i32 %a, i32 %b) {
387387
; CHECK-LABEL: @assumption_conflicts_with_known_bits(
388388
; CHECK-NEXT: store i1 true, ptr poison, align 1
389-
; CHECK-NEXT: ret i32 1
389+
; CHECK-NEXT: ret i32 poison
390390
;
391391
%and1 = and i32 %b, 3
392392
%B1 = lshr i32 %and1, %and1

llvm/test/Transforms/InstCombine/icmp-select-implies-common-op.ll

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@
33

44
define i1 @sgt_3_impliesF_eq_2(i8 %x, i8 %y) {
55
; CHECK-LABEL: @sgt_3_impliesF_eq_2(
6-
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], 3
7-
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 2, i8 [[Y:%.*]]
8-
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[SEL]], [[X]]
9-
; CHECK-NEXT: ret i1 [[CMP2]]
6+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], 4
7+
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[SEL:%.*]], [[X]]
8+
; CHECK-NEXT: [[CMP3:%.*]] = select i1 [[CMP]], i1 [[CMP2]], i1 false
9+
; CHECK-NEXT: ret i1 [[CMP3]]
1010
;
1111
%cmp = icmp sgt i8 %x, 3
1212
%sel = select i1 %cmp, i8 2, i8 %y
@@ -16,10 +16,10 @@ define i1 @sgt_3_impliesF_eq_2(i8 %x, i8 %y) {
1616

1717
define i1 @sgt_3_impliesT_sgt_2(i8 %x, i8 %y) {
1818
; CHECK-LABEL: @sgt_3_impliesT_sgt_2(
19-
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i8 [[X:%.*]], 3
20-
; CHECK-NEXT: [[SEL:%.*]] = select i1 [[CMP]], i8 2, i8 [[Y:%.*]]
21-
; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i8 [[SEL]], [[X]]
22-
; CHECK-NEXT: ret i1 [[CMP2]]
19+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[X:%.*]], 4
20+
; CHECK-NEXT: [[CMP2:%.*]] = icmp sgt i8 [[SEL:%.*]], [[X]]
21+
; CHECK-NEXT: [[CMP3:%.*]] = select i1 [[CMP]], i1 [[CMP2]], i1 false
22+
; CHECK-NEXT: ret i1 [[CMP3]]
2323
;
2424
%cmp = icmp sgt i8 %x, 3
2525
%sel = select i1 %cmp, i8 2, i8 %y
@@ -68,10 +68,10 @@ define i1 @ult_x_impliesT_eq_umax_todo(i8 %x, i8 %y, i8 %z) {
6868

6969
define i1 @ult_1_impliesF_eq_1(i8 %x, i8 %y) {
7070
; CHECK-LABEL: @ult_1_impliesF_eq_1(
71-
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[SEL:%.*]], 0
72-
; CHECK-NEXT: [[X:%.*]] = select i1 [[CMP]], i8 1, i8 [[Y:%.*]]
73-
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[X]], [[SEL]]
74-
; CHECK-NEXT: ret i1 [[CMP2]]
71+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[SEL:%.*]], 0
72+
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i8 [[X:%.*]], [[SEL]]
73+
; CHECK-NEXT: [[CMP3:%.*]] = select i1 [[CMP]], i1 [[CMP2]], i1 false
74+
; CHECK-NEXT: ret i1 [[CMP3]]
7575
;
7676
%cmp = icmp ult i8 %x, 1
7777
%sel = select i1 %cmp, i8 1, i8 %y

llvm/test/Transforms/InstCombine/select.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2925,10 +2925,8 @@ define i8 @select_replacement_loop3(i32 noundef %x) {
29252925

29262926
define i16 @select_replacement_loop4(i16 noundef %p_12) {
29272927
; CHECK-LABEL: @select_replacement_loop4(
2928-
; CHECK-NEXT: [[CMP1:%.*]] = icmp ult i16 [[P_12:%.*]], 2
2929-
; CHECK-NEXT: [[AND1:%.*]] = and i16 [[P_12]], 1
2930-
; CHECK-NEXT: [[AND2:%.*]] = select i1 [[CMP1]], i16 [[AND1]], i16 0
2931-
; CHECK-NEXT: [[CMP2:%.*]] = icmp eq i16 [[AND2]], [[P_12]]
2928+
; CHECK-NEXT: [[AND1:%.*]] = and i16 [[P_12:%.*]], 1
2929+
; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i16 [[P_12]], 2
29322930
; CHECK-NEXT: [[AND3:%.*]] = select i1 [[CMP2]], i16 [[AND1]], i16 0
29332931
; CHECK-NEXT: ret i16 [[AND3]]
29342932
;

llvm/test/Transforms/InstCombine/shift.ll

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1751,12 +1751,11 @@ define void @ashr_out_of_range_1(ptr %A) {
17511751
; CHECK-NEXT: [[L:%.*]] = load i177, ptr [[A:%.*]], align 4
17521752
; CHECK-NEXT: [[L_FROZEN:%.*]] = freeze i177 [[L]]
17531753
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq i177 [[L_FROZEN]], -1
1754-
; CHECK-NEXT: [[B:%.*]] = select i1 [[TMP1]], i177 0, i177 [[L_FROZEN]]
1755-
; CHECK-NEXT: [[TMP2:%.*]] = trunc i177 [[B]] to i64
1754+
; CHECK-NEXT: [[TMP6:%.*]] = trunc i177 [[L_FROZEN]] to i64
1755+
; CHECK-NEXT: [[TMP2:%.*]] = select i1 [[TMP1]], i64 0, i64 [[TMP6]]
17561756
; CHECK-NEXT: [[TMP3:%.*]] = getelementptr i177, ptr [[A]], i64 [[TMP2]]
17571757
; CHECK-NEXT: [[G11:%.*]] = getelementptr i8, ptr [[TMP3]], i64 -24
1758-
; CHECK-NEXT: [[C17:%.*]] = icmp sgt i177 [[B]], [[L_FROZEN]]
1759-
; CHECK-NEXT: [[TMP4:%.*]] = sext i1 [[C17]] to i64
1758+
; CHECK-NEXT: [[TMP4:%.*]] = sext i1 [[TMP1]] to i64
17601759
; CHECK-NEXT: [[G62:%.*]] = getelementptr i177, ptr [[G11]], i64 [[TMP4]]
17611760
; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i177 [[L_FROZEN]], -1
17621761
; CHECK-NEXT: [[B28:%.*]] = select i1 [[TMP5]], i177 0, i177 [[L_FROZEN]]

0 commit comments

Comments
 (0)