diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 92338d33b27a4..d89b88ce5e390 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -9495,7 +9495,8 @@ isImpliedCondICmps(const ICmpInst *LHS, CmpPredicate RPred, const Value *R0, // must be positive if X >= Y and no overflow". // Take SGT as an example: L0:x > L1:y and C >= 0 // ==> R0:(x -nsw y) < R1:(-C) is false - if ((LPred == ICmpInst::ICMP_SGT || LPred == ICmpInst::ICMP_SGE) && + if ((CmpPredicate::getMatching(LPred, ICmpInst::ICMP_SGT) || + CmpPredicate::getMatching(LPred, ICmpInst::ICMP_SGE)) && match(R0, m_NSWSub(m_Specific(L0), m_Specific(L1)))) { if (match(R1, m_NonPositive()) && isImpliedCondMatchingOperands(LPred, RPred) == false) @@ -9504,7 +9505,8 @@ isImpliedCondICmps(const ICmpInst *LHS, CmpPredicate RPred, const Value *R0, // Take SLT as an example: L0:x < L1:y and C <= 0 // ==> R0:(x -nsw y) < R1:(-C) is true - if ((LPred == ICmpInst::ICMP_SLT || LPred == ICmpInst::ICMP_SLE) && + if ((CmpPredicate::getMatching(LPred, ICmpInst::ICMP_SLT) || + CmpPredicate::getMatching(LPred, ICmpInst::ICMP_SLE)) && match(R0, m_NSWSub(m_Specific(L0), m_Specific(L1)))) { if (match(R1, m_NonNegative()) && isImpliedCondMatchingOperands(LPred, RPred) == true) diff --git a/llvm/test/Analysis/ValueTracking/implied-condition-samesign.ll b/llvm/test/Analysis/ValueTracking/implied-condition-samesign.ll index 546ff2d77d86e..35cfadaa2965a 100644 --- a/llvm/test/Analysis/ValueTracking/implied-condition-samesign.ll +++ b/llvm/test/Analysis/ValueTracking/implied-condition-samesign.ll @@ -207,10 +207,7 @@ define i32 @gt_sub_nsw(i32 %x, i32 %y) { ; CHECK: [[TAKEN]]: ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[X]], [[Y]] ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[SUB]], 1 -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[SUB]], -1 -; CHECK-NEXT: [[ABSCOND:%.*]] = icmp samesign ult i32 [[SUB]], -1 -; CHECK-NEXT: [[ABS:%.*]] = select i1 [[ABSCOND]], i32 [[NEG]], i32 [[ADD]] -; CHECK-NEXT: ret i32 [[ABS]] +; CHECK-NEXT: ret i32 [[ADD]] ; CHECK: [[END]]: ; CHECK-NEXT: ret i32 0 ; @@ -239,10 +236,7 @@ define i32 @ge_sub_nsw(i32 %x, i32 %y) { ; CHECK: [[TAKEN]]: ; CHECK-NEXT: [[SUB:%.*]] = sub nsw i32 [[X]], [[Y]] ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[SUB]], 1 -; CHECK-NEXT: [[NEG:%.*]] = xor i32 [[SUB]], -1 -; CHECK-NEXT: [[ABSCOND:%.*]] = icmp samesign ult i32 [[SUB]], -1 -; CHECK-NEXT: [[ABS:%.*]] = select i1 [[ABSCOND]], i32 [[NEG]], i32 [[ADD]] -; CHECK-NEXT: ret i32 [[ABS]] +; CHECK-NEXT: ret i32 [[ADD]] ; CHECK: [[END]]: ; CHECK-NEXT: ret i32 0 ;