1; Based on llvm/test/Other/cgscc-iterate-function-mutation.ll 2; RUN: opt -passes='default<O3>,print<inline-advisor>' -training-log=/dev/null \ 3; RUN: -S -enable-ml-inliner=development -keep-inline-advisor-for-printing < %s 2>&1 | FileCheck %s 4; REQUIRES: have_tflite 5; 6; CHECK: [MLInlineAdvisor] Nodes: 36 Edges: 0 7 8declare void @readnone() nofree nosync readnone 9declare void @unknown() 10declare void @reference_function_pointer(ptr) nofree nosync readnone 11 12; The @test1_* set of functions checks that when we mutate functions with 13; simplifycfg to delete call edges and this ends up splitting both the SCCs 14; and the RefSCCs that those functions are in, we re-run the CGSCC passes to 15; observe the refined call graph structure. 16 17define void @test1_a() { 18 call void @test1_b1() 19 call void @test1_b2() 20 call void @test1_b3() 21 call void @test1_b4() 22 ret void 23} 24 25define void @test1_b1() { 26 call void @readnone() 27 ret void 28} 29 30define void @test1_b2() { 31 call void @readnone() 32 br i1 false, label %dead, label %exit 33 34dead: 35 call void @test1_a() 36 br label %exit 37 38exit: 39 ret void 40} 41 42define void @test1_b3() { 43 call void @unknown() 44 br i1 false, label %dead, label %exit 45 46dead: 47 call void @test1_a() 48 br label %exit 49 50exit: 51 ret void 52} 53 54define void @test1_b4() { 55 call void @readnone() 56 br i1 false, label %dead, label %exit 57 58dead: 59 call void @test1_a() 60 br label %exit 61 62exit: 63 ret void 64} 65 66define void @test2_a() { 67 call void @test2_b1() 68 call void @test2_b2() 69 call void @test2_b3() 70 call void @test2_b4() 71 ret void 72} 73 74define void @test2_b1() { 75 call void @readnone() 76 ret void 77} 78 79define void @test2_b2() { 80 call void @reference_function_pointer(ptr @test2_a) 81 br i1 false, label %dead, label %exit 82 83dead: 84 call void @test2_a() 85 br label %exit 86 87exit: 88 ret void 89} 90 91define void @test2_b3() { 92 call void @reference_function_pointer(ptr @test2_a) 93 call void @unknown() 94 br i1 false, label %dead, label %exit 95 96dead: 97 call void @test2_a() 98 br label %exit 99 100exit: 101 ret void 102} 103 104define void @test2_b4() { 105 call void @reference_function_pointer(ptr @test2_a) 106 br i1 false, label %dead, label %exit 107 108dead: 109 call void @test2_a() 110 br label %exit 111 112exit: 113 ret void 114} 115 116define void @test3_a() { 117 call void @test3_b11() 118 call void @test3_b21() 119 call void @test3_b31() 120 call void @test3_b41() 121 ret void 122} 123 124define void @test3_b11() { 125 call void @test3_b12() 126 ret void 127} 128 129define void @test3_b12() { 130 call void @test3_b13() 131 ret void 132} 133 134define void @test3_b13() { 135 call void @readnone() 136 ret void 137} 138 139define void @test3_b21() { 140 call void @test3_b22() 141 ret void 142} 143 144define void @test3_b22() { 145 call void @test3_b23() 146 ret void 147} 148 149define void @test3_b23() { 150 call void @readnone() 151 br i1 false, label %dead, label %exit 152 153dead: 154 call void @test3_a() 155 br label %exit 156 157exit: 158 ret void 159} 160 161define void @test3_b31() { 162 call void @test3_b32() 163 ret void 164} 165 166define void @test3_b32() { 167 call void @test3_b33() 168 ret void 169} 170 171define void @test3_b33() { 172 call void @unknown() 173 br i1 false, label %dead, label %exit 174 175dead: 176 call void @test3_a() 177 br label %exit 178 179exit: 180 ret void 181} 182 183define void @test3_b41() { 184 call void @test3_b42() 185 ret void 186} 187 188define void @test3_b42() { 189 call void @test3_b43() 190 ret void 191} 192 193define void @test3_b43() { 194 call void @readnone() 195 br i1 false, label %dead, label %exit 196 197dead: 198 call void @test3_a() 199 br label %exit 200 201exit: 202 ret void 203} 204 205define void @test4_a() { 206 call void @test4_b11() 207 call void @test4_b21() 208 call void @test4_b31() 209 call void @test4_b41() 210 ret void 211} 212 213define void @test4_b11() { 214 call void @test4_b12() 215 ret void 216} 217 218define void @test4_b12() { 219 call void @test4_b13() 220 ret void 221} 222 223define void @test4_b13() { 224 call void @readnone() 225 ret void 226} 227 228define void @test4_b21() { 229 call void @test4_b22() 230 ret void 231} 232 233define void @test4_b22() { 234 call void @test4_b23() 235 ret void 236} 237 238define void @test4_b23() { 239 call void @reference_function_pointer(ptr @test4_a) 240 br i1 false, label %dead, label %exit 241 242dead: 243 call void @test4_a() 244 br label %exit 245 246exit: 247 ret void 248} 249 250define void @test4_b31() { 251 call void @test4_b32() 252 ret void 253} 254 255define void @test4_b32() { 256 call void @test4_b33() 257 ret void 258} 259 260define void @test4_b33() { 261 call void @reference_function_pointer(ptr @test4_a) 262 call void @unknown() 263 br i1 false, label %dead, label %exit 264 265dead: 266 call void @test4_a() 267 br label %exit 268 269exit: 270 ret void 271} 272 273define void @test4_b41() { 274 call void @test4_b42() 275 ret void 276} 277 278define void @test4_b42() { 279 call void @test4_b43() 280 ret void 281} 282 283define void @test4_b43() { 284 call void @reference_function_pointer(ptr @test4_a) 285 br i1 false, label %dead, label %exit 286 287dead: 288 call void @test4_a() 289 br label %exit 290 291exit: 292 ret void 293} 294