Skip to content

Commit c546b53

Browse files
authored
[ValueTracking] Pass changed predicate SignedLPred to isImpliedByMatchingCmp (#124271)
Fixes #124267. Since we are using the new predicate, we should also update the parameters of `isImpliedByMatchingCmp`.
1 parent 9cf52fe commit c546b53

File tree

2 files changed

+50
-2
lines changed

2 files changed

+50
-2
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9494,7 +9494,7 @@ isImpliedCondICmps(const ICmpInst *LHS, CmpPredicate RPred, const Value *R0,
94949494
SignedLPred == ICmpInst::ICMP_SGE) &&
94959495
match(R0, m_NSWSub(m_Specific(L0), m_Specific(L1)))) {
94969496
if (match(R1, m_NonPositive()) &&
9497-
ICmpInst::isImpliedByMatchingCmp(LPred, RPred) == false)
9497+
ICmpInst::isImpliedByMatchingCmp(SignedLPred, RPred) == false)
94989498
return false;
94999499
}
95009500

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

llvm/test/Analysis/ValueTracking/implied-condition-samesign.ll

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,3 +292,51 @@ taken:
292292
end:
293293
ret i32 0
294294
}
295+
296+
define i1 @gt_sub_nsw_ult(i8 %L0, i8 %L1, i1 %V) {
297+
; CHECK-LABEL: define i1 @gt_sub_nsw_ult(
298+
; CHECK-SAME: i8 [[L0:%.*]], i8 [[L1:%.*]], i1 [[V:%.*]]) {
299+
; CHECK-NEXT: [[LHS:%.*]] = icmp samesign ugt i8 [[L0]], [[L1]]
300+
; CHECK-NEXT: br i1 [[LHS]], label %[[LHS_TRUE:.*]], label %[[LHS_FALSE:.*]]
301+
; CHECK: [[LHS_TRUE]]:
302+
; CHECK-NEXT: [[R0:%.*]] = sub nsw i8 [[L0]], [[L1]]
303+
; CHECK-NEXT: [[RHS:%.*]] = icmp ult i8 [[R0]], -1
304+
; CHECK-NEXT: ret i1 [[RHS]]
305+
; CHECK: [[LHS_FALSE]]:
306+
; CHECK-NEXT: ret i1 [[V]]
307+
;
308+
%LHS = icmp samesign ugt i8 %L0, %L1
309+
br i1 %LHS, label %LHS_true, label %LHS_false
310+
311+
LHS_true:
312+
%R0 = sub nsw i8 %L0, %L1
313+
%RHS = icmp ult i8 %R0, -1
314+
ret i1 %RHS
315+
316+
LHS_false:
317+
ret i1 %V
318+
}
319+
320+
define i1 @lt_sub_nsw_ult(i8 %L0, i8 %L1, i1 %V) {
321+
; CHECK-LABEL: define i1 @lt_sub_nsw_ult(
322+
; CHECK-SAME: i8 [[L0:%.*]], i8 [[L1:%.*]], i1 [[V:%.*]]) {
323+
; CHECK-NEXT: [[LHS:%.*]] = icmp samesign ult i8 [[L0]], [[L1]]
324+
; CHECK-NEXT: br i1 [[LHS]], label %[[LHS_TRUE:.*]], label %[[LHS_FALSE:.*]]
325+
; CHECK: [[LHS_TRUE]]:
326+
; CHECK-NEXT: [[R0:%.*]] = sub nsw i8 [[L0]], [[L1]]
327+
; CHECK-NEXT: [[RHS:%.*]] = icmp ult i8 [[R0]], 1
328+
; CHECK-NEXT: ret i1 [[RHS]]
329+
; CHECK: [[LHS_FALSE]]:
330+
; CHECK-NEXT: ret i1 [[V]]
331+
;
332+
%LHS = icmp samesign ult i8 %L0, %L1
333+
br i1 %LHS, label %LHS_true, label %LHS_false
334+
335+
LHS_true:
336+
%R0 = sub nsw i8 %L0, %L1
337+
%RHS = icmp ult i8 %R0, 1
338+
ret i1 %RHS
339+
340+
LHS_false:
341+
ret i1 %V
342+
}

0 commit comments

Comments
 (0)