diff --git a/llvm/lib/Analysis/BranchProbabilityInfo.cpp b/llvm/lib/Analysis/BranchProbabilityInfo.cpp --- a/llvm/lib/Analysis/BranchProbabilityInfo.cpp +++ b/llvm/lib/Analysis/BranchProbabilityInfo.cpp @@ -949,10 +949,13 @@ default: return false; } - } else if (CV->isOne() && CI->getPredicate() == CmpInst::ICMP_SLT) { - // InstCombine canonicalizes X <= 0 into X < 1. - // X <= 0 -> Unlikely - isProb = false; + } else if (CV->isOne()) { + if (CI->getPredicate() == CmpInst::ICMP_SLT) + // InstCombine canonicalizes X <= 0 into X < 1. + // X <= 0 -> Unlikely + isProb = false; + else + return false; } else if (CV->isMinusOne()) { switch (CI->getPredicate()) { case CmpInst::ICMP_EQ: @@ -972,7 +975,18 @@ return false; } } else { - return false; + // X == C -> Unlikely + // X != C -> Likely + switch (CI->getPredicate()) { + case CmpInst::ICMP_EQ: + isProb = false; + break; + case CmpInst::ICMP_NE: + isProb = true; + break; + default: + return false; + } } if (!isProb) diff --git a/llvm/test/Analysis/BranchProbabilityInfo/integer_heuristics.ll b/llvm/test/Analysis/BranchProbabilityInfo/integer_heuristics.ll --- a/llvm/test/Analysis/BranchProbabilityInfo/integer_heuristics.ll +++ b/llvm/test/Analysis/BranchProbabilityInfo/integer_heuristics.ll @@ -152,3 +152,37 @@ %r = sext i8 %v to i32 ret i32 %r } + + +; CHECK-LABEL: cst1 +define i32 @cst1(i32 %x, i8 signext %z, i8 signext %w) { +entry: + %c = icmp ne i32 %x, 7 + br i1 %c, label %then, label %else +; CHECK: edge entry -> then probability is 0x50000000 / 0x80000000 = 62.50% +; CHECK: edge entry -> else probability is 0x30000000 / 0x80000000 = 37.50% +then: + br label %else +; CHECK: edge then -> else probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge] +else: + %v = phi i8 [ %z, %then ], [ %w, %entry ] + %r = sext i8 %v to i32 + ret i32 %r +} + +; CHECK-LABEL: cst2 +define i32 @cst2(i32 %x, i8 signext %z, i8 signext %w) { +entry: + %c = icmp eq i32 %x, -5 + br i1 %c, label %then, label %else +; CHECK: edge entry -> then probability is 0x30000000 / 0x80000000 = 37.50% +; CHECK: edge entry -> else probability is 0x50000000 / 0x80000000 = 62.50% +then: + br label %else +; CHECK: edge then -> else probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge] +else: + %v = phi i8 [ %z, %then ], [ %w, %entry ] + %r = sext i8 %v to i32 + ret i32 %r +} +