Index: llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp =================================================================== --- llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp +++ llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp @@ -1933,6 +1933,12 @@ if (!TCycles) return false; + // Try not to replicate instructions at minsize + if (TBB.getParent()->getFunction().optForMinSize()) { + if (TBB.pred_size() != 1 || FBB.pred_size() != 1) + return false; + } + // Attempt to estimate the relative costs of predication versus branching. // Here we scale up each component of UnpredCost to avoid precision issue when // scaling TCycles/FCycles by Probability. Index: llvm/test/CodeGen/Thumb2/ifcvt-minsize.ll =================================================================== --- llvm/test/CodeGen/Thumb2/ifcvt-minsize.ll +++ llvm/test/CodeGen/Thumb2/ifcvt-minsize.ll @@ -11,9 +11,10 @@ ; CHECK-NEXT: mov r4, r0 ; CHECK-NEXT: bl fn ; CHECK-NEXT: movs r0, #0 -; CHECK-NEXT: cmp r4, #0 -; CHECK-NEXT: it ne -; CHECK-NEXT: popne {r4, pc} +; CHECK-NEXT: cbz r4, .LBB0_2 +; CHECK-NEXT: @ %bb.1: @ %return +; CHECK-NEXT: pop {r4, pc} +; CHECK-NEXT: .LBB0_2: @ %if.end ; CHECK-NEXT: bl fn ; CHECK-NEXT: adds r0, #1 ; CHECK-NEXT: pop {r4, pc} @@ -36,13 +37,14 @@ ; CHECK-LABEL: f2: ; CHECK: @ %bb.0: @ %entry ; CHECK-NEXT: cmp r0, #1 -; CHECK-NEXT: it ne -; CHECK-NEXT: bxne lr +; CHECK-NEXT: bne .LBB1_2 +; CHECK-NEXT: @ %bb.1: @ %t ; CHECK-NEXT: .save {r7, lr} ; CHECK-NEXT: push {r7, lr} ; CHECK-NEXT: movs r0, #0 ; CHECK-NEXT: bl fn ; CHECK-NEXT: pop.w {r7, lr} +; CHECK-NEXT: .LBB1_2: @ %f ; CHECK-NEXT: bx lr entry: %p = icmp eq i32 %x, 1