From 76c57b05708389b3f0ac690892f5ed9cac1f3b98 Mon Sep 17 00:00:00 2001 From: Juergen Ributzka Date: Mon, 27 Oct 2014 19:46:23 +0000 Subject: [PATCH] [FastISel][AArch64] Optimize compare-and-branch for i1 to use 'tbz'. Minor enhancement to use 'tbz' for i1 compare-and-branch to get rid of an 'and' instruction. This fixes rdar://problem/18784953. llvm-svn: 220712 --- lib/Target/AArch64/AArch64FastISel.cpp | 4 ++++ test/CodeGen/AArch64/fast-isel-cbz.ll | 3 +-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/Target/AArch64/AArch64FastISel.cpp b/lib/Target/AArch64/AArch64FastISel.cpp index 09bdab7fe8d..5527213c89d 100644 --- a/lib/Target/AArch64/AArch64FastISel.cpp +++ b/lib/Target/AArch64/AArch64FastISel.cpp @@ -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(RHS)) diff --git a/test/CodeGen/AArch64/fast-isel-cbz.ll b/test/CodeGen/AArch64/fast-isel-cbz.ll index 20c5df105ad..6e31a045d28 100644 --- a/test/CodeGen/AArch64/fast-isel-cbz.ll +++ b/test/CodeGen/AArch64/fast-isel-cbz.ll @@ -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: