diff options
Diffstat (limited to 'test/Analysis/LazyCallGraph/basic.ll')
-rw-r--r-- | test/Analysis/LazyCallGraph/basic.ll | 281 |
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 |