[PATCH] D108837: [SimplifyCFG] Ignore free instructions when computing cost for folding branch to common dest

Arthur Eubanks via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 27 12:37:44 PDT 2021


aeubanks created this revision.
Herald added a subscriber: hiraditya.
aeubanks requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

When determining whether to fold branches to a common destination by
merging two blocks, SimplifyCFG will count the number of instructions to
be moved into the first basic block. However, there's no reason to count
free instructions like bitcasts and other similar instructions.

This resolves missed branch foldings with -fstrict-vtable-pointers in
llvm-test-suite's lambda benchmark.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D108837

Files:
  llvm/lib/Transforms/Utils/SimplifyCFG.cpp
  llvm/test/Transforms/SimplifyCFG/fold-branch-to-common-dest-free-cost.ll


Index: llvm/test/Transforms/SimplifyCFG/fold-branch-to-common-dest-free-cost.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/SimplifyCFG/fold-branch-to-common-dest-free-cost.ll
@@ -0,0 +1,40 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -S -passes=simplifycfg -bonus-inst-threshold=1 | FileCheck %s
+
+declare i8* @llvm.strip.invariant.group.p0i8(i8*)
+
+declare void @g1()
+declare void @g2()
+
+define void @f(i8* %a, i8* %b, i1 %c, i1 %d, i1 %e) {
+; CHECK-LABEL: @f(
+; CHECK-NEXT:    br i1 [[C:%.*]], label [[L1:%.*]], label [[L3:%.*]]
+; CHECK:       l1:
+; CHECK-NEXT:    [[A1:%.*]] = call i8* @llvm.strip.invariant.group.p0i8(i8* [[A:%.*]])
+; CHECK-NEXT:    [[B1:%.*]] = call i8* @llvm.strip.invariant.group.p0i8(i8* [[B:%.*]])
+; CHECK-NEXT:    [[I:%.*]] = icmp eq i8* [[A1]], [[B1]]
+; CHECK-NEXT:    br i1 [[I]], label [[L2:%.*]], label [[L3]]
+; CHECK:       l2:
+; CHECK-NEXT:    call void @g1()
+; CHECK-NEXT:    br label [[RET:%.*]]
+; CHECK:       l3:
+; CHECK-NEXT:    call void @g2()
+; CHECK-NEXT:    br label [[RET]]
+; CHECK:       ret:
+; CHECK-NEXT:    ret void
+;
+  br i1 %c, label %l1, label %l3
+l1:
+  %a1 = call i8* @llvm.strip.invariant.group.p0i8(i8* %a)
+  %b1 = call i8* @llvm.strip.invariant.group.p0i8(i8* %b)
+  %i = icmp eq i8* %a1, %b1
+  br i1 %i, label %l2, label %l3
+l2:
+  call void @g1()
+  br label %ret
+l3:
+  call void @g2()
+  br label %ret
+ret:
+  ret void
+}
Index: llvm/lib/Transforms/Utils/SimplifyCFG.cpp
===================================================================
--- llvm/lib/Transforms/Utils/SimplifyCFG.cpp
+++ llvm/lib/Transforms/Utils/SimplifyCFG.cpp
@@ -3232,6 +3232,8 @@
     // I must be safe to execute unconditionally.
     if (!isSafeToSpeculativelyExecute(&I))
       return false;
+    if (TTI && TTI->getUserCost(&I, CostKind) == TargetTransformInfo::TCC_Free)
+      continue;
 
     // Account for the cost of duplicating this instruction into each
     // predecessor.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D108837.369162.patch
Type: text/x-patch
Size: 2062 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210827/cc1deba0/attachment.bin>


More information about the llvm-commits mailing list