Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions llvm/lib/Analysis/ValueTracking.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9494,7 +9494,7 @@ isImpliedCondICmps(const ICmpInst *LHS, CmpPredicate RPred, const Value *R0,
SignedLPred == ICmpInst::ICMP_SGE) &&
match(R0, m_NSWSub(m_Specific(L0), m_Specific(L1)))) {
if (match(R1, m_NonPositive()) &&
ICmpInst::isImpliedByMatchingCmp(LPred, RPred) == false)
ICmpInst::isImpliedByMatchingCmp(SignedLPred, RPred) == false)
return false;
}

Expand All @@ -9504,7 +9504,7 @@ isImpliedCondICmps(const ICmpInst *LHS, CmpPredicate RPred, const Value *R0,
SignedLPred == ICmpInst::ICMP_SLE) &&
match(R0, m_NSWSub(m_Specific(L0), m_Specific(L1)))) {
if (match(R1, m_NonNegative()) &&
ICmpInst::isImpliedByMatchingCmp(LPred, RPred) == true)
ICmpInst::isImpliedByMatchingCmp(SignedLPred, RPred) == true)
return true;
}

Expand Down
48 changes: 48 additions & 0 deletions llvm/test/Analysis/ValueTracking/implied-condition-samesign.ll
Original file line number Diff line number Diff line change
Expand Up @@ -292,3 +292,51 @@ taken:
end:
ret i32 0
}

define i1 @gt_sub_nsw_ult(i8 %L0, i8 %L1, i1 %V) {
; CHECK-LABEL: define i1 @gt_sub_nsw_ult(
; CHECK-SAME: i8 [[L0:%.*]], i8 [[L1:%.*]], i1 [[V:%.*]]) {
; CHECK-NEXT: [[LHS:%.*]] = icmp samesign ugt i8 [[L0]], [[L1]]
; CHECK-NEXT: br i1 [[LHS]], label %[[LHS_TRUE:.*]], label %[[LHS_FALSE:.*]]
; CHECK: [[LHS_TRUE]]:
; CHECK-NEXT: [[R0:%.*]] = sub nsw i8 [[L0]], [[L1]]
; CHECK-NEXT: [[RHS:%.*]] = icmp ult i8 [[R0]], -1
; CHECK-NEXT: ret i1 [[RHS]]
; CHECK: [[LHS_FALSE]]:
; CHECK-NEXT: ret i1 [[V]]
;
%LHS = icmp samesign ugt i8 %L0, %L1
br i1 %LHS, label %LHS_true, label %LHS_false

LHS_true:
%R0 = sub nsw i8 %L0, %L1
%RHS = icmp ult i8 %R0, -1
ret i1 %RHS

LHS_false:
ret i1 %V
}

define i1 @ul_sub_nsw_ult(i8 %L0, i8 %L1, i1 %V) {
; CHECK-LABEL: define i1 @ul_sub_nsw_ult(
; CHECK-SAME: i8 [[L0:%.*]], i8 [[L1:%.*]], i1 [[V:%.*]]) {
; CHECK-NEXT: [[LHS:%.*]] = icmp samesign ult i8 [[L0]], [[L1]]
; CHECK-NEXT: br i1 [[LHS]], label %[[LHS_TRUE:.*]], label %[[LHS_FALSE:.*]]
; CHECK: [[LHS_TRUE]]:
; CHECK-NEXT: [[R0:%.*]] = sub nsw i8 [[L0]], [[L1]]
; CHECK-NEXT: [[RHS:%.*]] = icmp ult i8 [[R0]], 1
; CHECK-NEXT: ret i1 [[RHS]]
; CHECK: [[LHS_FALSE]]:
; CHECK-NEXT: ret i1 [[V]]
;
%LHS = icmp samesign ult i8 %L0, %L1
br i1 %LHS, label %LHS_true, label %LHS_false

LHS_true:
%R0 = sub nsw i8 %L0, %L1
%RHS = icmp ult i8 %R0, 1
ret i1 %RHS

LHS_false:
ret i1 %V
}
Loading