[llvm] r234898 - The code that originally made me discover this is:
Rafael EspĂndola
rafael.espindola at gmail.com
Tue Apr 14 09:00:47 PDT 2015
reverted because CodeGen/ARM/2013-10-11-select-stalls.ll was failing.
On 14 April 2015 at 16:20, Daniel Jasper <djasper at google.com> wrote:
> Author: djasper
> Date: Tue Apr 14 10:20:37 2015
> New Revision: 234898
>
> URL: http://llvm.org/viewvc/llvm-project?rev=234898&view=rev
> Log:
> The code that originally made me discover this is:
>
> if ((a & 0x1) == 0x1) {
> ..
> }
>
> In this case we don't actually have any branch probability information and
> should not assume to have any. LLVM transforms this into:
>
> %and = and i32 %a, 1
> %tobool = icmp eq i32 %and, 0
>
> So, in this case, the result of a bitwise and is compared against 0,
> but nevertheless, we should not assume to have probability
> information.
>
> Modified:
> llvm/trunk/lib/Analysis/BranchProbabilityInfo.cpp
> llvm/trunk/test/Analysis/BranchProbabilityInfo/basic.ll
> llvm/trunk/test/CodeGen/AArch64/arm64-call-tailcalls.ll
> llvm/trunk/test/CodeGen/Mips/octeon.ll
>
> Modified: llvm/trunk/lib/Analysis/BranchProbabilityInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BranchProbabilityInfo.cpp?rev=234898&r1=234897&r2=234898&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/BranchProbabilityInfo.cpp (original)
> +++ llvm/trunk/lib/Analysis/BranchProbabilityInfo.cpp Tue Apr 14 10:20:37 2015
> @@ -379,6 +379,14 @@ bool BranchProbabilityInfo::calcZeroHeur
> if (!CV)
> return false;
>
> + // If the LHS is the result of AND'ing a value with a single bit bitmask,
> + // we don't have information about probabilities.
> + if (Instruction *LHS = dyn_cast<Instruction>(CI->getOperand(0)))
> + if (LHS->getOpcode() == Instruction::And)
> + if (ConstantInt *AndRHS = dyn_cast<ConstantInt>(LHS->getOperand(1)))
> + if (AndRHS->getUniqueInteger().isPowerOf2())
> + return false;
> +
> bool isProb;
> if (CV->isZero()) {
> switch (CI->getPredicate()) {
>
> Modified: llvm/trunk/test/Analysis/BranchProbabilityInfo/basic.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/BranchProbabilityInfo/basic.ll?rev=234898&r1=234897&r2=234898&view=diff
> ==============================================================================
> --- llvm/trunk/test/Analysis/BranchProbabilityInfo/basic.ll (original)
> +++ llvm/trunk/test/Analysis/BranchProbabilityInfo/basic.ll Tue Apr 14 10:20:37 2015
> @@ -212,3 +212,31 @@ exit:
> ret i32 %result
> }
>
> +define i32 @zero3(i32 %i, i32 %a, i32 %b) {
> +; CHECK: Printing analysis {{.*}} for function 'zero3'
> +entry:
> +; AND'ing with a single bit bitmask essentially leads to a bool comparison,
> +; meaning we don't have probability information.
> + %and = and i32 %i, 2
> + %tobool = icmp eq i32 %and, 0
> + br i1 %tobool, label %then, label %else
> +; CHECK: edge entry -> then probability is 16 / 32
> +; CHECK: edge entry -> else probability is 16 / 32
> +
> +then:
> +; AND'ing with other bitmask might be something else, so we still assume the
> +; usual probabilities.
> + %and2 = and i32 %i, 5
> + %tobool2 = icmp eq i32 %and2, 0
> + br i1 %tobool2, label %else, label %exit
> +; CHECK: edge then -> else probability is 12 / 32
> +; CHECK: edge then -> exit probability is 20 / 32
> +
> +else:
> + br label %exit
> +
> +exit:
> + %result = phi i32 [ %a, %then ], [ %b, %else ]
> + ret i32 %result
> +}
> +
>
> Modified: llvm/trunk/test/CodeGen/AArch64/arm64-call-tailcalls.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/arm64-call-tailcalls.ll?rev=234898&r1=234897&r2=234898&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/AArch64/arm64-call-tailcalls.ll (original)
> +++ llvm/trunk/test/CodeGen/AArch64/arm64-call-tailcalls.ll Tue Apr 14 10:20:37 2015
> @@ -53,9 +53,9 @@ bb:
>
> define i32 @t8(i32 %x) nounwind ssp {
> ; CHECK-LABEL: t8:
> +; CHECK: b _c
> ; CHECK: b _a
> ; CHECK: b _b
> -; CHECK: b _c
> %and = and i32 %x, 1
> %tobool = icmp eq i32 %and, 0
> br i1 %tobool, label %if.end, label %if.then
>
> Modified: llvm/trunk/test/CodeGen/Mips/octeon.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Mips/octeon.ll?rev=234898&r1=234897&r2=234898&view=diff
> ==============================================================================
> --- llvm/trunk/test/CodeGen/Mips/octeon.ll (original)
> +++ llvm/trunk/test/CodeGen/Mips/octeon.ll Tue Apr 14 10:20:37 2015
> @@ -93,7 +93,7 @@ entry:
> ; ALL-LABEL: bbit0:
> ; OCTEON: bbit0 $4, 3, $[[BB0:BB[0-9_]+]]
> ; MIPS64: andi $[[T0:[0-9]+]], $4, 8
> -; MIPS64: beqz $[[T0]], $[[BB0:BB[0-9_]+]]
> +; MIPS64: bnez $[[T0]], $[[BB0:BB[0-9_]+]]
> %bit = and i64 %a, 8
> %res = icmp eq i64 %bit, 0
> br i1 %res, label %endif, label %if
> @@ -111,7 +111,7 @@ entry:
> ; MIPS64: daddiu $[[T0:[0-9]+]], $zero, 1
> ; MIPS64: dsll $[[T1:[0-9]+]], $[[T0]], 35
> ; MIPS64: and $[[T2:[0-9]+]], $4, $[[T1]]
> -; MIPS64: beqz $[[T2]], $[[BB0:BB[0-9_]+]]
> +; MIPS64: bnez $[[T2]], $[[BB0:BB[0-9_]+]]
> %bit = and i64 %a, 34359738368
> %res = icmp eq i64 %bit, 0
> br i1 %res, label %endif, label %if
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list