Matt Arsenault bc3e492323 llvm-reduce: Reduce ifuncs
Reduce by calling the resolver function at the use site, and inserting
an indirect call. Try to delete if there are no uses left over.

We should also probably try to do something about constantexpr uses;
perhaps treat them like aliases.
2023-01-17 22:33:57 -05:00

69 lines
2.8 KiB
LLVM

; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=ifuncs --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t.0
; RUN: FileCheck --check-prefixes=CHECK-FINAL-IFUNCS,ALL --input-file=%t.0 %s
; RUN: llvm-reduce --abort-on-invalid-reduction --delta-passes=aliases,ifuncs --test FileCheck --test-arg --check-prefixes=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t.1
; RUN: FileCheck --check-prefixes=CHECK-FINAL-BOTH,ALL --input-file=%t.1 %s
; Check interaction of reductions between aliases and ifuncs
; Test ifunc to alias
; CHECK-INTERESTINGNESS: @ifunc0_kept =
; ALL: [[TABLE:@[0-9]+]] = internal global [2 x ptr] poison
; ALL: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 10, ptr [[CONSTRUCTOR:@[0-9]+]], ptr null }]
; CHECK-FINAL-IFUNCS: @resolver_alias = alias ptr (), ptr @resolver
; CHECK-FINAL-IFUNCS: @ifunc_alias = alias ptr (), ptr @resolver_alias
; CHECK-FINAL-IFUNCS: @alias_of_ifunc = alias float (i64), ptr @ifunc_def
; CHECK-FINAL-IFUNCS: @ifunc0_kept = ifunc float (i64), ptr @resolver_alias
; CHECK-FINAL-IFUNCS: @ifunc_def = ifunc float (i64), ptr @resolver
; CHECK-FINAL-BOTH-NOT: _alias
; CHECK-FINAL-BOTH-NOT: @ifunc
; CHECK-FINAL-BOTH: @ifunc0_kept = ifunc float (i64), ptr @resolver
; CHECK-FINAL-BOTH-NOT: _alias
; CHECK-FINAL-BOTH-NOT: @ifunc
define ptr @resolver() {
ret ptr inttoptr (i64 333 to ptr)
}
@resolver_alias = alias ptr (), ptr @resolver
@ifunc_alias = alias ptr (), ptr @resolver_alias
@ifunc0_kept = ifunc float (i64), ptr @resolver_alias
@ifunc1_removed = ifunc float (i64), ptr @resolver_alias
@ifunc_def = ifunc float (i64), ptr @resolver
@alias_of_ifunc = alias float (i64), ptr @ifunc_def
; ALL-LABEL: define float @call_ifunc_aliasee(i64 %arg) {
; ALL: %1 = load ptr, ptr [[TABLE]], align 8
; ALL: %call = call float %1(i64 %arg)
; ALL: ret float %call
define float @call_ifunc_aliasee(i64 %arg) {
%call = call float @ifunc1_removed(i64 %arg)
ret float %call
}
; ALL-LABEL: @call_alias_of_ifunc(
; CHECK-FINAL-IFUNCS: call float @alias_of_ifunc(
; CHECK-FINAL-BOTH-NEXT: %1 = load ptr, ptr getelementptr inbounds ([2 x ptr], ptr [[TABLE]], i32 0, i32 1), align 8
; CHECK-FINAL-BOTH-NEXT: %call = call float %1(i64 %arg)
; CHECK-FINAL-BOTH-NEXT: ret float %call
define float @call_alias_of_ifunc(i64 %arg) {
%call = call float @alias_of_ifunc(i64 %arg)
ret float %call
}
; CHECK-FINAL-BOTH: define internal void [[CONSTRUCTOR]]() {
; CHECK-FINAL-BOTH-NEXT: %1 = call ptr @resolver()
; CHECK-FINAL-BOTH-NEXT: store ptr %1, ptr [[TABLE]], align 8
; CHECK-FINAL-BOTH-NEXT: %2 = call ptr @resolver()
; CHECK-FINAL-BOTH-NEXT: store ptr %2, ptr getelementptr inbounds ([2 x ptr], ptr [[TABLE]], i32 0, i32 1), align 8
; CHECK-FINAL-BOTH-NEXT: ret void