[llvm-branch-commits] [BOLT][BAT] Add entries for deleted basic blocks (PR #91906)

2024-05-12 Thread Amir Ayupov via llvm-branch-commits

https://github.com/aaupov updated 
https://github.com/llvm/llvm-project/pull/91906


___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [BOLT][BAT] Add entries for deleted basic blocks (PR #91906)

2024-05-12 Thread Amir Ayupov via llvm-branch-commits

https://github.com/aaupov updated 
https://github.com/llvm/llvm-project/pull/91906


___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [BOLT][BAT] Add entries for deleted basic blocks (PR #91906)

2024-05-12 Thread via llvm-branch-commits

llvmbot wrote:




@llvm/pr-subscribers-bolt

Author: Amir Ayupov (aaupov)


Changes

Deleted basic blocks are required for correct mapping of branches
modified by SCTC.

Test Plan: updated bb-with-two-tail-calls.s


---
Full diff: https://github.com/llvm/llvm-project/pull/91906.diff


4 Files Affected:

- (modified) bolt/docs/BAT.md (+5) 
- (modified) bolt/include/bolt/Profile/BoltAddressTranslation.h (+1) 
- (modified) bolt/lib/Profile/BoltAddressTranslation.cpp (+13) 
- (modified) bolt/test/X86/bb-with-two-tail-calls.s (+9) 


``diff
diff --git a/bolt/docs/BAT.md b/bolt/docs/BAT.md
index 7ffb5d7c00816..817ad288aa34b 100644
--- a/bolt/docs/BAT.md
+++ b/bolt/docs/BAT.md
@@ -106,9 +106,14 @@ equals output offset.
 `BRANCHENTRY` bit denotes whether a given offset pair is a control flow source
 (branch or call instruction). If not set, it signifies a control flow target
 (basic block offset).
+
 `InputAddr` is omitted for equal offsets in input and output function. In this
 case, `BRANCHENTRY` bits are encoded separately in a `BranchEntries` bitvector.
 
+Deleted basic blocks are emitted as having `OutputOffset` equal to the size of
+the function. They don't affect address translation and only participate in
+input basic block mapping.
+
 ### Secondary Entry Points table
 The table is emitted for hot fragments only. It contains `NumSecEntryPoints`
 offsets denoting secondary entry points, delta encoded, implicitly starting at 
zero.
diff --git a/bolt/include/bolt/Profile/BoltAddressTranslation.h 
b/bolt/include/bolt/Profile/BoltAddressTranslation.h
index 68b993ee363cc..16fe0442f10a5 100644
--- a/bolt/include/bolt/Profile/BoltAddressTranslation.h
+++ b/bolt/include/bolt/Profile/BoltAddressTranslation.h
@@ -217,6 +217,7 @@ class BoltAddressTranslation {
 auto begin() const { return Map.begin(); }
 auto end() const { return Map.end(); }
 auto upper_bound(uint32_t Offset) const { return Map.upper_bound(Offset); }
+auto size() const { return Map.size(); }
   };
 
   /// Map function output address to its hash and basic blocks hash map.
diff --git a/bolt/lib/Profile/BoltAddressTranslation.cpp 
b/bolt/lib/Profile/BoltAddressTranslation.cpp
index 7cfb9c132c2c6..724b348c7845e 100644
--- a/bolt/lib/Profile/BoltAddressTranslation.cpp
+++ b/bolt/lib/Profile/BoltAddressTranslation.cpp
@@ -108,6 +108,19 @@ void BoltAddressTranslation::write(const BinaryContext 
, raw_ostream ) {
 for (const BinaryBasicBlock *const BB :
  Function.getLayout().getMainFragment())
   writeEntriesForBB(Map, *BB, InputAddress, OutputAddress);
+// Add entries for deleted blocks. They are still required for correct BB
+// mapping of branches modified by SCTC. By convention, they would have the
+// end of the function as output address.
+const BBHashMapTy  = getBBHashMap(InputAddress);
+if (BBHashMap.size() != Function.size()) {
+  const uint64_t EndOffset = Function.getOutputSize();
+  std::unordered_set MappedInputOffsets;
+  for (const BinaryBasicBlock  : Function)
+MappedInputOffsets.emplace(BB.getInputOffset());
+  for (const auto &[InputOffset, _] : BBHashMap)
+if (!llvm::is_contained(MappedInputOffsets, InputOffset))
+  Map[EndOffset] = InputOffset << 1;
+}
 Maps.emplace(Function.getOutputAddress(), std::move(Map));
 ReverseMap.emplace(OutputAddress, InputAddress);
 
diff --git a/bolt/test/X86/bb-with-two-tail-calls.s 
b/bolt/test/X86/bb-with-two-tail-calls.s
index bb2b0cd4cc23a..c0b01e1894a49 100644
--- a/bolt/test/X86/bb-with-two-tail-calls.s
+++ b/bolt/test/X86/bb-with-two-tail-calls.s
@@ -10,11 +10,20 @@
 # RUN: %clang %cflags %t.o -o %t.exe -Wl,-q -nostdlib
 # RUN: llvm-bolt %t.exe -o %t.out --data %t.fdata --lite=0 --dyno-stats \
 # RUN:--print-sctc --print-only=_start -enable-bat 2>&1 | FileCheck %s
+# RUN: llvm-objdump --syms %t.out | FileCheck %s --check-prefix=CHECK-NM
+# RUN: llvm-bat-dump %t.out --dump-all | FileCheck %s --check-prefix=CHECK-BAT
+
 # CHECK-NOT: Assertion `BranchInfo.size() == 2 && "could only be called for 
blocks with 2 successors"' failed.
 # Two tail calls in the same basic block after SCTC:
 # CHECK: {{.*}}:   ja  {{.*}} # TAILCALL # Offset: 7 # 
CTCTakenCount: 4
 # CHECK-NEXT:{{.*}}:   jmp {{.*}} # TAILCALL # Offset: 12
 
+# Confirm that a deleted basic block is emitted at function end offset (0xe)
+# CHECK-NM: 0060 g   .text  000e _start
+# CHECK-BAT: Function Address: 0x60, hash: 0xf8bf620b266cdc1b
+# CHECK-BAT: 0xe -> 0xc hash: 0x823623240f000c
+# CHECK-BAT: NumBlocks: 5
+
   .globl _start
 _start:
 je x

``




https://github.com/llvm/llvm-project/pull/91906
___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits


[llvm-branch-commits] [BOLT][BAT] Add entries for deleted basic blocks (PR #91906)

2024-05-12 Thread Amir Ayupov via llvm-branch-commits

https://github.com/aaupov created 
https://github.com/llvm/llvm-project/pull/91906

Deleted basic blocks are required for correct mapping of branches
modified by SCTC.

Test Plan: updated bb-with-two-tail-calls.s



___
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits