Inline assembly is scary but we need to support it for the OpenMP GPU device runtime. The new assumption expresses the fact that it may not have call semantics, that is, it will not call another function but simply perform an operation or side-effect. This is important for reachability in the presence of inline assembly. Differential Revision: https://reviews.llvm.org/D109986
50 lines
2.5 KiB
LLVM
50 lines
2.5 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals
|
|
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
|
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
|
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
|
|
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
|
|
|
|
define void @non_recursive_asm_fn() #0 {
|
|
; CHECK: Function Attrs: norecurse
|
|
; CHECK-LABEL: define {{[^@]+}}@non_recursive_asm_fn
|
|
; CHECK-SAME: () #[[ATTR0:[0-9]+]] {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: call void asm sideeffect "barrier.sync $0
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
call void asm sideeffect "barrier.sync $0;", "r,~{memory},~{dirflag},~{fpsr},~{flags}"(i32 1)
|
|
ret void
|
|
}
|
|
|
|
define void @non_recursive_asm_cs() {
|
|
; CHECK: Function Attrs: norecurse
|
|
; CHECK-LABEL: define {{[^@]+}}@non_recursive_asm_cs
|
|
; CHECK-SAME: () #[[ATTR1:[0-9]+]] {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: call void asm sideeffect "barrier.sync $0
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
call void asm sideeffect "barrier.sync $0;", "r,~{memory},~{dirflag},~{fpsr},~{flags}"(i32 1) #0
|
|
ret void
|
|
}
|
|
|
|
define void @recursive_asm() {
|
|
; CHECK-LABEL: define {{[^@]+}}@recursive_asm() {
|
|
; CHECK-NEXT: entry:
|
|
; CHECK-NEXT: call void asm sideeffect "barrier.sync $0
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
entry:
|
|
call void asm sideeffect "barrier.sync $0;", "r,~{memory},~{dirflag},~{fpsr},~{flags}"(i32 1)
|
|
ret void
|
|
}
|
|
|
|
attributes #0 = { "llvm.assume"="ompx_no_call_asm" }
|
|
;.
|
|
; CHECK: attributes #[[ATTR0]] = { norecurse "llvm.assume"="ompx_no_call_asm" }
|
|
; CHECK: attributes #[[ATTR1]] = { norecurse }
|
|
; CHECK: attributes #[[ATTR2:[0-9]+]] = { "llvm.assume"="ompx_no_call_asm" }
|
|
;.
|