From cfee5b04bc510e90659eeb20127f9cda0b57f71f Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Thu, 23 Apr 2015 20:31:32 +0000 Subject: [PATCH] ARM: When re-creating a branch via InsertBranch, preserve CPSR flags. In particular, this preserves the kill flag, which allows the Thumb2 cbn?z optimization to be applied in cases where a branch has been re-created after the live variables analysis pass, e.g. by the machine block placement pass. This appears to be low risk; a number of other targets seem to already be doing something similar, e.g. AArch64, PowerPC. Differential Revision: http://reviews.llvm.org/D9184 llvm-svn: 235639 --- llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp | 6 ++++-- llvm/test/CodeGen/ARM/sjlj-prepare-critical-edge.ll | 2 +- llvm/test/CodeGen/Thumb2/v8_IT_5.ll | 3 +-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp index 93742dd..a370ab3 100644 --- a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp +++ b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp @@ -410,6 +410,8 @@ ARMBaseInstrInfo::InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, assert((Cond.size() == 2 || Cond.size() == 0) && "ARM branch conditions have two components!"); + // For conditional branches, we use addOperand to preserve CPSR flags. + if (!FBB) { if (Cond.empty()) { // Unconditional branch? if (isThumb) @@ -418,13 +420,13 @@ ARMBaseInstrInfo::InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, BuildMI(&MBB, DL, get(BOpc)).addMBB(TBB); } else BuildMI(&MBB, DL, get(BccOpc)).addMBB(TBB) - .addImm(Cond[0].getImm()).addReg(Cond[1].getReg()); + .addImm(Cond[0].getImm()).addOperand(Cond[1]); return 1; } // Two-way conditional branch. BuildMI(&MBB, DL, get(BccOpc)).addMBB(TBB) - .addImm(Cond[0].getImm()).addReg(Cond[1].getReg()); + .addImm(Cond[0].getImm()).addOperand(Cond[1]); if (isThumb) BuildMI(&MBB, DL, get(BOpc)).addMBB(FBB).addImm(ARMCC::AL).addReg(0); else diff --git a/llvm/test/CodeGen/ARM/sjlj-prepare-critical-edge.ll b/llvm/test/CodeGen/ARM/sjlj-prepare-critical-edge.ll index dd0a0a0..f85203e 100644 --- a/llvm/test/CodeGen/ARM/sjlj-prepare-critical-edge.ll +++ b/llvm/test/CodeGen/ARM/sjlj-prepare-critical-edge.ll @@ -79,7 +79,7 @@ declare void @terminatev() ; CHECK: str r0, [sp, [[OFFSET:#[0-9]+]]] ; CHECK: ldr [[R0:r[0-9]+]], [sp, [[OFFSET]]] ; CHECK: {{.*}}@ %do.body.i.i.i -; CHECK: cmp [[R0]], #0 +; CHECK: cbz [[R0]] %"class.std::__1::basic_string" = type { %"class.std::__1::__compressed_pair" } %"class.std::__1::__compressed_pair" = type { %"class.std::__1::__libcpp_compressed_pair_imp" } diff --git a/llvm/test/CodeGen/Thumb2/v8_IT_5.ll b/llvm/test/CodeGen/Thumb2/v8_IT_5.ll index 2da75ad..78b80d7 100644 --- a/llvm/test/CodeGen/Thumb2/v8_IT_5.ll +++ b/llvm/test/CodeGen/Thumb2/v8_IT_5.ll @@ -3,8 +3,7 @@ ; CHECK: it ne ; CHECK-NEXT: cmpne ; CHECK-NEXT: bne [[JUMPTARGET:.LBB[0-9]+_[0-9]+]] -; CHECK: cmp -; CHECK-NEXT: beq +; CHECK: cbz ; CHECK-NEXT: %if.else163 ; CHECK-NEXT: mov.w ; CHECK-NEXT: b -- 2.7.4