[llvm] r268360 - AArch64/optimizeCondBranch: Remove earlier kill flag when forming TBZ

Matthias Braun via llvm-commits llvm-commits at lists.llvm.org
Mon May 2 21:54:17 PDT 2016


Author: matze
Date: Mon May  2 23:54:16 2016
New Revision: 268360

URL: http://llvm.org/viewvc/llvm-project?rev=268360&view=rev
Log:
AArch64/optimizeCondBranch: Remove earlier kill flag when forming TBZ

This fixes -verify-machineinstrs complaints when compiling
test-suite/SingleSource/Benchmarks/Shootout-C++/wordfreq.cpp

Added:
    llvm/trunk/test/CodeGen/AArch64/optimize-cond-branch.ll
Modified:
    llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp

Modified: llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp?rev=268360&r1=268359&r2=268360&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp (original)
+++ llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp Mon May  2 23:54:16 2016
@@ -3888,6 +3888,8 @@ bool AArch64InstrInfo::optimizeCondBranc
                               .addReg(NewReg)
                               .addImm(Imm)
                               .addMBB(TBB);
+    // Register lives on to the CBZ now.
+    MO.setIsKill(false);
 
     // For immediate smaller than 32, we need to use the 32-bit
     // variant (W) in all cases. Indeed the 64-bit variant does not

Added: llvm/trunk/test/CodeGen/AArch64/optimize-cond-branch.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/optimize-cond-branch.ll?rev=268360&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/AArch64/optimize-cond-branch.ll (added)
+++ llvm/trunk/test/CodeGen/AArch64/optimize-cond-branch.ll Mon May  2 23:54:16 2016
@@ -0,0 +1,48 @@
+; RUN: llc -verify-machineinstrs -o - %s | FileCHeck %s
+target triple = "arm64--"
+
+; AArch64InstrInfo::optimizeCondBranch() optimizes the
+; "x = and y, 256; cmp x, 0; br" from an "and; cbnz" to a tbnz instruction.
+; It forgot to clear the a flag resulting in a MachineVerifier complaint.
+;
+; Writing a stable/simple test is tricky since most tbz instructions are already
+; formed in SelectionDAG, optimizeCondBranch() only triggers if the and
+; instruction is in a different block than the conditional jump.
+;
+; CHECK-LABEL: func
+; CHECK-NOT: and
+; CHECK: tbnz
+define void @func() {
+  %c0 = icmp sgt i64 0, 0
+  br i1 %c0, label %b1, label %b6
+
+b1:
+  br i1 undef, label %b3, label %b2
+
+b2:
+  %v0 = tail call i32 @extfunc()
+  br label %b5
+
+b3:
+  %v1 = load i32, i32* undef, align 4
+  %v2 = and i32 %v1, 256
+  br label %b5
+
+b5:
+  %v3 = phi i32 [ %v2, %b3 ], [ %v0, %b2 ]
+  %c1 = icmp eq i32 %v3, 0
+  br i1 %c1, label %b8, label %b7
+
+b6:
+  tail call i32 @extfunc()
+  ret void
+
+b7:
+  tail call i32 @extfunc()
+  ret void
+
+b8:
+  ret void
+}
+
+declare i32 @extfunc()




More information about the llvm-commits mailing list