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

Dave Green via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 1 12:16:18 PDT 2019


dmgreen created this revision.
dmgreen added reviewers: samparker, efriedma, olista01.
Herald added subscribers: hiraditya, kristof.beyls, javed.absar.
Herald added a project: LLVM.

Ifcvt can replicate instructions as it converts them to be predicated. This stops that from happening at minsize.

Test is new, just showing the differences here for clarity.


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}
@@ -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
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.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D60089.193148.patch
Type: text/x-patch
Size: 1734 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190401/d7dc7a0e/attachment.bin>


More information about the llvm-commits mailing list