[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