diff --git a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp --- a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp +++ b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp @@ -2979,20 +2979,38 @@ case ARM::t2SBCri: case ARM::ANDrr: case ARM::ANDri: + case ARM::ANDrsr: + case ARM::ANDrsi: case ARM::t2ANDrr: case ARM::t2ANDri: + case ARM::t2ANDrs: case ARM::ORRrr: case ARM::ORRri: + case ARM::ORRrsr: + case ARM::ORRrsi: case ARM::t2ORRrr: case ARM::t2ORRri: + case ARM::t2ORRrs: case ARM::EORrr: case ARM::EORri: + case ARM::EORrsr: + case ARM::EORrsi: case ARM::t2EORrr: case ARM::t2EORri: + case ARM::t2EORrs: + case ARM::BICri: + case ARM::BICrr: + case ARM::BICrsi: + case ARM::BICrsr: + case ARM::t2BICri: + case ARM::t2BICrr: + case ARM::t2BICrs: case ARM::t2LSRri: case ARM::t2LSRrr: case ARM::t2LSLri: case ARM::t2LSLrr: + case ARM::MOVsr: + case ARM::MOVsi: return true; } } @@ -3266,8 +3284,9 @@ // Toggle the optional operand to CPSR (if it exists - in Thumb1 we always // set CPSR so this is represented as an explicit output) if (!IsThumb1) { - MI->getOperand(5).setReg(ARM::CPSR); - MI->getOperand(5).setIsDef(true); + unsigned CPSRRegNum = MI->getNumExplicitOperands() - 1; + MI->getOperand(CPSRRegNum).setReg(ARM::CPSR); + MI->getOperand(CPSRRegNum).setIsDef(true); } assert(!isPredicated(*MI) && "Can't use flags from predicated instruction"); CmpInstr.eraseFromParent(); diff --git a/llvm/lib/Target/ARM/ARMInstrInfo.td b/llvm/lib/Target/ARM/ARMInstrInfo.td --- a/llvm/lib/Target/ARM/ARMInstrInfo.td +++ b/llvm/lib/Target/ARM/ARMInstrInfo.td @@ -4891,6 +4891,13 @@ (CMPrsi GPR:$src, so_reg_imm:$rhs)>; def : ARMPat<(ARMcmpZ GPR:$src, so_reg_reg:$rhs), (CMPrsr GPR:$src, so_reg_reg:$rhs)>; +// Following patterns aimed to prevent usage of CMPrsi and CMPrsr for a comparison +// with zero. Usage of CMPri in these cases helps to replace cmp with S-versions of +// shift instructions during peephole optimizations pass. +def : ARMPat<(ARMcmpZ so_reg_imm:$rhs, 0), + (CMPri (MOVsi so_reg_imm:$rhs), 0)>; +def : ARMPat<(ARMcmpZ so_reg_reg:$rhs, 0), + (CMPri (MOVsr so_reg_reg:$rhs), 0)>; // CMN register-integer let isCompare = 1, Defs = [CPSR] in { diff --git a/llvm/test/CodeGen/ARM/branch-on-zero.ll b/llvm/test/CodeGen/ARM/branch-on-zero.ll --- a/llvm/test/CodeGen/ARM/branch-on-zero.ll +++ b/llvm/test/CodeGen/ARM/branch-on-zero.ll @@ -56,19 +56,16 @@ ; ; CHECK-V7A-LABEL: test_lshr: ; CHECK-V7A: @ %bb.0: @ %entry -; CHECK-V7A-NEXT: mov r3, #0 -; CHECK-V7A-NEXT: cmp r3, r2, lsr #2 -; CHECK-V7A-NEXT: beq .LBB0_3 -; CHECK-V7A-NEXT: @ %bb.1: @ %while.body.preheader -; CHECK-V7A-NEXT: lsr r2, r2, #2 -; CHECK-V7A-NEXT: .LBB0_2: @ %while.body +; CHECK-V7A-NEXT: lsrs r2, r2, #2 +; CHECK-V7A-NEXT: beq .LBB0_2 +; CHECK-V7A-NEXT: .LBB0_1: @ %while.body ; CHECK-V7A-NEXT: @ =>This Inner Loop Header: Depth=1 ; CHECK-V7A-NEXT: ldr r3, [r1], #4 ; CHECK-V7A-NEXT: subs r2, r2, #1 ; CHECK-V7A-NEXT: lsl r3, r3, #1 ; CHECK-V7A-NEXT: str r3, [r0], #4 -; CHECK-V7A-NEXT: bne .LBB0_2 -; CHECK-V7A-NEXT: .LBB0_3: @ %while.end +; CHECK-V7A-NEXT: bne .LBB0_1 +; CHECK-V7A-NEXT: .LBB0_2: @ %while.end ; CHECK-V7A-NEXT: mov r0, #0 ; CHECK-V7A-NEXT: bx lr entry: @@ -145,19 +142,16 @@ ; ; CHECK-V7A-LABEL: test_lshr2: ; CHECK-V7A: @ %bb.0: @ %entry -; CHECK-V7A-NEXT: mov r3, #0 -; CHECK-V7A-NEXT: cmp r3, r2, lsr #2 -; CHECK-V7A-NEXT: beq .LBB1_3 -; CHECK-V7A-NEXT: @ %bb.1: @ %while.body.preheader -; CHECK-V7A-NEXT: lsr r2, r2, #2 -; CHECK-V7A-NEXT: .LBB1_2: @ %while.body +; CHECK-V7A-NEXT: lsrs r2, r2, #2 +; CHECK-V7A-NEXT: beq .LBB1_2 +; CHECK-V7A-NEXT: .LBB1_1: @ %while.body ; CHECK-V7A-NEXT: @ =>This Inner Loop Header: Depth=1 ; CHECK-V7A-NEXT: ldr r3, [r1], #4 ; CHECK-V7A-NEXT: subs r2, r2, #1 ; CHECK-V7A-NEXT: lsl r3, r3, #1 ; CHECK-V7A-NEXT: str r3, [r0], #4 -; CHECK-V7A-NEXT: bne .LBB1_2 -; CHECK-V7A-NEXT: .LBB1_3: @ %while.end +; CHECK-V7A-NEXT: bne .LBB1_1 +; CHECK-V7A-NEXT: .LBB1_2: @ %while.end ; CHECK-V7A-NEXT: mov r0, #0 ; CHECK-V7A-NEXT: bx lr entry: diff --git a/llvm/test/CodeGen/ARM/cmp-peephole.ll b/llvm/test/CodeGen/ARM/cmp-peephole.ll --- a/llvm/test/CodeGen/ARM/cmp-peephole.ll +++ b/llvm/test/CodeGen/ARM/cmp-peephole.ll @@ -57,8 +57,7 @@ define i1 @cmp_ne_zero_and_rsr(i32 %a, i32 %b, i32 %c) { ; ARM-LABEL: cmp_ne_zero_and_rsr: ; ARM: @ %bb.0: -; ARM-NEXT: and r0, r0, r1, lsl r2 -; ARM-NEXT: cmp r0, #0 +; ARM-NEXT: ands r0, r0, r1, lsl r2 ; ARM-NEXT: movwne r0, #1 ; ARM-NEXT: bx lr ; @@ -86,8 +85,7 @@ define i1 @cmp_ne_zero_and_rsi(i32 %a, i32 %b) { ; ARM-LABEL: cmp_ne_zero_and_rsi: ; ARM: @ %bb.0: -; ARM-NEXT: and r0, r0, r1, lsr #17 -; ARM-NEXT: cmp r0, #0 +; ARM-NEXT: ands r0, r0, r1, lsr #17 ; ARM-NEXT: movwne r0, #1 ; ARM-NEXT: bx lr ; @@ -101,8 +99,7 @@ ; ; THUMB2-LABEL: cmp_ne_zero_and_rsi: ; THUMB2: @ %bb.0: -; THUMB2-NEXT: and.w r0, r0, r1, lsr #17 -; THUMB2-NEXT: cmp r0, #0 +; THUMB2-NEXT: ands.w r0, r0, r1, lsr #17 ; THUMB2-NEXT: it ne ; THUMB2-NEXT: movne r0, #1 ; THUMB2-NEXT: bx lr @@ -166,8 +163,7 @@ define i1 @cmp_ne_zero_or_rsr(i32 %a, i32 %b, i32 %c) { ; ARM-LABEL: cmp_ne_zero_or_rsr: ; ARM: @ %bb.0: -; ARM-NEXT: orr r0, r0, r1, lsl r2 -; ARM-NEXT: cmp r0, #0 +; ARM-NEXT: orrs r0, r0, r1, lsl r2 ; ARM-NEXT: movwne r0, #1 ; ARM-NEXT: bx lr ; @@ -195,8 +191,7 @@ define i1 @cmp_ne_zero_or_rsi(i32 %a, i32 %b) { ; ARM-LABEL: cmp_ne_zero_or_rsi: ; ARM: @ %bb.0: -; ARM-NEXT: orr r0, r0, r1, lsr #17 -; ARM-NEXT: cmp r0, #0 +; ARM-NEXT: orrs r0, r0, r1, lsr #17 ; ARM-NEXT: movwne r0, #1 ; ARM-NEXT: bx lr ; @@ -210,8 +205,7 @@ ; ; THUMB2-LABEL: cmp_ne_zero_or_rsi: ; THUMB2: @ %bb.0: -; THUMB2-NEXT: orr.w r0, r0, r1, lsr #17 -; THUMB2-NEXT: cmp r0, #0 +; THUMB2-NEXT: orrs.w r0, r0, r1, lsr #17 ; THUMB2-NEXT: it ne ; THUMB2-NEXT: movne r0, #1 ; THUMB2-NEXT: bx lr @@ -274,8 +268,7 @@ define i1 @cmp_ne_zero_xor_rsr(i32 %a, i32 %b, i32 %c) { ; ARM-LABEL: cmp_ne_zero_xor_rsr: ; ARM: @ %bb.0: -; ARM-NEXT: eor r0, r0, r1, lsl r2 -; ARM-NEXT: cmp r0, #0 +; ARM-NEXT: eors r0, r0, r1, lsl r2 ; ARM-NEXT: movwne r0, #1 ; ARM-NEXT: bx lr ; @@ -303,8 +296,7 @@ define i1 @cmp_ne_zero_xor_rsi(i32 %a, i32 %b) { ; ARM-LABEL: cmp_ne_zero_xor_rsi: ; ARM: @ %bb.0: -; ARM-NEXT: eor r0, r0, r1, lsr #17 -; ARM-NEXT: cmp r0, #0 +; ARM-NEXT: eors r0, r0, r1, lsr #17 ; ARM-NEXT: movwne r0, #1 ; ARM-NEXT: bx lr ; @@ -318,8 +310,7 @@ ; ; THUMB2-LABEL: cmp_ne_zero_xor_rsi: ; THUMB2: @ %bb.0: -; THUMB2-NEXT: eor.w r0, r0, r1, lsr #17 -; THUMB2-NEXT: cmp r0, #0 +; THUMB2-NEXT: eors.w r0, r0, r1, lsr #17 ; THUMB2-NEXT: it ne ; THUMB2-NEXT: movne r0, #1 ; THUMB2-NEXT: bx lr @@ -332,8 +323,7 @@ define i1 @cmp_ne_zero_and_not_rr(i32 %a, i32 %b) { ; ARM-LABEL: cmp_ne_zero_and_not_rr: ; ARM: @ %bb.0: -; ARM-NEXT: bic r0, r0, r1 -; ARM-NEXT: cmp r0, #0 +; ARM-NEXT: bics r0, r0, r1 ; ARM-NEXT: movwne r0, #1 ; ARM-NEXT: bx lr ; @@ -347,7 +337,6 @@ ; THUMB2-LABEL: cmp_ne_zero_and_not_rr: ; THUMB2: @ %bb.0: ; THUMB2-NEXT: bics r0, r1 -; THUMB2-NEXT: cmp r0, #0 ; THUMB2-NEXT: it ne ; THUMB2-NEXT: movne r0, #1 ; THUMB2-NEXT: bx lr @@ -360,8 +349,7 @@ define i1 @cmp_ne_zero_and_not_ri(i32 %a) { ; ARM-LABEL: cmp_ne_zero_and_not_ri: ; ARM: @ %bb.0: -; ARM-NEXT: bic r0, r0, #42 -; ARM-NEXT: cmp r0, #0 +; ARM-NEXT: bics r0, r0, #42 ; ARM-NEXT: movwne r0, #1 ; ARM-NEXT: bx lr ; @@ -375,8 +363,7 @@ ; ; THUMB2-LABEL: cmp_ne_zero_and_not_ri: ; THUMB2: @ %bb.0: -; THUMB2-NEXT: bic r0, r0, #42 -; THUMB2-NEXT: cmp r0, #0 +; THUMB2-NEXT: bics r0, r0, #42 ; THUMB2-NEXT: it ne ; THUMB2-NEXT: movne r0, #1 ; THUMB2-NEXT: bx lr @@ -389,8 +376,7 @@ define i1 @cmp_ne_zero_and_not_rsr(i32 %a, i32 %b, i32 %c) { ; ARM-LABEL: cmp_ne_zero_and_not_rsr: ; ARM: @ %bb.0: -; ARM-NEXT: bic r0, r0, r1, lsl r2 -; ARM-NEXT: cmp r0, #0 +; ARM-NEXT: bics r0, r0, r1, lsl r2 ; ARM-NEXT: movwne r0, #1 ; ARM-NEXT: bx lr ; @@ -406,7 +392,6 @@ ; THUMB2: @ %bb.0: ; THUMB2-NEXT: lsls r1, r2 ; THUMB2-NEXT: bics r0, r1 -; THUMB2-NEXT: cmp r0, #0 ; THUMB2-NEXT: it ne ; THUMB2-NEXT: movne r0, #1 ; THUMB2-NEXT: bx lr @@ -420,8 +405,7 @@ define i1 @cmp_ne_zero_and_not_rsi(i32 %a, i32 %b) { ; ARM-LABEL: cmp_ne_zero_and_not_rsi: ; ARM: @ %bb.0: -; ARM-NEXT: bic r0, r0, r1, lsr #17 -; ARM-NEXT: cmp r0, #0 +; ARM-NEXT: bics r0, r0, r1, lsr #17 ; ARM-NEXT: movwne r0, #1 ; ARM-NEXT: bx lr ; @@ -435,8 +419,7 @@ ; ; THUMB2-LABEL: cmp_ne_zero_and_not_rsi: ; THUMB2: @ %bb.0: -; THUMB2-NEXT: bic.w r0, r0, r1, lsr #17 -; THUMB2-NEXT: cmp r0, #0 +; THUMB2-NEXT: bics.w r0, r0, r1, lsr #17 ; THUMB2-NEXT: it ne ; THUMB2-NEXT: movne r0, #1 ; THUMB2-NEXT: bx lr @@ -450,11 +433,8 @@ define i1 @cmp_ne_zero_shl_rr(i32 %a, i32 %b) { ; ARM-LABEL: cmp_ne_zero_shl_rr: ; ARM: @ %bb.0: -; ARM-NEXT: mov r3, #0 -; ARM-NEXT: lsl r2, r0, r1 -; ARM-NEXT: cmp r3, r0, lsl r1 -; ARM-NEXT: movwne r2, #1 -; ARM-NEXT: mov r0, r2 +; ARM-NEXT: lsls r0, r0, r1 +; ARM-NEXT: movwne r0, #1 ; ARM-NEXT: bx lr ; ; THUMB-LABEL: cmp_ne_zero_shl_rr: @@ -478,11 +458,8 @@ define i1 @cmp_ne_zero_shl_ri(i32 %a) { ; ARM-LABEL: cmp_ne_zero_shl_ri: ; ARM: @ %bb.0: -; ARM-NEXT: mov r2, #0 -; ARM-NEXT: lsl r1, r0, #7 -; ARM-NEXT: cmp r2, r0, lsl #7 -; ARM-NEXT: movwne r1, #1 -; ARM-NEXT: mov r0, r1 +; ARM-NEXT: lsls r0, r0, #7 +; ARM-NEXT: movwne r0, #1 ; ARM-NEXT: bx lr ; ; THUMB-LABEL: cmp_ne_zero_shl_ri: @@ -506,11 +483,8 @@ define i1 @cmp_ne_zero_lshr_rr(i32 %a, i32 %b) { ; ARM-LABEL: cmp_ne_zero_lshr_rr: ; ARM: @ %bb.0: -; ARM-NEXT: mov r3, #0 -; ARM-NEXT: lsr r2, r0, r1 -; ARM-NEXT: cmp r3, r0, lsr r1 -; ARM-NEXT: movwne r2, #1 -; ARM-NEXT: mov r0, r2 +; ARM-NEXT: lsrs r0, r0, r1 +; ARM-NEXT: movwne r0, #1 ; ARM-NEXT: bx lr ; ; THUMB-LABEL: cmp_ne_zero_lshr_rr: @@ -534,11 +508,8 @@ define i1 @cmp_ne_zero_lshr_ri(i32 %a) { ; ARM-LABEL: cmp_ne_zero_lshr_ri: ; ARM: @ %bb.0: -; ARM-NEXT: mov r2, #0 -; ARM-NEXT: lsr r1, r0, #7 -; ARM-NEXT: cmp r2, r0, lsr #7 -; ARM-NEXT: movwne r1, #1 -; ARM-NEXT: mov r0, r1 +; ARM-NEXT: lsrs r0, r0, #7 +; ARM-NEXT: movwne r0, #1 ; ARM-NEXT: bx lr ; ; THUMB-LABEL: cmp_ne_zero_lshr_ri: @@ -562,11 +533,8 @@ define i1 @cmp_ne_zero_ashr_rr(i32 %a, i32 %b) { ; ARM-LABEL: cmp_ne_zero_ashr_rr: ; ARM: @ %bb.0: -; ARM-NEXT: mov r3, #0 -; ARM-NEXT: asr r2, r0, r1 -; ARM-NEXT: cmp r3, r0, asr r1 -; ARM-NEXT: movwne r2, #1 -; ARM-NEXT: mov r0, r2 +; ARM-NEXT: asrs r0, r0, r1 +; ARM-NEXT: movwne r0, #1 ; ARM-NEXT: bx lr ; ; THUMB-LABEL: cmp_ne_zero_ashr_rr: @@ -591,11 +559,8 @@ define i1 @cmp_ne_zero_ashr_ri(i32 %a) { ; ARM-LABEL: cmp_ne_zero_ashr_ri: ; ARM: @ %bb.0: -; ARM-NEXT: mov r2, #0 -; ARM-NEXT: asr r1, r0, #7 -; ARM-NEXT: cmp r2, r0, asr #7 -; ARM-NEXT: movwne r1, #1 -; ARM-NEXT: mov r0, r1 +; ARM-NEXT: asrs r0, r0, #7 +; ARM-NEXT: movwne r0, #1 ; ARM-NEXT: bx lr ; ; THUMB-LABEL: cmp_ne_zero_ashr_ri: @@ -1520,8 +1485,7 @@ define void @br_on_shift_eq_zero(i32 %a, i32 %b) { ; ARM-LABEL: br_on_shift_eq_zero: ; ARM: @ %bb.0: -; ARM-NEXT: mov r2, #0 -; ARM-NEXT: cmp r2, r0, lsl r1 +; ARM-NEXT: lsls r1, r0, r1 ; ARM-NEXT: bxne lr ; ARM-NEXT: .LBB51_1: @ %true_br ; ARM-NEXT: push {r11, lr} @@ -1564,8 +1528,7 @@ define void @br_on_shift_ne_zero(i32 %a, i32 %b) { ; ARM-LABEL: br_on_shift_ne_zero: ; ARM: @ %bb.0: -; ARM-NEXT: mov r2, #0 -; ARM-NEXT: cmp r2, r0, lsr r1 +; ARM-NEXT: lsrs r1, r0, r1 ; ARM-NEXT: bxeq lr ; ARM-NEXT: .LBB52_1: @ %true_br ; ARM-NEXT: push {r11, lr} diff --git a/llvm/test/CodeGen/ARM/consthoist-icmpimm.ll b/llvm/test/CodeGen/ARM/consthoist-icmpimm.ll --- a/llvm/test/CodeGen/ARM/consthoist-icmpimm.ll +++ b/llvm/test/CodeGen/ARM/consthoist-icmpimm.ll @@ -630,20 +630,17 @@ ; CHECKV7M-NEXT: ldrd lr, r0, [sp, #8] ; CHECKV7M-NEXT: beq .LBB6_2 ; CHECKV7M-NEXT: @ %bb.1: @ %then -; CHECKV7M-NEXT: orr.w r2, r3, r2, lsr #17 -; CHECKV7M-NEXT: orr.w r1, r1, r12, lsr #17 -; CHECKV7M-NEXT: cmp r2, #0 +; CHECKV7M-NEXT: orrs.w r2, r3, r2, lsr #17 ; CHECKV7M-NEXT: mov r2, r0 ; CHECKV7M-NEXT: it ne ; CHECKV7M-NEXT: movne r2, lr -; CHECKV7M-NEXT: cmp r1, #0 +; CHECKV7M-NEXT: orrs.w r1, r1, r12, lsr #17 ; CHECKV7M-NEXT: it ne ; CHECKV7M-NEXT: movne r0, lr ; CHECKV7M-NEXT: add r0, r2 ; CHECKV7M-NEXT: pop {r7, pc} ; CHECKV7M-NEXT: .LBB6_2: @ %else -; CHECKV7M-NEXT: orr.w r1, r3, r2, lsr #17 -; CHECKV7M-NEXT: cmp r1, #0 +; CHECKV7M-NEXT: orrs.w r1, r3, r2, lsr #17 ; CHECKV7M-NEXT: it ne ; CHECKV7M-NEXT: movne r0, lr ; CHECKV7M-NEXT: pop {r7, pc} @@ -658,20 +655,17 @@ ; CHECKV7A-NEXT: lsls r4, r4, #31 ; CHECKV7A-NEXT: beq .LBB6_2 ; CHECKV7A-NEXT: @ %bb.1: @ %then -; CHECKV7A-NEXT: orr.w r2, r3, r2, lsr #17 -; CHECKV7A-NEXT: orr.w r1, r1, r12, lsr #17 -; CHECKV7A-NEXT: cmp r2, #0 +; CHECKV7A-NEXT: orrs.w r2, r3, r2, lsr #17 ; CHECKV7A-NEXT: mov r2, r0 ; CHECKV7A-NEXT: it ne ; CHECKV7A-NEXT: movne r2, lr -; CHECKV7A-NEXT: cmp r1, #0 +; CHECKV7A-NEXT: orrs.w r1, r1, r12, lsr #17 ; CHECKV7A-NEXT: it ne ; CHECKV7A-NEXT: movne r0, lr ; CHECKV7A-NEXT: add r0, r2 ; CHECKV7A-NEXT: pop {r4, pc} ; CHECKV7A-NEXT: .LBB6_2: @ %else -; CHECKV7A-NEXT: orr.w r1, r3, r2, lsr #17 -; CHECKV7A-NEXT: cmp r1, #0 +; CHECKV7A-NEXT: orrs.w r1, r3, r2, lsr #17 ; CHECKV7A-NEXT: it ne ; CHECKV7A-NEXT: movne r0, lr ; CHECKV7A-NEXT: pop {r4, pc} diff --git a/llvm/test/CodeGen/ARM/hoist-and-by-const-from-lshr-in-eqcmp-zero.ll b/llvm/test/CodeGen/ARM/hoist-and-by-const-from-lshr-in-eqcmp-zero.ll --- a/llvm/test/CodeGen/ARM/hoist-and-by-const-from-lshr-in-eqcmp-zero.ll +++ b/llvm/test/CodeGen/ARM/hoist-and-by-const-from-lshr-in-eqcmp-zero.ll @@ -970,9 +970,8 @@ ; ARM6: @ %bb.0: ; ARM6-NEXT: uxtb r1, r1 ; ARM6-NEXT: mov r2, #24 -; ARM6-NEXT: and r1, r0, r2, lsr r1 +; ARM6-NEXT: ands r0, r0, r2, lsr r1 ; ARM6-NEXT: mov r0, #0 -; ARM6-NEXT: cmp r1, #0 ; ARM6-NEXT: movmi r0, #1 ; ARM6-NEXT: bx lr ; @@ -980,9 +979,8 @@ ; ARM78: @ %bb.0: ; ARM78-NEXT: uxtb r1, r1 ; ARM78-NEXT: mov r2, #24 -; ARM78-NEXT: and r1, r0, r2, lsr r1 +; ARM78-NEXT: ands r0, r0, r2, lsr r1 ; ARM78-NEXT: mov r0, #0 -; ARM78-NEXT: cmp r1, #0 ; ARM78-NEXT: movwmi r0, #1 ; ARM78-NEXT: bx lr ; diff --git a/llvm/test/CodeGen/ARM/icmp-shift-opt.ll b/llvm/test/CodeGen/ARM/icmp-shift-opt.ll --- a/llvm/test/CodeGen/ARM/icmp-shift-opt.ll +++ b/llvm/test/CodeGen/ARM/icmp-shift-opt.ll @@ -12,8 +12,7 @@ ; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1 ; CHECK-NEXT: adds r0, r0, #1 ; CHECK-NEXT: adc r1, r1, #0 -; CHECK-NEXT: orr r2, r1, r0, lsr #16 -; CHECK-NEXT: cmp r2, #0 +; CHECK-NEXT: orrs r2, r1, r0, lsr #16 ; CHECK-NEXT: bne .LBB0_1 ; CHECK-NEXT: @ %bb.2: @ %exit ; CHECK-NEXT: bx lr @@ -44,8 +43,7 @@ define i1 @opt_setcc_srl_ne_zero(i64 %a) nounwind { ; CHECK-LABEL: opt_setcc_srl_ne_zero: ; CHECK: @ %bb.0: -; CHECK-NEXT: orr r0, r1, r0, lsr #17 -; CHECK-NEXT: cmp r0, #0 +; CHECK-NEXT: orrs r0, r1, r0, lsr #17 ; CHECK-NEXT: movwne r0, #1 ; CHECK-NEXT: bx lr %srl = lshr i64 %a, 17 @@ -68,8 +66,7 @@ define i1 @opt_setcc_shl_ne_zero(i64 %a) nounwind { ; CHECK-LABEL: opt_setcc_shl_ne_zero: ; CHECK: @ %bb.0: -; CHECK-NEXT: orr r0, r0, r1, lsl #17 -; CHECK-NEXT: cmp r0, #0 +; CHECK-NEXT: orrs r0, r0, r1, lsl #17 ; CHECK-NEXT: movwne r0, #1 ; CHECK-NEXT: bx lr %shl = shl i64 %a, 17 @@ -144,8 +141,7 @@ ; CHECK-NEXT: orr r2, r0, r3 ; CHECK-NEXT: orr r0, r0, r1 ; CHECK-NEXT: lsr r0, r0, #15 -; CHECK-NEXT: orr r0, r0, r2, lsl #17 -; CHECK-NEXT: cmp r0, #0 +; CHECK-NEXT: orrs r0, r0, r2, lsl #17 ; CHECK-NEXT: movwne r0, #1 ; CHECK-NEXT: bx lr %shl = shl i128 %a, 17 diff --git a/llvm/test/CodeGen/ARM/sadd_sat.ll b/llvm/test/CodeGen/ARM/sadd_sat.ll --- a/llvm/test/CodeGen/ARM/sadd_sat.ll +++ b/llvm/test/CodeGen/ARM/sadd_sat.ll @@ -94,11 +94,10 @@ ; CHECK-T2-NEXT: eor.w r12, r1, r3 ; CHECK-T2-NEXT: adc.w r2, r1, r3 ; CHECK-T2-NEXT: eors r1, r2 -; CHECK-T2-NEXT: bic.w r1, r1, r12 -; CHECK-T2-NEXT: cmp r1, #0 -; CHECK-T2-NEXT: mov.w r1, #-2147483648 +; CHECK-T2-NEXT: bics.w r1, r1, r12 ; CHECK-T2-NEXT: it mi ; CHECK-T2-NEXT: asrmi r0, r2, #31 +; CHECK-T2-NEXT: mov.w r1, #-2147483648 ; CHECK-T2-NEXT: it mi ; CHECK-T2-NEXT: eormi.w r2, r1, r2, asr #31 ; CHECK-T2-NEXT: mov r1, r2 @@ -110,10 +109,9 @@ ; CHECK-ARM-NEXT: eor r12, r1, r3 ; CHECK-ARM-NEXT: adc r2, r1, r3 ; CHECK-ARM-NEXT: eor r1, r1, r2 -; CHECK-ARM-NEXT: bic r1, r1, r12 -; CHECK-ARM-NEXT: cmp r1, #0 -; CHECK-ARM-NEXT: mov r1, #-2147483648 +; CHECK-ARM-NEXT: bics r1, r1, r12 ; CHECK-ARM-NEXT: asrmi r0, r2, #31 +; CHECK-ARM-NEXT: mov r1, #-2147483648 ; CHECK-ARM-NEXT: eormi r2, r1, r2, asr #31 ; CHECK-ARM-NEXT: mov r1, r2 ; CHECK-ARM-NEXT: bx lr diff --git a/llvm/test/CodeGen/ARM/sadd_sat_plus.ll b/llvm/test/CodeGen/ARM/sadd_sat_plus.ll --- a/llvm/test/CodeGen/ARM/sadd_sat_plus.ll +++ b/llvm/test/CodeGen/ARM/sadd_sat_plus.ll @@ -91,10 +91,9 @@ ; CHECK-T2-NEXT: eor.w r3, r1, r12 ; CHECK-T2-NEXT: eors r1, r2 ; CHECK-T2-NEXT: bics r1, r3 -; CHECK-T2-NEXT: cmp r1, #0 -; CHECK-T2-NEXT: mov.w r1, #-2147483648 ; CHECK-T2-NEXT: it mi ; CHECK-T2-NEXT: asrmi r0, r2, #31 +; CHECK-T2-NEXT: mov.w r1, #-2147483648 ; CHECK-T2-NEXT: it mi ; CHECK-T2-NEXT: eormi.w r2, r1, r2, asr #31 ; CHECK-T2-NEXT: mov r1, r2 @@ -108,10 +107,9 @@ ; CHECK-ARM-NEXT: eor r3, r1, r2 ; CHECK-ARM-NEXT: adc r2, r1, r2 ; CHECK-ARM-NEXT: eor r1, r1, r2 -; CHECK-ARM-NEXT: bic r1, r1, r3 -; CHECK-ARM-NEXT: cmp r1, #0 -; CHECK-ARM-NEXT: mov r1, #-2147483648 +; CHECK-ARM-NEXT: bics r1, r1, r3 ; CHECK-ARM-NEXT: asrmi r0, r2, #31 +; CHECK-ARM-NEXT: mov r1, #-2147483648 ; CHECK-ARM-NEXT: eormi r2, r1, r2, asr #31 ; CHECK-ARM-NEXT: mov r1, r2 ; CHECK-ARM-NEXT: bx lr diff --git a/llvm/test/CodeGen/ARM/sat-to-bitop.ll b/llvm/test/CodeGen/ARM/sat-to-bitop.ll --- a/llvm/test/CodeGen/ARM/sat-to-bitop.ll +++ b/llvm/test/CodeGen/ARM/sat-to-bitop.ll @@ -37,8 +37,7 @@ ; CHECK-ARM-LABEL: sat0_base_16bit: ; CHECK-ARM: @ %bb.0: @ %entry ; CHECK-ARM-NEXT: lsl r1, r0, #16 -; CHECK-ARM-NEXT: asr r1, r1, #16 -; CHECK-ARM-NEXT: cmp r1, #0 +; CHECK-ARM-NEXT: asrs r1, r1, #16 ; CHECK-ARM-NEXT: movmi r0, #0 ; CHECK-ARM-NEXT: mov pc, lr ; @@ -71,8 +70,7 @@ ; CHECK-ARM-LABEL: sat0_base_8bit: ; CHECK-ARM: @ %bb.0: @ %entry ; CHECK-ARM-NEXT: lsl r1, r0, #24 -; CHECK-ARM-NEXT: asr r1, r1, #24 -; CHECK-ARM-NEXT: cmp r1, #0 +; CHECK-ARM-NEXT: asrs r1, r1, #24 ; CHECK-ARM-NEXT: movmi r0, #0 ; CHECK-ARM-NEXT: mov pc, lr ; diff --git a/llvm/test/CodeGen/Thumb2/LowOverheadLoops/arm_cmplx_dot_prod_f32.ll b/llvm/test/CodeGen/Thumb2/LowOverheadLoops/arm_cmplx_dot_prod_f32.ll --- a/llvm/test/CodeGen/Thumb2/LowOverheadLoops/arm_cmplx_dot_prod_f32.ll +++ b/llvm/test/CodeGen/Thumb2/LowOverheadLoops/arm_cmplx_dot_prod_f32.ll @@ -39,10 +39,10 @@ ; CHECK-NEXT: vcmla.f32 q0, q1, q2, #90 ; CHECK-NEXT: vldrw.u32 q1, [r1, #-16] ; CHECK-NEXT: vldrw.u32 q2, [r0, #-16] -; CHECK-NEXT: and.w r2, r4, r2, lsl #1 +; CHECK-NEXT: ands.w r2, r4, r2, lsl #1 ; CHECK-NEXT: vcmla.f32 q0, q2, q1, #0 ; CHECK-NEXT: vcmla.f32 q0, q2, q1, #90 -; CHECK-NEXT: cbz r2, .LBB0_8 +; CHECK-NEXT: beq .LBB0_8 ; CHECK-NEXT: @ %bb.4: @ %while.body9 ; CHECK-NEXT: vctp.32 r2 ; CHECK-NEXT: cmp r2, #4 diff --git a/llvm/test/CodeGen/Thumb2/mve-laneinterleaving.ll b/llvm/test/CodeGen/Thumb2/mve-laneinterleaving.ll --- a/llvm/test/CodeGen/Thumb2/mve-laneinterleaving.ll +++ b/llvm/test/CodeGen/Thumb2/mve-laneinterleaving.ll @@ -335,39 +335,36 @@ ; CHECK-NEXT: vmov.f32 s10, s7 ; CHECK-NEXT: vmov r10, s8 ; CHECK-NEXT: vmov.f32 s8, s6 -; CHECK-NEXT: vmov r6, s2 +; CHECK-NEXT: vmov r7, s2 ; CHECK-NEXT: vmov.f32 s2, s1 ; CHECK-NEXT: vmov.f32 s6, s5 ; CHECK-NEXT: vmov r2, s8 ; CHECK-NEXT: asr.w r0, r10, #31 -; CHECK-NEXT: asrs r7, r6, #31 +; CHECK-NEXT: asrs r5, r7, #31 ; CHECK-NEXT: adds.w r4, r10, r2 +; CHECK-NEXT: eor.w r6, r10, r2 ; CHECK-NEXT: adc r3, r0, #0 ; CHECK-NEXT: asrl r4, r3, r2 ; CHECK-NEXT: subs r0, r4, r2 ; CHECK-NEXT: sbc lr, r3, #0 ; CHECK-NEXT: vmov r3, s10 ; CHECK-NEXT: umull r0, r8, r0, r2 -; CHECK-NEXT: adds r4, r6, r3 -; CHECK-NEXT: eor.w r1, r6, r3 -; CHECK-NEXT: adc r5, r7, #0 -; CHECK-NEXT: eor.w r7, r10, r2 +; CHECK-NEXT: adds r4, r7, r3 +; CHECK-NEXT: eor.w r1, r7, r3 +; CHECK-NEXT: adc r5, r5, #0 ; CHECK-NEXT: asrl r4, r5, r3 -; CHECK-NEXT: orr.w r7, r7, r10, asr #31 ; CHECK-NEXT: subs r4, r4, r3 -; CHECK-NEXT: orr.w r1, r1, r6, asr #31 ; CHECK-NEXT: sbc r5, r5, #0 -; CHECK-NEXT: cmp r7, #0 +; CHECK-NEXT: orrs.w r6, r6, r10, asr #31 ; CHECK-NEXT: umull r4, r12, r4, r3 ; CHECK-NEXT: csetm r9, eq -; CHECK-NEXT: movs r7, #0 -; CHECK-NEXT: cmp r1, #0 -; CHECK-NEXT: bfi r7, r9, #0, #8 +; CHECK-NEXT: orrs.w r1, r1, r7, asr #31 +; CHECK-NEXT: mov.w r6, #0 ; CHECK-NEXT: csetm r1, eq -; CHECK-NEXT: bfi r7, r1, #8, #8 +; CHECK-NEXT: bfi r6, r9, #0, #8 ; CHECK-NEXT: mla r5, r5, r3, r12 -; CHECK-NEXT: rsbs r1, r6, #0 -; CHECK-NEXT: vmsr p0, r7 +; CHECK-NEXT: bfi r6, r1, #8, #8 +; CHECK-NEXT: rsbs r1, r7, #0 ; CHECK-NEXT: mla r7, lr, r2, r8 ; CHECK-NEXT: lsll r4, r5, r1 ; CHECK-NEXT: rsb.w r1, r10, #0 @@ -376,8 +373,9 @@ ; CHECK-NEXT: vmov r1, s6 ; CHECK-NEXT: lsll r0, r7, r2 ; CHECK-NEXT: lsll r4, r5, r3 -; CHECK-NEXT: mov.w r12, #0 +; CHECK-NEXT: vmsr p0, r6 ; CHECK-NEXT: vmov q3[2], q3[0], r0, r4 +; CHECK-NEXT: mov.w r12, #0 ; CHECK-NEXT: vpsel q2, q3, q2 ; CHECK-NEXT: adds.w r2, lr, r1 ; CHECK-NEXT: asr.w r0, lr, #31 @@ -396,12 +394,10 @@ ; CHECK-NEXT: sbc r8, r5, #0 ; CHECK-NEXT: mla r5, r7, r1, r6 ; CHECK-NEXT: eor.w r6, lr, r1 -; CHECK-NEXT: orr.w r6, r6, lr, asr #31 +; CHECK-NEXT: orrs.w r6, r6, lr, asr #31 ; CHECK-NEXT: eor.w r7, r2, r3 -; CHECK-NEXT: cmp r6, #0 -; CHECK-NEXT: orr.w r7, r7, r2, asr #31 ; CHECK-NEXT: csetm r6, eq -; CHECK-NEXT: cmp r7, #0 +; CHECK-NEXT: orrs.w r7, r7, r2, asr #31 ; CHECK-NEXT: csetm r7, eq ; CHECK-NEXT: rsb.w lr, lr, #0 ; CHECK-NEXT: bfi r12, r7, #0, #8