[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