diff options
author | James Molloy <james.molloy@arm.com> | 2015-11-12 10:55:20 +0000 |
---|---|---|
committer | James Molloy <james.molloy@arm.com> | 2015-11-12 10:55:20 +0000 |
commit | 7e9bdd5d010b0378e3479d434bd2a3a359ff226d (patch) | |
tree | dc0f77dda486e0f67158886c5c3bfad10ef04b57 /llvm/test/Transforms/FunctionAttrs | |
parent | ea4282d3369bad05ee17f9159d9ab22316318ebd (diff) | |
download | bcm5719-llvm-7e9bdd5d010b0378e3479d434bd2a3a359ff226d.tar.gz bcm5719-llvm-7e9bdd5d010b0378e3479d434bd2a3a359ff226d.zip |
Revert "Revert "[FunctionAttrs] Identify norecurse functions""
This reapplies this patch, with test fixes.
llvm-svn: 252871
Diffstat (limited to 'llvm/test/Transforms/FunctionAttrs')
5 files changed, 69 insertions, 7 deletions
diff --git a/llvm/test/Transforms/FunctionAttrs/2008-09-03-ReadNone.ll b/llvm/test/Transforms/FunctionAttrs/2008-09-03-ReadNone.ll index ca05d63743b..b62698a776f 100644 --- a/llvm/test/Transforms/FunctionAttrs/2008-09-03-ReadNone.ll +++ b/llvm/test/Transforms/FunctionAttrs/2008-09-03-ReadNone.ll @@ -10,15 +10,16 @@ define i32 @f() { ret i32 %tmp } -; CHECK: define i32 @g() #0 +; CHECK: define i32 @g() #1 define i32 @g() readonly { ret i32 0 } -; CHECK: define i32 @h() #0 +; CHECK: define i32 @h() #1 define i32 @h() readnone { %tmp = load i32, i32* @x ; <i32> [#uses=1] ret i32 %tmp } ; CHECK: attributes #0 = { readnone } +; CHECK: attributes #1 = { norecurse readnone } diff --git a/llvm/test/Transforms/FunctionAttrs/2010-10-30-volatile.ll b/llvm/test/Transforms/FunctionAttrs/2010-10-30-volatile.ll index 1a64a839380..23bb18e92b4 100644 --- a/llvm/test/Transforms/FunctionAttrs/2010-10-30-volatile.ll +++ b/llvm/test/Transforms/FunctionAttrs/2010-10-30-volatile.ll @@ -4,7 +4,9 @@ @g = constant i32 1 define void @foo() { -; CHECK: void @foo() { +; CHECK: void @foo() #0 { %tmp = load volatile i32, i32* @g ret void } + +; CHECK: attributes #0 = { norecurse } diff --git a/llvm/test/Transforms/FunctionAttrs/atomic.ll b/llvm/test/Transforms/FunctionAttrs/atomic.ll index bb867011cc2..dd915a6027f 100644 --- a/llvm/test/Transforms/FunctionAttrs/atomic.ll +++ b/llvm/test/Transforms/FunctionAttrs/atomic.ll @@ -19,5 +19,5 @@ entry: ret i32 %r } -; CHECK: attributes #0 = { readnone ssp uwtable } -; CHECK: attributes #1 = { ssp uwtable } +; CHECK: attributes #0 = { norecurse readnone ssp uwtable } +; CHECK: attributes #1 = { norecurse ssp uwtable } diff --git a/llvm/test/Transforms/FunctionAttrs/norecurse.ll b/llvm/test/Transforms/FunctionAttrs/norecurse.ll new file mode 100644 index 00000000000..47481191d27 --- /dev/null +++ b/llvm/test/Transforms/FunctionAttrs/norecurse.ll @@ -0,0 +1,57 @@ +; RUN: opt < %s -basicaa -functionattrs -S | FileCheck %s + +; CHECK: define i32 @leaf() #0 +define i32 @leaf() { + ret i32 1 +} + +; CHECK: define i32 @self_rec() #1 +define i32 @self_rec() { + %a = call i32 @self_rec() + ret i32 4 +} + +; CHECK: define i32 @indirect_rec() #1 +define i32 @indirect_rec() { + %a = call i32 @indirect_rec2() + ret i32 %a +} +; CHECK: define i32 @indirect_rec2() #1 +define i32 @indirect_rec2() { + %a = call i32 @indirect_rec() + ret i32 %a +} + +; CHECK: define i32 @extern() #1 +define i32 @extern() { + %a = call i32 @k() + ret i32 %a +} +declare i32 @k() readnone + +; CHECK: define internal i32 @called_by_norecurse() #0 +define internal i32 @called_by_norecurse() { + %a = call i32 @k() + ret i32 %a +} +define void @m() norecurse { + %a = call i32 @called_by_norecurse() + ret void +} + +; CHECK: define internal i32 @called_by_norecurse_indirectly() #0 +define internal i32 @called_by_norecurse_indirectly() { + %a = call i32 @k() + ret i32 %a +} +define internal void @o() { + %a = call i32 @called_by_norecurse_indirectly() + ret void +} +define void @p() norecurse { + call void @o() + ret void +} + +; CHECK: attributes #0 = { norecurse readnone } +; CHECK: attributes #1 = { readnone } diff --git a/llvm/test/Transforms/FunctionAttrs/optnone.ll b/llvm/test/Transforms/FunctionAttrs/optnone.ll index 7694bfe13aa..441ff4da65e 100644 --- a/llvm/test/Transforms/FunctionAttrs/optnone.ll +++ b/llvm/test/Transforms/FunctionAttrs/optnone.ll @@ -16,9 +16,11 @@ define void @test_optnone(i8* %p) noinline optnone { declare i8 @strlen(i8*) noinline optnone ; CHECK-LABEL: @strlen -; CHECK: (i8*) #1 +; CHECK: (i8*) #2 ; CHECK-LABEL: attributes #0 -; CHECK: = { readnone } +; CHECK: = { norecurse readnone } ; CHECK-LABEL: attributes #1 +; CHECK: = { noinline norecurse optnone } +; CHECK-LABEL: attributes #2 ; CHECK: = { noinline optnone } |