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/norecurse.ll | |
| 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/norecurse.ll')
| -rw-r--r-- | llvm/test/Transforms/FunctionAttrs/norecurse.ll | 57 |
1 files changed, 57 insertions, 0 deletions
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 } |

