
https://github.com/llvm/llvm-project/pull/78171 added support for non-consecutive local value numbers. This extends the support for global value numbers (for globals and functions). This means that it is now possible to delete an unnamed global definition/declaration without breaking the IR. This is a lot less common than unnamed local values, but it seems like something we should support for consistency. (Unnamed globals are used a lot in Rust though.)
48 lines
1021 B
LLVM
48 lines
1021 B
LLVM
; RUN: opt -S < %s | FileCheck %s
|
|
|
|
@5 = global i8 0
|
|
@"" = global i8 1
|
|
@10 = alias i8, ptr @5
|
|
@15 = ifunc ptr(), ptr @20
|
|
|
|
define ptr @20() {
|
|
ret ptr null
|
|
}
|
|
|
|
declare void @25()
|
|
|
|
declare ptr @""(ptr)
|
|
|
|
define void @test(ptr %p) {
|
|
store ptr @5, ptr %p
|
|
store ptr @6, ptr %p
|
|
store ptr @10, ptr %p
|
|
store ptr @15, ptr %p
|
|
store ptr @20, ptr %p
|
|
store ptr @25, ptr %p
|
|
store ptr @26, ptr %p
|
|
ret void
|
|
}
|
|
|
|
; CHECK: @0 = global i8 0
|
|
; CHECK: @1 = global i8 1
|
|
; CHECK: @2 = alias i8, ptr @0
|
|
; CHECK: @3 = ifunc ptr (), ptr @4
|
|
|
|
; CHECK-LABEL: define ptr @4() {
|
|
; CHECK-NEXT: ret ptr null
|
|
|
|
; CHECK: declare void @5()
|
|
|
|
; CHECK: declare ptr @6(ptr)
|
|
|
|
; CHECK-LABEL: define void @test(ptr %p) {
|
|
; CHECK-NEXT: store ptr @0, ptr %p, align 8
|
|
; CHECK-NEXT: store ptr @1, ptr %p, align 8
|
|
; CHECK-NEXT: store ptr @2, ptr %p, align 8
|
|
; CHECK-NEXT: store ptr @3, ptr %p, align 8
|
|
; CHECK-NEXT: store ptr @4, ptr %p, align 8
|
|
; CHECK-NEXT: store ptr @5, ptr %p, align 8
|
|
; CHECK-NEXT: store ptr @6, ptr %p, align 8
|
|
; CHECK-NEXT: ret void
|