diff --git a/llvm/lib/Analysis/BranchProbabilityInfo.cpp b/llvm/lib/Analysis/BranchProbabilityInfo.cpp index ca4b58044d67df..ac5dbe1ce6e94f 100644 --- a/llvm/lib/Analysis/BranchProbabilityInfo.cpp +++ b/llvm/lib/Analysis/BranchProbabilityInfo.cpp @@ -881,7 +881,7 @@ bool BranchProbabilityInfo::calcZeroHeuristics(const BasicBlock *BB, // we don't have information about probabilities. if (Instruction *LHS = dyn_cast(CI->getOperand(0))) if (LHS->getOpcode() == Instruction::And) - if (ConstantInt *AndRHS = dyn_cast(LHS->getOperand(1))) + if (ConstantInt *AndRHS = GetConstantInt(LHS->getOperand(1))) if (AndRHS->getValue().isPowerOf2()) return false; diff --git a/llvm/test/Analysis/BranchProbabilityInfo/hoist.ll b/llvm/test/Analysis/BranchProbabilityInfo/hoist.ll new file mode 100644 index 00000000000000..1daa5d1e86e73c --- /dev/null +++ b/llvm/test/Analysis/BranchProbabilityInfo/hoist.ll @@ -0,0 +1,63 @@ +; RUN: opt < %s -analyze -branch-prob -enable-new-pm=0 | FileCheck %s +; RUN: opt < %s -passes='print' -disable-output 2>&1 | FileCheck %s + +; CHECK-LABEL: no_hoist +; CHECK: edge entry -> if.end probability is 0x40000000 / 0x80000000 = 50.00% +; CHECK: edge entry -> if.then probability is 0x40000000 / 0x80000000 = 50.00% +; CHECK: edge if.end -> if.end4 probability is 0x40000000 / 0x80000000 = 50.00% +; CHECK: edge if.end -> if.then3 probability is 0x40000000 / 0x80000000 = 50.00% +define dso_local void @no_hoist(i64 %arg1, i64 %arg2) local_unnamed_addr #0 { +entry: + %and = and i64 %arg1, 1152921504606846976 + %tobool.not = icmp eq i64 %and, 0 + br i1 %tobool.not, label %if.end, label %if.then + +if.then: ; preds = %entry + tail call void @bar() + br label %if.end + +if.end: ; preds = %if.then, %entry + %and1 = and i64 %arg2, 1152921504606846976 + %tobool2.not = icmp eq i64 %and1, 0 + br i1 %tobool2.not, label %if.end4, label %if.then3 + +if.then3: ; preds = %if.end + tail call void @baz() + br label %if.end4 + +if.end4: ; preds = %if.then3, %if.end + ret void +} + +; CHECK-LABEL: hoist +; CHECK: edge entry -> if.end probability is 0x40000000 / 0x80000000 = 50.00% +; CHECK: edge entry -> if.then probability is 0x40000000 / 0x80000000 = 50.00% +; CHECK: edge if.end -> if.end4 probability is 0x40000000 / 0x80000000 = 50.00% +; CHECK: edge if.end -> if.then3 probability is 0x40000000 / 0x80000000 = 50.00% +define dso_local void @hoist(i64 %arg1, i64 %arg2) local_unnamed_addr #0 { +entry: + %const = bitcast i64 1152921504606846976 to i64 + %and = and i64 %arg1, %const + %tobool.not = icmp eq i64 %and, 0 + br i1 %tobool.not, label %if.end, label %if.then + +if.then: ; preds = %entry + tail call void @bar() + br label %if.end + +if.end: ; preds = %if.then, %entry + %and1 = and i64 %arg2, %const + %tobool2.not = icmp eq i64 %and1, 0 + br i1 %tobool2.not, label %if.end4, label %if.then3 + +if.then3: ; preds = %if.end + tail call void @baz() + br label %if.end4 + +if.end4: ; preds = %if.then3, %if.end + ret void +} + +declare dso_local void @bar() local_unnamed_addr #1 + +declare dso_local void @baz() local_unnamed_addr #1