summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/FunctionAttrs/norecurse.ll
diff options
context:
space:
mode:
authorJames Molloy <james.molloy@arm.com>2015-11-12 10:55:20 +0000
committerJames Molloy <james.molloy@arm.com>2015-11-12 10:55:20 +0000
commit7e9bdd5d010b0378e3479d434bd2a3a359ff226d (patch)
treedc0f77dda486e0f67158886c5c3bfad10ef04b57 /llvm/test/Transforms/FunctionAttrs/norecurse.ll
parentea4282d3369bad05ee17f9159d9ab22316318ebd (diff)
downloadbcm5719-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.ll57
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 }
OpenPOWER on IntegriCloud