[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