The current implementation of aliases tries to remove all the aliases in the module to prevent the generic version of `AsmPrinter` from emitting them incorrectly. Unfortunately, if the aliases are used this will fail. Instead let's override the function to print aliases directly. In addition, the declarations of the alias functions must occur before the uses. To fix this we emit alias declarations as part of `emitDeclarations` and only emit the `.alias` directives at the end (where we can assume the aliasee has also already been declared).
68 lines
1.6 KiB
LLVM
68 lines
1.6 KiB
LLVM
; RUN: llc < %s -march=nvptx64 -mcpu=sm_30 -mattr=+ptx64 | FileCheck %s
|
|
; RUN: %if ptxas %{ llc < %s -march=nvptx64 -mcpu=sm_30 -mattr=+ptx64 | %ptxas-verify %}
|
|
|
|
define i32 @a() { ret i32 0 }
|
|
@b = internal alias i32 (), ptr @a
|
|
@c = internal alias i32 (), ptr @a
|
|
@d = internal alias i32 (), ptr @c
|
|
|
|
define void @foo(i32 %0, ptr %1) { ret void }
|
|
@bar = alias i32 (), ptr @foo
|
|
|
|
define void @noreturn() #0 {
|
|
ret void
|
|
}
|
|
@noreturn_alias = alias i32 (), ptr @noreturn
|
|
|
|
define i32 @z() {
|
|
%val = call i32 @b()
|
|
ret i32 %val
|
|
}
|
|
|
|
|
|
attributes #0 = { noreturn }
|
|
|
|
; CHECK: .visible .func (.param .b32 func_retval0) b
|
|
; CHECK-NEXT: ()
|
|
; CHECK-NEXT: ;
|
|
|
|
; CHECK: .visible .func (.param .b32 func_retval0) c
|
|
; CHECK-NEXT: ()
|
|
; CHECK-NEXT: ;
|
|
|
|
; CHECK: .visible .func (.param .b32 func_retval0) d
|
|
; CHECK-NEXT: ()
|
|
; CHECK-NEXT: ;
|
|
|
|
; CHECK: .visible .func bar
|
|
; CHECK-NEXT: (
|
|
; CHECK-NEXT: .param .b32 foo_param_0,
|
|
; CHECK-NEXT: .param .b64 foo_param_1
|
|
; CHECK-NEXT: )
|
|
; CHECK-NEXT: ;
|
|
|
|
; CHECK: .visible .func noreturn_alias
|
|
; CHECK-NEXT: ()
|
|
; CHECK-NEXT: .noreturn;
|
|
|
|
; CHECK: .visible .func (.param .b32 func_retval0) a()
|
|
|
|
; CHECK: .visible .func foo(
|
|
; CHECK-NEXT: .param .b32 foo_param_0,
|
|
; CHECK-NEXT: .param .b64 foo_param_1
|
|
; CHECK-NEXT: )
|
|
|
|
; CHECK: .visible .func noreturn()
|
|
; CHECK-NEXT: .noreturn
|
|
|
|
; CHECK: .visible .func (.param .b32 func_retval0) z()
|
|
; CHECK: call.uni (retval0),
|
|
; CHECK-NEXT: b,
|
|
|
|
|
|
; CHECK: .alias b, a;
|
|
; CHECK: .alias c, a;
|
|
; CHECK: .alias d, a;
|
|
; CHECK: .alias bar, foo;
|
|
; CHECK: .alias noreturn_alias, noreturn;
|