llvm-project/llvm/test/Bitcode/case-ranges-3.3.ll
Nikita Popov e3a9f68e2c [Bitcode] Fully support opaque pointer auto upgrade
This completes the propagation of type IDs through bitcode reading,
and switches remaining uses of getPointerElementType() to use
contained type IDs.

The main new thing here is that sometimes we need to create a type
ID for a type that was not explicitly encoded in bitcode (or we
don't know its ID at the current point). For such types we create a
"virtual" type ID, which is cached based on the type and the
contained type IDs. Luckily, we generally only need zero or one
contained type IDs, and in the one case where we need two, we can
get away with not including it in the cache key.

With this change, we pass the entirety of llvm-test-suite at O3
with opaque pointers.

Differential Revision: https://reviews.llvm.org/D120471
2022-03-04 10:23:06 +01:00

70 lines
1.5 KiB
LLVM

; RUN: llvm-dis -opaque-pointers=0 < %s.bc| FileCheck %s
; RUN: llvm-dis -opaque-pointers=1 < %s.bc| FileCheck %s
; RUN: verify-uselistorder < %s.bc
; case-ranges.ll.bc was generated by passing this file to llvm-as from the 3.3
; release of LLVM. This tests that the bitcode for switches from that release
; can still be read.
define i32 @foo(i32 %x) nounwind ssp uwtable {
; CHECK: define i32 @foo
%1 = alloca i32, align 4
%2 = alloca i32, align 4
store i32 %x, i32* %2, align 4
%3 = load i32, i32* %2, align 4
switch i32 %3, label %9 [
; CHECK: switch i32 %3, label %9
i32 -3, label %4
; CHECK-NEXT: i32 -3, label %4
i32 -2, label %4
; CHECK-NEXT: i32 -2, label %4
i32 -1, label %4
; CHECK-NEXT: i32 -1, label %4
i32 0, label %4
; CHECK-NEXT: i32 0, label %4
i32 1, label %4
; CHECK-NEXT: i32 1, label %4
i32 2, label %4
; CHECK-NEXT: i32 2, label %4
i32 4, label %5
; CHECK-NEXT: i32 4, label %5
i32 5, label %6
; CHECK-NEXT: i32 5, label %6
i32 6, label %7
; CHECK-NEXT: i32 6, label %7
i32 7, label %8
; CHECK-NEXT: i32 7, label %8
]
; <label>:4
store i32 -1, i32* %1
br label %11
; <label>:5
store i32 2, i32* %1
br label %11
; <label>:6
store i32 1, i32* %1
br label %11
; <label>:7
store i32 4, i32* %1
br label %11
; <label>:8
store i32 3, i32* %1
br label %11
; <label>:9
br label %10
; <label>:10
store i32 0, i32* %1
br label %11
; <label>:11
%12 = load i32, i32* %1
ret i32 %12
}