520 lines · plain
1// RUN: mlir-opt %s -pass-pipeline="builtin.module(func.func(test-print-liveness))" -split-input-file 2>&1 | FileCheck %s2 3// CHECK-LABEL: Testing : func_empty4func.func @func_empty() {5 // CHECK: Block: 06 // CHECK-NEXT: LiveIn:{{ *$}}7 // CHECK-NEXT: LiveOut:{{ *$}}8 // CHECK-NEXT: BeginLivenessIntervals9 // CHECK-NEXT: EndLivenessIntervals10 // CHECK-NEXT: BeginCurrentlyLive11 // CHECK-NEXT: EndCurrentlyLive12 return13}14 15// -----16 17// CHECK-LABEL: Testing : func_simpleBranch18func.func @func_simpleBranch(%arg0: i32, %arg1 : i32) -> i32 {19 // CHECK: Block: 020 // CHECK-NEXT: LiveIn:{{ *$}}21 // CHECK-NEXT: LiveOut: arg0@0 arg1@022 // CHECK-NEXT: BeginLivenessIntervals23 // CHECK-NEXT: EndLivenessIntervals24 // CHECK-NEXT: BeginCurrentlyLive25 // CHECK: cf.br26 // CHECK-SAME: arg0@0 arg1@027 // CHECK-NEXT: EndCurrentlyLive28 cf.br ^exit29^exit:30 // CHECK: Block: 131 // CHECK-NEXT: LiveIn: arg0@0 arg1@032 // CHECK-NEXT: LiveOut:{{ *$}}33 // CHECK-NEXT: BeginLivenessIntervals34 // CHECK: val_235 // CHECK-NEXT: %0 = arith.addi36 // CHECK-NEXT: return37 // CHECK-NEXT: EndLivenessIntervals38 // CHECK-NEXT: BeginCurrentlyLive39 // CHECK: arith.addi40 // CHECK-SAME: arg0@0 arg1@0 val_241 // CHECK: return42 // CHECK-SAME: val_243 // CHECK-NEXT:EndCurrentlyLive44 %result = arith.addi %arg0, %arg1 : i3245 return %result : i3246}47 48// -----49 50// CHECK-LABEL: Testing : func_condBranch51func.func @func_condBranch(%cond : i1, %arg1: i32, %arg2 : i32) -> i32 {52 // CHECK: Block: 053 // CHECK-NEXT: LiveIn:{{ *$}}54 // CHECK-NEXT: LiveOut: arg1@0 arg2@055 // CHECK-NEXT: BeginLivenessIntervals56 // CHECK-NEXT: EndLivenessIntervals57 // CHECK-NEXT: BeginCurrentlyLive58 // CHECK: cf.cond_br59 // CHECK-SAME: arg0@0 arg1@0 arg2@060 // CHECK-NEXT: EndCurrentlyLive61 cf.cond_br %cond, ^bb1, ^bb262^bb1:63 // CHECK: Block: 164 // CHECK-NEXT: LiveIn: arg1@0 arg2@065 // CHECK-NEXT: LiveOut: arg1@0 arg2@066 // CHECK: BeginCurrentlyLive67 // CHECK: cf.br68 // COM: arg0@0 had its last user in the previous block.69 // CHECK-SAME: arg1@0 arg2@070 // CHECK-NEXT: EndCurrentlyLive71 cf.br ^exit72^bb2:73 // CHECK: Block: 274 // CHECK-NEXT: LiveIn: arg1@0 arg2@075 // CHECK-NEXT: LiveOut: arg1@0 arg2@076 // CHECK: BeginCurrentlyLive77 // CHECK: cf.br78 // CHECK-SAME: arg1@0 arg2@079 // CHECK-NEXT: EndCurrentlyLive80 cf.br ^exit81^exit:82 // CHECK: Block: 383 // CHECK-NEXT: LiveIn: arg1@0 arg2@084 // CHECK-NEXT: LiveOut:{{ *$}}85 // CHECK-NEXT: BeginLivenessIntervals86 // CHECK: val_387 // CHECK-NEXT: %0 = arith.addi88 // CHECK-NEXT: return89 // CHECK-NEXT: EndLivenessIntervals90 // CHECK-NEXT: BeginCurrentlyLive91 // CHECK: arith.addi92 // CHECK-SAME: arg1@0 arg2@0 val_393 // CHECK: return94 // CHECK-SAME: val_395 // CHECK-NEXT: EndCurrentlyLive96 %result = arith.addi %arg1, %arg2 : i3297 return %result : i3298}99 100// -----101 102// CHECK-LABEL: Testing : func_loop103func.func @func_loop(%arg0 : i32, %arg1 : i32) -> i32 {104 // CHECK: Block: 0105 // CHECK-NEXT: LiveIn:{{ *$}}106 // CHECK-NEXT: LiveOut: arg1@0107 // CHECK: BeginCurrentlyLive108 // CHECK: arith.constant109 // CHECK-SAME: arg0@0 arg1@0 val_2110 // CHECK: cf.br111 // CHECK-SAME: arg0@0 arg1@0 val_2112 // CHECK-NEXT: EndCurrentlyLive113 %const0 = arith.constant 0 : i32114 cf.br ^loopHeader(%const0, %arg0 : i32, i32)115^loopHeader(%counter : i32, %i : i32):116 // CHECK: Block: 1117 // CHECK-NEXT: LiveIn: arg1@0118 // CHECK-NEXT: LiveOut: arg1@0 arg0@1119 // CHECK-NEXT: BeginLivenessIntervals120 // CHECK-NEXT: val_5121 // CHECK-NEXT: %2 = arith.cmpi122 // CHECK-NEXT: cf.cond_br123 // CHECK-NEXT: EndLivenessIntervals124 // CHECK-NEXT: BeginCurrentlyLive125 // CHECK: arith.cmpi126 // CHECK-SAME: arg1@0 arg0@1 arg1@1 val_5127 // CHECK: cf.cond_br128 // CHECK-SAME: arg1@0 arg0@1 arg1@1 val_5129 // CHECK-NEXT: EndCurrentlyLive130 %lessThan = arith.cmpi slt, %counter, %arg1 : i32131 cf.cond_br %lessThan, ^loopBody(%i : i32), ^exit(%i : i32)132^loopBody(%val : i32):133 // CHECK: Block: 2134 // CHECK-NEXT: LiveIn: arg1@0 arg0@1135 // CHECK-NEXT: LiveOut: arg1@0136 // CHECK-NEXT: BeginLivenessIntervals137 // CHECK-NEXT: val_7138 // CHECK-NEXT: %c139 // CHECK-NEXT: %4 = arith.addi140 // CHECK-NEXT: %5 = arith.addi141 // CHECK-NEXT: val_8142 // CHECK-NEXT: %4 = arith.addi143 // CHECK-NEXT: %5 = arith.addi144 // CHECK-NEXT: cf.br145 // CHECK: EndLivenessIntervals146 // CHECK-NEXT: BeginCurrentlyLive147 // CHECK: arith.constant148 // CHECK-SAME: arg1@0 arg0@1 arg0@2 val_7149 // CHECK: arith.addi150 // CHECK-SAME: arg1@0 arg0@1 arg0@2 val_7 val_8151 // CHECK: arith.addi152 // CHECK-SAME: arg1@0 arg0@1 val_7 val_8 val_9153 // CHECK: cf.br154 // CHECK-SAME: arg1@0 val_8 val_9155 // CHECK-NEXT: EndCurrentlyLive156 %const1 = arith.constant 1 : i32157 %inc = arith.addi %val, %const1 : i32158 %inc2 = arith.addi %counter, %const1 : i32159 cf.br ^loopHeader(%inc, %inc2 : i32, i32)160^exit(%sum : i32):161 // CHECK: Block: 3162 // CHECK-NEXT: LiveIn: arg1@0163 // CHECK-NEXT: LiveOut:{{ *$}}164 // CHECK: BeginCurrentlyLive165 // CHECK: arith.addi166 // CHECK-SAME: arg1@0 arg0@3 val_11167 // CHECK: return168 // CHECK-SAME: val_11169 // CHECK-NEXT: EndCurrentlyLive170 %result = arith.addi %sum, %arg1 : i32171 return %result : i32172}173 174// -----175 176// CHECK-LABEL: Testing : func_ranges177func.func @func_ranges(%cond : i1, %arg1 : i32, %arg2 : i32, %arg3 : i32) -> i32 {178 // CHECK: Block: 0179 // CHECK-NEXT: LiveIn:{{ *$}}180 // CHECK-NEXT: LiveOut: arg2@0 val_9 val_10181 // CHECK-NEXT: BeginLivenessIntervals182 // CHECK-NEXT: val_4183 // CHECK-NEXT: %0 = arith.addi184 // CHECK-NEXT: %c185 // CHECK-NEXT: %1 = arith.addi186 // CHECK-NEXT: %2 = arith.addi187 // CHECK-NEXT: %3 = arith.muli188 // CHECK-NEXT: val_5189 // CHECK-NEXT: %c190 // CHECK-NEXT: %1 = arith.addi191 // CHECK-NEXT: %2 = arith.addi192 // CHECK-NEXT: %3 = arith.muli193 // CHECK-NEXT: %4 = arith.muli194 // CHECK-NEXT: %5 = arith.addi195 // CHECK-NEXT: val_6196 // CHECK-NEXT: %1 = arith.addi197 // CHECK-NEXT: %2 = arith.addi198 // CHECK-NEXT: %3 = arith.muli199 // CHECK-NEXT: val_7200 // CHECK-NEXT: %2 = arith.addi201 // CHECK-NEXT: %3 = arith.muli202 // CHECK-NEXT: %4 = arith.muli203 // CHECK: val_8204 // CHECK-NEXT: %3 = arith.muli205 // CHECK-NEXT: %4 = arith.muli206 // CHECK-NEXT: val_9207 // CHECK-NEXT: %4 = arith.muli208 // CHECK-NEXT: %5 = arith.addi209 // CHECK-NEXT: cf.cond_br210 // CHECK-NEXT: %c211 // CHECK-NEXT: %6 = arith.muli212 // CHECK-NEXT: %7 = arith.muli213 // CHECK-NEXT: %8 = arith.addi214 // CHECK-NEXT: val_10215 // CHECK-NEXT: %5 = arith.addi216 // CHECK-NEXT: cf.cond_br217 // CHECK-NEXT: %7218 // CHECK: EndLivenessIntervals219 // CHECK-NEXT: BeginCurrentlyLive220 // CHECK: arith.addi221 // CHECK-SAME: arg0@0 arg1@0 arg2@0 arg3@0 val_4222 // CHECK: arith.constant223 // CHECK-SAME: arg0@0 arg2@0 arg3@0 val_4 val_5224 // CHECK: arith.addi225 // CHECK-SAME: arg0@0 arg2@0 arg3@0 val_4 val_5 val_6226 // CHECK: arith.addi227 // CHECK-SAME: arg0@0 arg2@0 arg3@0 val_4 val_5 val_6 val_7228 // CHECK: arith.muli229 // CHECK-SAME: arg0@0 arg2@0 val_4 val_5 val_6 val_7 val_8230 // CHECK: arith.muli231 // CHECK-SAME: arg0@0 arg2@0 val_5 val_7 val_8 val_9232 // CHECK: arith.addi233 // CHECK-SAME: arg0@0 arg2@0 val_5 val_9 val_10234 // CHECK: cf.cond_br235 // CHECK-SAME: arg0@0 arg2@0 val_9 val_10236 // CHECK-NEXT: EndCurrentlyLive237 %0 = arith.addi %arg1, %arg2 : i32238 %const1 = arith.constant 1 : i32239 %1 = arith.addi %const1, %arg2 : i32240 %2 = arith.addi %const1, %arg3 : i32241 %3 = arith.muli %0, %1 : i32242 %4 = arith.muli %3, %2 : i32243 %5 = arith.addi %4, %const1 : i32244 cf.cond_br %cond, ^bb1, ^bb2245 246^bb1:247 // CHECK: Block: 1248 // CHECK-NEXT: LiveIn: arg2@0 val_9249 // CHECK-NEXT: LiveOut: arg2@0250 // CHECK: BeginCurrentlyLive251 // CHECK: arith.constant252 // CHECK-SAME: arg2@0 val_9253 // CHECK: arith.muli254 // CHECK-SAME: arg2@0 val_9255 // CHECK: cf.br256 // CHECK-SAME: arg2@0257 // CHECK-NEXT: EndCurrentlyLive258 %const4 = arith.constant 4 : i32259 %6 = arith.muli %4, %const4 : i32260 cf.br ^exit(%6 : i32)261 262^bb2:263 // CHECK: Block: 2264 // CHECK-NEXT: LiveIn: arg2@0 val_9 val_10265 // CHECK-NEXT: LiveOut: arg2@0266 // CHECK: BeginCurrentlyLive267 // CHECK: arith.muli268 // CHECK-SAME: arg2@0 val_9 val_10269 // CHECK: arith.addi270 // CHECK-SAME: arg2@0271 // CHECK: cf.br272 // CHECK-SAME: arg2@0273 // CHECK: EndCurrentlyLive274 %7 = arith.muli %4, %5 : i32275 %8 = arith.addi %4, %arg2 : i32276 cf.br ^exit(%8 : i32)277 278^exit(%sum : i32):279 // CHECK: Block: 3280 // CHECK-NEXT: LiveIn: arg2@0281 // CHECK-NEXT: LiveOut:{{ *$}}282 // CHECK: BeginCurrentlyLive283 // CHECK: arith.addi284 // CHECK-SAME: arg2@0285 // CHECK: return286 // CHECK-NOT: arg2@0287 // CHECK: EndCurrentlyLive288 %result = arith.addi %sum, %arg2 : i32289 return %result : i32290}291 292// -----293 294// CHECK-LABEL: Testing : nested_region295 296func.func @nested_region(297 %arg0 : index, %arg1 : index, %arg2 : index,298 %arg3 : i32, %arg4 : i32, %arg5 : i32,299 %buffer : memref<i32>) -> i32 {300 // CHECK: Block: 0301 // CHECK-NEXT: LiveIn:{{ *$}}302 // CHECK-NEXT: LiveOut:{{ *$}}303 // CHECK-NEXT: BeginLivenessIntervals304 // CHECK-NEXT: val_7305 // CHECK-NEXT: %0 = arith.addi306 // CHECK-NEXT: %1 = arith.addi307 // CHECK-NEXT: scf.for308 // CHECK: // %2 = arith.addi309 // CHECK-NEXT: %3 = arith.addi310 // CHECK-NEXT: val_8311 // CHECK-NEXT: %1 = arith.addi312 // CHECK-NEXT: scf.for313 // CHECK: // func.return %1314 // CHECK: EndLivenessIntervals315 // CHECK-NEXT: BeginCurrentlyLive316 // CHECK: arith.addi317 // CHECK-SAME: arg0@0 arg1@0 arg2@0 arg3@0 arg4@0 arg5@0 arg6@0 val_7318 // CHECK: arith.addi319 // CHECK-SAME: arg0@0 arg1@0 arg2@0 arg4@0 arg5@0 arg6@0 val_7 val_8320 // CHECK: scf.for321 // CHECK-NEXT: arith.addi322 // CHECK-NEXT: arith.addi323 // CHECK-NEXT: memref.store324 // CHECK-NEXT: arg5@0 arg6@0 val_7 val_8325 // CHECK: return326 // CHECK-SAME: val_8327 // CHECK-NEXT: EndCurrentlyLive328 %0 = arith.addi %arg3, %arg4 : i32329 %1 = arith.addi %arg4, %arg5 : i32330 scf.for %arg6 = %arg0 to %arg1 step %arg2 {331 // CHECK: Block: 1332 // CHECK-NEXT: LiveIn: arg5@0 arg6@0 val_7333 // CHECK-NEXT: LiveOut:{{ *$}}334 // CHECK: BeginCurrentlyLive335 // CHECK-NEXT: arith.addi336 // CHECK-SAME: arg5@0 arg6@0 val_7 arg0@1 val_10337 // CHECK-NEXT: arith.addi338 // CHECK-SAME: arg6@0 val_7 val_10 val_11339 // CHECK-NEXT: memref.store340 // CHECK-SAME: arg6@0 val_11341 // CHECK-NEXT: EndCurrentlyLive342 %2 = arith.addi %0, %arg5 : i32343 %3 = arith.addi %2, %0 : i32344 memref.store %3, %buffer[] : memref<i32>345 }346 return %1 : i32347}348 349// -----350 351// CHECK-LABEL: Testing : nested_region2352 353func.func @nested_region2(354 // CHECK: Block: 0355 // CHECK-NEXT: LiveIn:{{ *$}}356 // CHECK-NEXT: LiveOut:{{ *$}}357 // CHECK-NEXT: BeginLivenessIntervals358 // CHECK-NEXT: val_7359 // CHECK-NEXT: %0 = arith.addi360 // CHECK-NEXT: %1 = arith.addi361 // CHECK-NEXT: scf.for362 // CHECK: // %2 = arith.addi363 // CHECK-NEXT: scf.for364 // CHECK: // %3 = arith.addi365 // CHECK-NEXT: val_8366 // CHECK-NEXT: %1 = arith.addi367 // CHECK-NEXT: scf.for368 // CHECK: // func.return %1369 // CHECK: EndLivenessIntervals370 // CHECK-NEXT: BeginCurrentlyLive371 // CHECK-NEXT: arith.addi372 // CHECK-SAME: arg0@0 arg1@0 arg2@0 arg3@0 arg4@0 arg5@0 arg6@0 val_7373 // CHECK-NEXT: arith.addi374 // CHECK-SAME: arg0@0 arg1@0 arg2@0 arg4@0 arg5@0 arg6@0 val_7 val_8375 // CHECK-NEXT: scf.for {{.*}}376 // CHECK-NEXT: arith.addi377 // CHECK-NEXT: scf.for {{.*}} {378 // CHECK-NEXT: arith.addi379 // CHECK-NEXT: memref.store380 // CHECK-NEXT: }381 // CHECK-NEXT: arg0@0 arg1@0 arg2@0 arg5@0 arg6@0 val_7 val_8382 // CHECK-NEXT: return383 // CHECK-SAME: val_8384 %arg0 : index, %arg1 : index, %arg2 : index,385 %arg3 : i32, %arg4 : i32, %arg5 : i32,386 %buffer : memref<i32>) -> i32 {387 %0 = arith.addi %arg3, %arg4 : i32388 %1 = arith.addi %arg4, %arg5 : i32389 scf.for %arg6 = %arg0 to %arg1 step %arg2 {390 // CHECK: Block: 1391 // CHECK-NEXT: LiveIn: arg0@0 arg1@0 arg2@0 arg5@0 arg6@0 val_7392 // CHECK-NEXT: LiveOut:{{ *$}}393 // CHECK-NEXT: BeginLivenessIntervals394 // CHECK-NEXT: val_10395 // CHECK-NEXT: %2 = arith.addi396 // CHECK-NEXT: scf.for397 // CHECK: // %3 = arith.addi398 // CHECK: EndLivenessIntervals399 // CHECK-NEXT: BeginCurrentlyLive400 // CHECK-NEXT: arith.addi401 // CHECK-SAME: arg0@0 arg1@0 arg2@0 arg5@0 arg6@0 val_7 arg0@1 val_10402 // CHECK-NEXT: scf.for {{.*}}403 // CHECK-NEXT: arith.addi404 // CHECK-NEXT: memref.store405 // CHECK-NEXT: arg0@0 arg1@0 arg2@0 arg6@0 val_7406 %2 = arith.addi %0, %arg5 : i32407 scf.for %arg7 = %arg0 to %arg1 step %arg2 {408 // CHECK: Block: 2409 // CHECK: BeginCurrentlyLive410 // CHECK-NEXT: arith.addi411 // CHECK-SAME: arg6@0 val_7 val_10 arg0@2 val_12412 // CHECK-NEXT: memref.store413 // CHECK-SAME: arg6@0 val_12414 // CHECK: EndCurrentlyLive415 %3 = arith.addi %2, %0 : i32416 memref.store %3, %buffer[] : memref<i32>417 }418 }419 return %1 : i32420}421 422// -----423 424// CHECK-LABEL: Testing : nested_region3425 426func.func @nested_region3(427 // CHECK: Block: 0428 // CHECK-NEXT: LiveIn:{{ *$}}429 // CHECK-NEXT: LiveOut: arg0@0 arg1@0 arg2@0 arg6@0 val_7 val_8430 // CHECK-NEXT: BeginLivenessIntervals431 // CHECK-NEXT: val_7432 // CHECK-NEXT: %0 = arith.addi433 // CHECK-NEXT: %1 = arith.addi434 // CHECK-NEXT: scf.for435 // CHECK: // cf.br ^bb1436 // CHECK-NEXT: %2 = arith.addi437 // CHECK-NEXT: scf.for438 // CHECK: // %2 = arith.addi439 // CHECK: EndLivenessIntervals440 // CHECK-NEXT: BeginCurrentlyLive441 // CHECK-NEXT: arith.addi442 // CHECK-SAME: arg0@0 arg1@0 arg2@0 arg3@0 arg4@0 arg5@0 arg6@0 val_7443 // CHECK-NEXT: arith.addi444 // CHECK-SAME: arg0@0 arg1@0 arg2@0 arg4@0 arg5@0 arg6@0 val_7 val_8445 // CHECK-NEXT: scf.for446 // COM: Skipping the body of the scf.for...447 // CHECK: arg0@0 arg1@0 arg2@0 arg5@0 arg6@0 val_7 val_8448 // CHECK-NEXT: cf.br449 // CHECK-SAME: arg0@0 arg1@0 arg2@0 arg6@0 val_7 val_8450 // CHECK-NEXT: EndCurrentlyLive451 %arg0 : index, %arg1 : index, %arg2 : index,452 %arg3 : i32, %arg4 : i32, %arg5 : i32,453 %buffer : memref<i32>) -> i32 {454 %0 = arith.addi %arg3, %arg4 : i32455 %1 = arith.addi %arg4, %arg5 : i32456 scf.for %arg6 = %arg0 to %arg1 step %arg2 {457 // CHECK: Block: 1458 // CHECK-NEXT: LiveIn: arg5@0 arg6@0 val_7459 // CHECK-NEXT: LiveOut:{{ *$}}460 // CHECK: BeginCurrentlyLive461 // CHECK-NEXT: arith.addi462 // CHECK-SAME: arg5@0 arg6@0 val_7 arg0@1 val_10463 // CHECK-NEXT: memref.store464 // CHECK-SAME: arg6@0 val_10465 // CHECK-NEXT: EndCurrentlyLive466 %2 = arith.addi %0, %arg5 : i32467 memref.store %2, %buffer[] : memref<i32>468 }469 cf.br ^exit470 471^exit:472 // CHECK: Block: 2473 // CHECK-NEXT: LiveIn: arg0@0 arg1@0 arg2@0 arg6@0 val_7 val_8474 // CHECK-NEXT: LiveOut:{{ *$}}475 // CHECK: BeginCurrentlyLive476 // CHECK: scf.for477 // CHECK: arg0@0 arg1@0 arg2@0 arg6@0 val_7 val_8478 // CHECK-NEXT: return479 // CHECK-SAME: val_8480 // CHECK-NEXT: EndCurrentlyLive481 scf.for %arg7 = %arg0 to %arg1 step %arg2 {482 // CHECK: Block: 3483 // CHECK-NEXT: LiveIn: arg6@0 val_7 val_8484 // CHECK-NEXT: LiveOut:{{ *$}}485 // CHECK: BeginCurrentlyLive486 // CHECK-NEXT: arith.addi487 // CHECK-SAME: arg6@0 val_7 val_8 arg0@3 val_12488 // CHECK-NEXT: memref.store489 // CHECK-SAME: arg6@0 val_12490 // CHECK-NEXT: EndCurrentlyLive491 %2 = arith.addi %0, %1 : i32492 memref.store %2, %buffer[] : memref<i32>493 }494 return %1 : i32495}496 497// -----498 499// CHECK-LABEL: Testing : nested_region4500 501func.func @nested_region4(%arg0: index, %arg1: index, %arg2: index) {502 // CHECK: Block: 0503 // CHECK-NEXT: LiveIn:{{ *$}}504 // CHECK-NEXT: LiveOut:{{ *$}}505 506 // CHECK: {{^// +}}[[VAL3:[a-z0-9_]+]]{{ *:}}507 // CHECK: {{^// +}}[[VAL4:[a-z0-9_]+]]{{ *:}}508 %c0_i32 = arith.constant 0 : i32509 %c1_i32 = arith.constant 1 : i32510 511 %0 = scf.for %arg3 = %arg0 to %arg1 step %arg2 iter_args(%arg4 = %c0_i32) -> (i32) {512 // CHECK: Block: 1513 // CHECK-NEXT: LiveIn: [[VAL4]]{{ *$}}514 // CHECK-NEXT: LiveOut:{{ *$}}515 %1 = arith.addi %arg4, %c1_i32 : i32516 scf.yield %1 : i32517 }518 return519}520