[PATCH] D60089: [ARM] Don't replicate instructions in Ifcvt at minsize

Dave Green via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sat Apr 6 16:25:41 PDT 2019


dmgreen updated this revision to Diff 194042.
dmgreen marked 3 inline comments as done.

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D60089/new/

https://reviews.llvm.org/D60089

Files:
  llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp
  llvm/test/CodeGen/Thumb2/ifcvt-minsize.ll


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}
@@ -41,10 +42,11 @@
 ; CHECK-NEXT:    bl fn
 ; CHECK-NEXT:    movs r0, #0
 ; CHECK-NEXT:    cmp r4, #1
-; CHECK-NEXT:    it ne
-; CHECK-NEXT:    popne {r4, pc}
+; CHECK-NEXT:    bne .LBB1_2
+; CHECK-NEXT:  @ %bb.1: @ %if.end
 ; CHECK-NEXT:    bl fn
 ; CHECK-NEXT:    adds r0, #1
+; CHECK-NEXT:  .LBB1_2: @ %return
 ; CHECK-NEXT:    pop {r4, pc}
 entry:
   %call = tail call i32 @fn(i32 %a) #2
@@ -65,13 +67,14 @@
 ; CHECK-LABEL: f3:
 ; CHECK:       @ %bb.0: @ %entry
 ; CHECK-NEXT:    cmp r0, #1
-; CHECK-NEXT:    it ne
-; CHECK-NEXT:    bxne lr
+; CHECK-NEXT:    bne .LBB2_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:  .LBB2_2: @ %f
 ; CHECK-NEXT:    bx lr
 entry:
   %p = icmp eq i32 %x, 1
Index: llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp
===================================================================
--- llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp
+++ llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp
@@ -1924,6 +1924,15 @@
   if (!TCycles)
     return false;
 
+  // In thumb code we often end up trading one branch for a IT block, and
+  // if we are cloning the instruction can increase code size. Prevent
+  // blocks with multiple predecesors from being ifcvted to prevent this
+  // cloning.
+  if (Subtarget.isThumb2() && TBB.getParent()->getFunction().hasMinSize()) {
+    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.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D60089.194042.patch
Type: text/x-patch
Size: 2333 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190406/99f6d785/attachment.bin>


More information about the llvm-commits mailing list