Index: llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp =================================================================== --- llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp +++ llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp @@ -410,6 +410,8 @@ 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 @@ 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 Index: llvm/trunk/test/CodeGen/ARM/sjlj-prepare-critical-edge.ll =================================================================== --- llvm/trunk/test/CodeGen/ARM/sjlj-prepare-critical-edge.ll +++ llvm/trunk/test/CodeGen/ARM/sjlj-prepare-critical-edge.ll @@ -79,7 +79,7 @@ ; 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" } Index: llvm/trunk/test/CodeGen/Thumb2/v8_IT_5.ll =================================================================== --- llvm/trunk/test/CodeGen/Thumb2/v8_IT_5.ll +++ llvm/trunk/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