[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 09bdab7fe8df1567529b558a1c4c4fb5a07ca8f6..5527213c89d8d6012a5f441fdd3356000a8f184f 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 20c5df105ad2bbc4de65b38582fefec45f352529..6e31a045d28552e75721359db9d034fa2fa3449c 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: