When predicting use-list order, we visit functions in reverse order
followed by `GlobalValue`s and write out use-lists at the first
opportunity. In the reader, this will translate to *after* the last use
has been added.
For this to work, we actually need to descend into `GlobalValue`s.
Added a targeted test in `use-list-order.ll` and `RUN` lines to the
newly passing tests in `test/Bitcode`.
There are two remaining failures in `test/Bitcode`:
- blockaddress.ll: I haven't thought through how to model the way
block addresses change the order of use-lists (or how to work around
it).
- metadata-2.ll: There's an old-style `@llvm.used` global array here
that I suspect the .ll parser isn't upgrading properly. When it
round-trips through bitcode, the .bc reader *does* upgrade it, so
the extra variable (`i8* null`) has an extra use, and the shuffle
vector doesn't match.
I think the fix is to upgrade old-style global arrays (or reject
them?) in the .ll parser.
This is part of PR5680.
llvm-svn: 214321
35 lines
998 B
LLVM
35 lines
998 B
LLVM
; RUN: llvm-dis < %s.bc| FileCheck %s
|
|
; RUN: verify-uselistorder < %s.bc -preserve-bc-use-list-order -num-shuffles=5
|
|
|
|
; vaArgIntrinsic.3.2.ll.bc was generated by passing this file to llvm-as-3.2.
|
|
; The test checks that LLVM does not misread variable argument intrinsic instructions
|
|
; of older bitcode files.
|
|
|
|
define i32 @varArgIntrinsic(i32 %X, ...) {
|
|
|
|
%ap = alloca i8*
|
|
%ap2 = bitcast i8** %ap to i8*
|
|
|
|
; CHECK: call void @llvm.va_start(i8* %ap2)
|
|
call void @llvm.va_start(i8* %ap2)
|
|
|
|
; CHECK-NEXT: %tmp = va_arg i8** %ap, i32
|
|
%tmp = va_arg i8** %ap, i32
|
|
|
|
%aq = alloca i8*
|
|
%aq2 = bitcast i8** %aq to i8*
|
|
|
|
; CHECK: call void @llvm.va_copy(i8* %aq2, i8* %ap2)
|
|
call void @llvm.va_copy(i8* %aq2, i8* %ap2)
|
|
; CHECK-NEXT: call void @llvm.va_end(i8* %aq2)
|
|
call void @llvm.va_end(i8* %aq2)
|
|
|
|
; CHECK-NEXT: call void @llvm.va_end(i8* %ap2)
|
|
call void @llvm.va_end(i8* %ap2)
|
|
ret i32 %tmp
|
|
}
|
|
|
|
declare void @llvm.va_start(i8*)
|
|
declare void @llvm.va_copy(i8*, i8*)
|
|
declare void @llvm.va_end(i8*)
|