[FastISel][AArch64] Optimize compare-and-branch for i1 to use 'tbz'.
authorJuergen Ributzka <juergen@apple.com>
Mon, 27 Oct 2014 19:46:23 +0000 (19:46 +0000)
committerJuergen Ributzka <juergen@apple.com>
Mon, 27 Oct 2014 19:46:23 +0000 (19:46 +0000)
Minor enhancement to use 'tbz' for i1 compare-and-branch to get rid of an 'and'
instruction.

This fixes rdar://problem/18784953.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220712 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/AArch64/AArch64FastISel.cpp
test/CodeGen/AArch64/fast-isel-cbz.ll

index 09bdab7..5527213 100644 (file)
@@ -2132,6 +2132,10 @@ bool AArch64FastISel::emitCompareAndBranch(const BranchInst *BI) {
             LHS = AndLHS;
           }
       }
+
+    if (VT == MVT::i1)
+      TestBit = 0;
+
     IsCmpNE = Predicate == CmpInst::ICMP_NE;
   } else if (Predicate == CmpInst::ICMP_SLT) {
     if (!isa<Constant>(RHS))
index 20c5df1..6e31a04 100644 (file)
@@ -2,8 +2,7 @@
 
 define i32 @icmp_eq_i1(i1 %a) {
 ; CHECK-LABEL: icmp_eq_i1
-; CHECK:       and [[REG:w[0-9]+]], w0, #0x1
-; CHECK:       cbz [[REG]], {{LBB.+_2}}
+; CHECK:       tbz w0, #0, {{LBB.+_2}}
   %1 = icmp eq i1 %a, 0
   br i1 %1, label %bb1, label %bb2
 bb2: