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 @func_a() { 8 return 9 } 10 11 func.func private @func_b() 12 13 // CHECK: Node{{.*}}func_c 14 // CHECK-NEXT: Call-Edge{{.*}}Unknown-Callee-Node 15 func.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 @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 @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 @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 @func_a() { 61 return 62 } 63 } 64 65 // CHECK: Node{{.*}}func_b 66 // CHECK: Call-Edge{{.*}}func_a 67 func.func @func_b() { 68 "test.conversion_call_op"() { callee = @nested_module::@func_a } : () -> () 69 return 70 } 71} 72 73// ----- 74 75// CHECK-LABEL: Testing : "SCC" 76// CHECK: SCCs 77module attributes {test.name = "SCC"} { 78 // CHECK: SCC : 79 // CHECK-NEXT: Node{{.*}}Unknown-Callee-Node 80 81 // CHECK: SCC : 82 // CHECK-NEXT: Node{{.*}}foo 83 func.func @foo(%arg0 : () -> ()) { 84 call_indirect %arg0() : () -> () 85 return 86 } 87 88 // CHECK: SCC : 89 // CHECK-NEXT: Node{{.*}}bar 90 func.func @bar(%arg1 : () -> ()) { 91 call_indirect %arg1() : () -> () 92 return 93 } 94 95 // CHECK: SCC : 96 // CHECK-NEXT: Node{{.*}}External-Caller-Node 97} 98 99