aboutsummaryrefslogtreecommitdiff
path: root/test/Analysis/LazyCallGraph/basic.ll
diff options
context:
space:
mode:
Diffstat (limited to 'test/Analysis/LazyCallGraph/basic.ll')
-rw-r--r--test/Analysis/LazyCallGraph/basic.ll281
1 files changed, 224 insertions, 57 deletions
diff --git a/test/Analysis/LazyCallGraph/basic.ll b/test/Analysis/LazyCallGraph/basic.ll
index fce453bc15de..0d05a7a6514e 100644
--- a/test/Analysis/LazyCallGraph/basic.ll
+++ b/test/Analysis/LazyCallGraph/basic.ll
@@ -1,9 +1,9 @@
-; RUN: opt -disable-output -passes=print-cg %s 2>&1 | FileCheck %s
+; RUN: opt -disable-output -passes=print-lcg %s 2>&1 | FileCheck %s
;
; Basic validation of the call graph analysis used in the new pass manager.
define void @f() {
-; CHECK-LABEL: Call edges in function: f
+; CHECK-LABEL: Edges in function: f
; CHECK-NOT: ->
entry:
@@ -51,8 +51,8 @@ define void @f12() {
declare i32 @__gxx_personality_v0(...)
define void @test0() {
-; CHECK-LABEL: Call edges in function: test0
-; CHECK-NEXT: -> f
+; CHECK-LABEL: Edges in function: test0
+; CHECK-NEXT: call -> f
; CHECK-NOT: ->
entry:
@@ -64,19 +64,19 @@ entry:
}
define void ()* @test1(void ()** %x) personality i32 (...)* @__gxx_personality_v0 {
-; CHECK-LABEL: Call edges in function: test1
-; CHECK-NEXT: -> f12
-; CHECK-NEXT: -> f11
-; CHECK-NEXT: -> f10
-; CHECK-NEXT: -> f7
-; CHECK-NEXT: -> f9
-; CHECK-NEXT: -> f8
-; CHECK-NEXT: -> f6
-; CHECK-NEXT: -> f5
-; CHECK-NEXT: -> f4
-; CHECK-NEXT: -> f3
-; CHECK-NEXT: -> f2
-; CHECK-NEXT: -> f1
+; CHECK-LABEL: Edges in function: test1
+; CHECK-NEXT: call -> f6
+; CHECK-NEXT: call -> f10
+; CHECK-NEXT: ref -> f12
+; CHECK-NEXT: ref -> f11
+; CHECK-NEXT: ref -> f7
+; CHECK-NEXT: ref -> f9
+; CHECK-NEXT: ref -> f8
+; CHECK-NEXT: ref -> f5
+; CHECK-NEXT: ref -> f4
+; CHECK-NEXT: ref -> f3
+; CHECK-NEXT: ref -> f2
+; CHECK-NEXT: ref -> f1
; CHECK-NOT: ->
entry:
@@ -108,14 +108,14 @@ unwind:
@h = constant void ()* @f7
define void @test2() {
-; CHECK-LABEL: Call edges in function: test2
-; CHECK-NEXT: -> f7
-; CHECK-NEXT: -> f6
-; CHECK-NEXT: -> f5
-; CHECK-NEXT: -> f4
-; CHECK-NEXT: -> f3
-; CHECK-NEXT: -> f2
-; CHECK-NEXT: -> f1
+; CHECK-LABEL: Edges in function: test2
+; CHECK-NEXT: ref -> f7
+; CHECK-NEXT: ref -> f6
+; CHECK-NEXT: ref -> f5
+; CHECK-NEXT: ref -> f4
+; CHECK-NEXT: ref -> f3
+; CHECK-NEXT: ref -> f2
+; CHECK-NEXT: ref -> f1
; CHECK-NOT: ->
load i8*, i8** bitcast (void ()** @g to i8**)
@@ -125,52 +125,219 @@ define void @test2() {
ret void
}
+@test3_ptr = external global void ()*
+
+define void @test3_aa1() {
+; CHECK-LABEL: Edges in function: test3_aa1
+; CHECK-NEXT: call -> test3_aa2
+; CHECK-NEXT: ref -> test3_ab1
+; CHECK-NOT: ->
+
+entry:
+ call void @test3_aa2()
+ store void ()* @test3_ab1, void ()** @test3_ptr
+ ret void
+}
+
+define void @test3_aa2() {
+; CHECK-LABEL: Edges in function: test3_aa2
+; CHECK-NEXT: call -> test3_aa1
+; CHECK-NEXT: call -> test3_ab2
+; CHECK-NOT: ->
+
+entry:
+ call void @test3_aa1()
+ call void @test3_ab2()
+ ret void
+}
+
+define void @test3_ab1() {
+; CHECK-LABEL: Edges in function: test3_ab1
+; CHECK-NEXT: call -> test3_ab2
+; CHECK-NEXT: call -> test3_ac1
+; CHECK-NOT: ->
+
+entry:
+ call void @test3_ab2()
+ call void @test3_ac1()
+ ret void
+}
+
+define void @test3_ab2() {
+; CHECK-LABEL: Edges in function: test3_ab2
+; CHECK-NEXT: call -> test3_ab1
+; CHECK-NEXT: call -> test3_ba1
+; CHECK-NOT: ->
+
+entry:
+ call void @test3_ab1()
+ call void @test3_ba1()
+ ret void
+}
+
+define void @test3_ac1() {
+; CHECK-LABEL: Edges in function: test3_ac1
+; CHECK-NEXT: call -> test3_ac2
+; CHECK-NEXT: ref -> test3_aa2
+; CHECK-NOT: ->
+
+entry:
+ call void @test3_ac2()
+ store void ()* @test3_aa2, void ()** @test3_ptr
+ ret void
+}
+
+define void @test3_ac2() {
+; CHECK-LABEL: Edges in function: test3_ac2
+; CHECK-NEXT: call -> test3_ac1
+; CHECK-NEXT: ref -> test3_ba1
+; CHECK-NOT: ->
+
+entry:
+ call void @test3_ac1()
+ store void ()* @test3_ba1, void ()** @test3_ptr
+ ret void
+}
+
+define void @test3_ba1() {
+; CHECK-LABEL: Edges in function: test3_ba1
+; CHECK-NEXT: call -> test3_bb1
+; CHECK-NEXT: ref -> test3_ca1
+; CHECK-NOT: ->
+
+entry:
+ call void @test3_bb1()
+ store void ()* @test3_ca1, void ()** @test3_ptr
+ ret void
+}
+
+define void @test3_bb1() {
+; CHECK-LABEL: Edges in function: test3_bb1
+; CHECK-NEXT: call -> test3_ca2
+; CHECK-NEXT: ref -> test3_ba1
+; CHECK-NOT: ->
+
+entry:
+ call void @test3_ca2()
+ store void ()* @test3_ba1, void ()** @test3_ptr
+ ret void
+}
+
+define void @test3_ca1() {
+; CHECK-LABEL: Edges in function: test3_ca1
+; CHECK-NEXT: call -> test3_ca2
+; CHECK-NOT: ->
+
+entry:
+ call void @test3_ca2()
+ ret void
+}
+
+define void @test3_ca2() {
+; CHECK-LABEL: Edges in function: test3_ca2
+; CHECK-NEXT: call -> test3_ca3
+; CHECK-NOT: ->
+
+entry:
+ call void @test3_ca3()
+ ret void
+}
+
+define void @test3_ca3() {
+; CHECK-LABEL: Edges in function: test3_ca3
+; CHECK-NEXT: call -> test3_ca1
+; CHECK-NOT: ->
+
+entry:
+ call void @test3_ca1()
+ ret void
+}
+
; Verify the SCCs formed.
;
-; CHECK-LABEL: SCC with 1 functions:
-; CHECK-NEXT: f7
+; CHECK-LABEL: RefSCC with 1 call SCCs:
+; CHECK-NEXT: SCC with 3 functions:
+; CHECK-NEXT: test3_ca3
+; CHECK-NEXT: test3_ca1
+; CHECK-NEXT: test3_ca2
+;
+; CHECK-LABEL: RefSCC with 2 call SCCs:
+; CHECK-NEXT: SCC with 1 functions:
+; CHECK-NEXT: test3_bb1
+; CHECK-NEXT: SCC with 1 functions:
+; CHECK-NEXT: test3_ba1
+;
+; CHECK-LABEL: RefSCC with 3 call SCCs:
+; CHECK-NEXT: SCC with 2 functions:
+; CHECK-NEXT: test3_ac2
+; CHECK-NEXT: test3_ac1
+; CHECK-NEXT: SCC with 2 functions:
+; CHECK-NEXT: test3_ab2
+; CHECK-NEXT: test3_ab1
+; CHECK-NEXT: SCC with 2 functions:
+; CHECK-NEXT: test3_aa2
+; CHECK-NEXT: test3_aa1
+;
+; CHECK-LABEL: RefSCC with 1 call SCCs:
+; CHECK-NEXT: SCC with 1 functions:
+; CHECK-NEXT: f7
;
-; CHECK-LABEL: SCC with 1 functions:
-; CHECK-NEXT: f6
+; CHECK-LABEL: RefSCC with 1 call SCCs:
+; CHECK-NEXT: SCC with 1 functions:
+; CHECK-NEXT: f6
;
-; CHECK-LABEL: SCC with 1 functions:
-; CHECK-NEXT: f5
+; CHECK-LABEL: RefSCC with 1 call SCCs:
+; CHECK-NEXT: SCC with 1 functions:
+; CHECK-NEXT: f5
;
-; CHECK-LABEL: SCC with 1 functions:
-; CHECK-NEXT: f4
+; CHECK-LABEL: RefSCC with 1 call SCCs:
+; CHECK-NEXT: SCC with 1 functions:
+; CHECK-NEXT: f4
;
-; CHECK-LABEL: SCC with 1 functions:
-; CHECK-NEXT: f3
+; CHECK-LABEL: RefSCC with 1 call SCCs:
+; CHECK-NEXT: SCC with 1 functions:
+; CHECK-NEXT: f3
;
-; CHECK-LABEL: SCC with 1 functions:
-; CHECK-NEXT: f2
+; CHECK-LABEL: RefSCC with 1 call SCCs:
+; CHECK-NEXT: SCC with 1 functions:
+; CHECK-NEXT: f2
;
-; CHECK-LABEL: SCC with 1 functions:
-; CHECK-NEXT: f1
+; CHECK-LABEL: RefSCC with 1 call SCCs:
+; CHECK-NEXT: SCC with 1 functions:
+; CHECK-NEXT: f1
;
-; CHECK-LABEL: SCC with 1 functions:
-; CHECK-NEXT: test2
+; CHECK-LABEL: RefSCC with 1 call SCCs:
+; CHECK-NEXT: SCC with 1 functions:
+; CHECK-NEXT: test2
;
-; CHECK-LABEL: SCC with 1 functions:
-; CHECK-NEXT: f12
+; CHECK-LABEL: RefSCC with 1 call SCCs:
+; CHECK-NEXT: SCC with 1 functions:
+; CHECK-NEXT: f10
;
-; CHECK-LABEL: SCC with 1 functions:
-; CHECK-NEXT: f11
+; CHECK-LABEL: RefSCC with 1 call SCCs:
+; CHECK-NEXT: SCC with 1 functions:
+; CHECK-NEXT: f12
;
-; CHECK-LABEL: SCC with 1 functions:
-; CHECK-NEXT: f10
+; CHECK-LABEL: RefSCC with 1 call SCCs:
+; CHECK-NEXT: SCC with 1 functions:
+; CHECK-NEXT: f11
;
-; CHECK-LABEL: SCC with 1 functions:
-; CHECK-NEXT: f9
+; CHECK-LABEL: RefSCC with 1 call SCCs:
+; CHECK-NEXT: SCC with 1 functions:
+; CHECK-NEXT: f9
;
-; CHECK-LABEL: SCC with 1 functions:
-; CHECK-NEXT: f8
+; CHECK-LABEL: RefSCC with 1 call SCCs:
+; CHECK-NEXT: SCC with 1 functions:
+; CHECK-NEXT: f8
;
-; CHECK-LABEL: SCC with 1 functions:
-; CHECK-NEXT: test1
+; CHECK-LABEL: RefSCC with 1 call SCCs:
+; CHECK-NEXT: SCC with 1 functions:
+; CHECK-NEXT: test1
;
-; CHECK-LABEL: SCC with 1 functions:
-; CHECK-NEXT: f
+; CHECK-LABEL: RefSCC with 1 call SCCs:
+; CHECK-NEXT: SCC with 1 functions:
+; CHECK-NEXT: f
;
-; CHECK-LABEL: SCC with 1 functions:
-; CHECK-NEXT: test0
+; CHECK-LABEL: RefSCC with 1 call SCCs:
+; CHECK-NEXT: SCC with 1 functions:
+; CHECK-NEXT: test0