Index: llvm/trunk/lib/Analysis/BranchProbabilityInfo.cpp =================================================================== --- llvm/trunk/lib/Analysis/BranchProbabilityInfo.cpp +++ llvm/trunk/lib/Analysis/BranchProbabilityInfo.cpp @@ -660,8 +660,14 @@ if (!CI) return false; + auto GetConstantInt = [](Value *V) { + if (auto *I = dyn_cast(V)) + return dyn_cast(I->getOperand(0)); + return dyn_cast(V); + }; + Value *RHS = CI->getOperand(1); - ConstantInt *CV = dyn_cast(RHS); + ConstantInt *CV = GetConstantInt(RHS); if (!CV) return false; Index: llvm/trunk/test/Analysis/BranchProbabilityInfo/zero_heuristics.ll =================================================================== --- llvm/trunk/test/Analysis/BranchProbabilityInfo/zero_heuristics.ll +++ llvm/trunk/test/Analysis/BranchProbabilityInfo/zero_heuristics.ll @@ -0,0 +1,103 @@ +; RUN: opt < %s -analyze -branch-prob | FileCheck %s + +@A = global i32 0, align 4 +@B = global i32 0, align 4 + +; CHECK-LABEL: eq_opaque_minus_one +define void @eq_opaque_minus_one(i32* %base) { +entry: + %const = bitcast i32 -1 to i32 + %tmp1 = load i32, i32* @B, align 4 + br label %for.body + +; CHECK: edge for.body -> if.then probability is 0x30000000 / 0x80000000 = 37.50% +; CHECK: edge for.body -> for.inc probability is 0x50000000 / 0x80000000 = 62.50% +for.body: + %tmp4 = phi i32 [ %tmp1, %entry ], [ %tmp7, %for.inc ] + %inc.iv = phi i32 [ 0, %entry ], [ %inc, %for.inc ] + %storemerge176.in = getelementptr inbounds i32, i32* %base, i32 %inc.iv + %storemerge176 = load i32, i32* %storemerge176.in, align 4 + store i32 %storemerge176, i32* @A, align 4 + %cmp20 = icmp eq i32 %storemerge176, %const + br i1 %cmp20, label %if.then, label %for.inc + +if.then: + %lnot.ext = zext i1 %cmp20 to i32 + store i32 %lnot.ext, i32* @B, align 4 + br label %for.inc + +for.inc: + %tmp7 = phi i32 [ %tmp4, %for.body ], [ %lnot.ext, %if.then ] + %inc = add nuw nsw i32 %inc.iv, 1 + %cmp9 = icmp ult i32 %inc, 401 + br i1 %cmp9, label %for.body, label %exit + +exit: + ret void +} + +; CHECK-LABEL: ne_opaque_minus_one +define void @ne_opaque_minus_one(i32* %base) { +entry: + %const = bitcast i32 -1 to i32 + %tmp1 = load i32, i32* @B, align 4 + br label %for.body + +; CHECK: edge for.body -> if.then probability is 0x50000000 / 0x80000000 = 62.50% +; CHECK: edge for.body -> for.inc probability is 0x30000000 / 0x80000000 = 37.50% +for.body: + %tmp4 = phi i32 [ %tmp1, %entry ], [ %tmp7, %for.inc ] + %inc.iv = phi i32 [ 0, %entry ], [ %inc, %for.inc ] + %storemerge176.in = getelementptr inbounds i32, i32* %base, i32 %inc.iv + %storemerge176 = load i32, i32* %storemerge176.in, align 4 + store i32 %storemerge176, i32* @A, align 4 + %cmp20 = icmp ne i32 %storemerge176, %const + br i1 %cmp20, label %if.then, label %for.inc + +if.then: + %lnot.ext = zext i1 %cmp20 to i32 + store i32 %lnot.ext, i32* @B, align 4 + br label %for.inc + +for.inc: + %tmp7 = phi i32 [ %tmp4, %for.body ], [ %lnot.ext, %if.then ] + %inc = add nuw nsw i32 %inc.iv, 1 + %cmp9 = icmp ult i32 %inc, 401 + br i1 %cmp9, label %for.body, label %exit + +exit: + ret void +} + +; CHECK-LABEL: sgt_opaque_minus_one +define void @sgt_opaque_minus_one(i32* %base) { +entry: + %const = bitcast i32 -1 to i32 + %tmp1 = load i32, i32* @B, align 4 + br label %for.body + +; CHECK: edge for.body -> if.then probability is 0x50000000 / 0x80000000 = 62.50% +; CHECK: edge for.body -> for.inc probability is 0x30000000 / 0x80000000 = 37.50% +for.body: + %tmp4 = phi i32 [ %tmp1, %entry ], [ %tmp7, %for.inc ] + %inc.iv = phi i32 [ 0, %entry ], [ %inc, %for.inc ] + %storemerge176.in = getelementptr inbounds i32, i32* %base, i32 %inc.iv + %storemerge176 = load i32, i32* %storemerge176.in, align 4 + store i32 %storemerge176, i32* @A, align 4 + %cmp20 = icmp sgt i32 %storemerge176, %const + br i1 %cmp20, label %if.then, label %for.inc + +if.then: + %lnot.ext = zext i1 %cmp20 to i32 + store i32 %lnot.ext, i32* @B, align 4 + br label %for.inc + +for.inc: + %tmp7 = phi i32 [ %tmp4, %for.body ], [ %lnot.ext, %if.then ] + %inc = add nuw nsw i32 %inc.iv, 1 + %cmp9 = icmp ult i32 %inc, 401 + br i1 %cmp9, label %for.body, label %exit + +exit: + ret void +}