mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-21 20:12:56 +02:00
4da975f03a
A function can be marked as norecurse if: * The SCC to which it belongs has cardinality 1; and either a) It does not call any non-norecurse function. This includes self-recursion; or b) It only has one callsite and the function that callsite is within is marked norecurse. a) is best propagated bottom-up and b) is best propagated top-down. We build up the norecurse attributes bottom-up using the existing SCC pass, and mark functions with no obvious recursion (but not provably norecurse) to sweep later, top-down. llvm-svn: 252862
27 lines
579 B
LLVM
27 lines
579 B
LLVM
; RUN: opt < %s -functionattrs -S | FileCheck %s
|
|
|
|
@x = global i32 0
|
|
|
|
define void @test_opt(i8* %p) {
|
|
; CHECK-LABEL: @test_opt
|
|
; CHECK: (i8* nocapture readnone %p) #0 {
|
|
ret void
|
|
}
|
|
|
|
define void @test_optnone(i8* %p) noinline optnone {
|
|
; CHECK-LABEL: @test_optnone
|
|
; CHECK: (i8* %p) #1 {
|
|
ret void
|
|
}
|
|
|
|
declare i8 @strlen(i8*) noinline optnone
|
|
; CHECK-LABEL: @strlen
|
|
; CHECK: (i8*) #2
|
|
|
|
; CHECK-LABEL: attributes #0
|
|
; CHECK: = { norecurse readnone }
|
|
; CHECK-LABEL: attributes #1
|
|
; CHECK: = { noinline norecurse optnone }
|
|
; CHECK-LABEL: attributes #2
|
|
; CHECK: = { noinline optnone }
|