llvm-6502/test/Bitcode/blockaddress.ll
Duncan P. N. Exon Smith 1d8c9d95bf BitcodeReader: Only create one basic block for each blockaddress
Block address forward-references are implemented by creating a
`BasicBlock` ahead of time that gets inserted in the `Function` when
it's eventually encountered.

However, if the same blockaddress was used in two separate functions
that were parsed *before* the referenced function (and the blockaddress
was never used at global scope), two separate basic blocks would get
created, one of which would be forgotten creating invalid IR.

This commit changes the forward-reference logic to create only one basic
block (and always return the same blockaddress).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@215805 91177308-0d34-0410-b5e6-96231b3b80d8
2014-08-16 01:54:37 +00:00

61 lines
1.1 KiB
LLVM

; RUN: llvm-as < %s | llvm-dis | FileCheck %s
; RUN: verify-uselistorder < %s -preserve-bc-use-list-order
; PR9857
define void @f(i8** nocapture %ptr1) {
; CHECK: define void @f
entry:
br label %here.i
here.i:
store i8* blockaddress(@doit, %here), i8** %ptr1, align 8
; CHECK: blockaddress(@doit, %here)
br label %doit.exit
doit.exit:
ret void
}
define void @doit(i8** nocapture %pptr) {
; CHECK: define void @doit
entry:
br label %here
here:
store i8* blockaddress(@doit, %here), i8** %pptr, align 8
; CHECK: blockaddress(@doit, %here)
br label %end
end:
ret void
}
; PR13895
define void @doitagain(i8** nocapture %pptr) {
; CHECK: define void @doitagain
entry:
br label %here
here:
store i8* blockaddress(@doit, %here), i8** %pptr, align 8
; CHECK: blockaddress(@doit, %here)
br label %end
end:
ret void
}
; Check a blockaddress taken in two separate functions before the referenced
; function.
define i8* @take1() {
ret i8* blockaddress(@taken, %bb)
}
define i8* @take2() {
ret i8* blockaddress(@taken, %bb)
}
define void @taken() {
unreachable
bb:
unreachable
}