mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
57004ae3ac
This index record the position for each metadata record in the bitcode, so that the reader will be able to lazy-load on demand each individual record. We also make sure that every abbrev is emitted upfront so that the block can be skipped while reading. I don't plan to commit this before having the reader counterpart, but I figured this can be reviewed mostly independently. Recommit r290684 (was reverted in r290686 because a test was broken) after adding a threshold to avoid emitting the index when unnecessary (little amount of metadata). This optimization "hides" a limitation of the ability to backpatch in the bitstream: we can only backpatch safely when the position has been flushed. So if we emit an index for one metadata, it is possible that (part of) the offset placeholder hasn't been flushed and the backpatch will fail. Differential Revision: https://reviews.llvm.org/D28083 llvm-svn: 290690
34 lines
1.3 KiB
LLVM
34 lines
1.3 KiB
LLVM
; RUN: llvm-as <%s -bitcode-mdindex-threshold=0 | llvm-bcanalyzer -dump | FileCheck %s
|
|
; Check that distinct nodes break uniquing cycles, so that uniqued subgraphs
|
|
; are always in post-order.
|
|
;
|
|
; It may not be immediately obvious why this is an interesting graph. There
|
|
; are three nodes in a cycle, and one of them (!1) is distinct. Because the
|
|
; entry point is !2, a naive post-order traversal would give !3, !1, !2; but
|
|
; this means when !3 is parsed the reader will need a forward reference for !2.
|
|
; Forward references for uniqued node operands are expensive, whereas they're
|
|
; cheap for distinct node operands. If the distinct node is emitted first, the
|
|
; uniqued nodes don't need any forward references at all.
|
|
|
|
; Nodes in this testcase are numbered to match how they are referenced in
|
|
; bitcode. !3 is referenced as opN=3.
|
|
|
|
; CHECK: <DISTINCT_NODE op0=3/>
|
|
!1 = distinct !{!3}
|
|
|
|
; CHECK-NEXT: <NODE op0=1/>
|
|
!2 = !{!1}
|
|
|
|
; CHECK-NEXT: <NODE op0=2/>
|
|
!3 = !{!2}
|
|
|
|
; Before the named records we emit the index containing the position of the
|
|
; previously emitted records
|
|
; CHECK-NEXT: <INDEX {{.*}} (offset match)
|
|
|
|
; Note: named metadata nodes are not cannot reference null so their operands
|
|
; are numbered off-by-one.
|
|
; CHECK-NEXT: <NAME
|
|
; CHECK-NEXT: <NAMED_NODE op0=1/>
|
|
!named = !{!2}
|