1// RUN: mlir-opt %s -test-print-callgraph -split-input-file -allow-unregistered-dialect 2>&1 | FileCheck %s
2
3// CHECK-LABEL: Testing : "simple"
4module attributes {test.name = "simple"} {
5
6  // CHECK: Node{{.*}}func_a
7  func @func_a() {
8    return
9  }
10
11  func private @func_b()
12
13  // CHECK: Node{{.*}}func_c
14  // CHECK-NEXT: Call-Edge{{.*}}External-Node
15  func @func_c() {
16    call @func_b() : () -> ()
17    return
18  }
19
20  // CHECK: Node{{.*}}func_d
21  // CHECK-NEXT: Call-Edge{{.*}}func_c
22  func @func_d() {
23    call @func_c() : () -> ()
24    return
25  }
26
27  // CHECK: Node{{.*}}func_e
28  // CHECK-DAG: Call-Edge{{.*}}func_c
29  // CHECK-DAG: Call-Edge{{.*}}func_d
30  // CHECK-DAG: Call-Edge{{.*}}func_e
31  func @func_e() {
32    call @func_c() : () -> ()
33    call @func_d() : () -> ()
34    call @func_e() : () -> ()
35    return
36  }
37
38  // CHECK: Node{{.*}}func_f
39  // CHECK: Child-Edge{{.*}}test.functional_region_op
40  // CHECK: Call-Edge{{.*}}test.functional_region_op
41  func @func_f() {
42    // CHECK: Node{{.*}}test.functional_region_op
43    // CHECK: Call-Edge{{.*}}func_f
44    %fn = "test.functional_region_op"() ({
45      call @func_f() : () -> ()
46      "test.return"() : () -> ()
47    }) : () -> (() -> ())
48
49    call_indirect %fn() : () -> ()
50    return
51  }
52}
53
54// -----
55
56// CHECK-LABEL: Testing : "nested"
57module attributes {test.name = "nested"} {
58  module @nested_module {
59    // CHECK: Node{{.*}}func_a
60    func @func_a() {
61      return
62    }
63  }
64
65  // CHECK: Node{{.*}}func_b
66  // CHECK: Call-Edge{{.*}}func_a
67  func @func_b() {
68    "test.conversion_call_op"() { callee = @nested_module::@func_a } : () -> ()
69    return
70  }
71}
72