1! This test checks lowering of OpenACC parallel loop combined directive. 2 3! RUN: bbc -fopenacc -emit-fir %s -o - | FileCheck %s 4 5subroutine acc_parallel_loop 6 integer :: i, j 7 8 integer :: async = 1 9 integer :: wait1 = 1 10 integer :: wait2 = 2 11 integer :: numGangs = 1 12 integer :: numWorkers = 10 13 integer :: vectorLength = 128 14 logical :: ifCondition = .TRUE. 15 integer, parameter :: n = 10 16 real, dimension(n) :: a, b, c 17 real, dimension(n, n) :: d, e 18 real, pointer :: f, g 19 20 integer :: gangNum = 8 21 integer :: gangStatic = 8 22 integer :: vectorNum = 128 23 integer, parameter :: tileSize = 2 24 25!CHECK: [[A:%.*]] = fir.alloca !fir.array<10xf32> {{{.*}}uniq_name = "{{.*}}Ea"} 26!CHECK: [[B:%.*]] = fir.alloca !fir.array<10xf32> {{{.*}}uniq_name = "{{.*}}Eb"} 27!CHECK: [[C:%.*]] = fir.alloca !fir.array<10xf32> {{{.*}}uniq_name = "{{.*}}Ec"} 28!CHECK: [[F:%.*]] = fir.alloca !fir.box<!fir.ptr<f32>> {bindc_name = "f", uniq_name = "{{.*}}Ef"} 29!CHECK: [[G:%.*]] = fir.alloca !fir.box<!fir.ptr<f32>> {bindc_name = "g", uniq_name = "{{.*}}Eg"} 30!CHECK: [[IFCONDITION:%.*]] = fir.address_of(@{{.*}}ifcondition) : !fir.ref<!fir.logical<4>> 31 32 !$acc parallel loop 33 DO i = 1, n 34 a(i) = b(i) 35 END DO 36 37!CHECK: acc.parallel { 38!CHECK: acc.loop { 39!CHECK: fir.do_loop 40!CHECK: acc.yield 41!CHECK-NEXT: }{{$}} 42!CHECK: acc.yield 43!CHECK-NEXT: }{{$}} 44 45 !$acc parallel loop async 46 DO i = 1, n 47 a(i) = b(i) 48 END DO 49 !$acc end parallel loop 50 51!CHECK: acc.parallel { 52!CHECK: acc.loop { 53!CHECK: fir.do_loop 54!CHECK: acc.yield 55!CHECK-NEXT: }{{$}} 56!CHECK: acc.yield 57!CHECK-NEXT: } attributes {asyncAttr} 58 59 !$acc parallel loop async(1) 60 DO i = 1, n 61 a(i) = b(i) 62 END DO 63 64!CHECK: [[ASYNC1:%.*]] = arith.constant 1 : i32 65!CHECK: acc.parallel async([[ASYNC1]]: i32) { 66!CHECK: acc.loop { 67!CHECK: fir.do_loop 68!CHECK: acc.yield 69!CHECK-NEXT: }{{$}} 70!CHECK: acc.yield 71!CHECK-NEXT: }{{$}} 72 73 !$acc parallel loop async(async) 74 DO i = 1, n 75 a(i) = b(i) 76 END DO 77 78!CHECK: [[ASYNC2:%.*]] = fir.load %{{.*}} : !fir.ref<i32> 79!CHECK: acc.parallel async([[ASYNC2]]: i32) { 80!CHECK: acc.loop { 81!CHECK: fir.do_loop 82!CHECK: acc.yield 83!CHECK-NEXT: }{{$}} 84!CHECK: acc.yield 85!CHECK-NEXT: }{{$}} 86 87 !$acc parallel loop wait 88 DO i = 1, n 89 a(i) = b(i) 90 END DO 91 92!CHECK: acc.parallel { 93!CHECK: acc.loop { 94!CHECK: fir.do_loop 95!CHECK: acc.yield 96!CHECK-NEXT: }{{$}} 97!CHECK: acc.yield 98!CHECK-NEXT: } attributes {waitAttr} 99 100 !$acc parallel loop wait(1) 101 DO i = 1, n 102 a(i) = b(i) 103 END DO 104 105!CHECK: [[WAIT1:%.*]] = arith.constant 1 : i32 106!CHECK: acc.parallel wait([[WAIT1]]: i32) { 107!CHECK: acc.loop { 108!CHECK: fir.do_loop 109!CHECK: acc.yield 110!CHECK-NEXT: }{{$}} 111!CHECK: acc.yield 112!CHECK-NEXT: }{{$}} 113 114 !$acc parallel loop wait(1, 2) 115 DO i = 1, n 116 a(i) = b(i) 117 END DO 118 119!CHECK: [[WAIT2:%.*]] = arith.constant 1 : i32 120!CHECK: [[WAIT3:%.*]] = arith.constant 2 : i32 121!CHECK: acc.parallel wait([[WAIT2]]: i32, [[WAIT3]]: i32) { 122!CHECK: acc.loop { 123!CHECK: fir.do_loop 124!CHECK: acc.yield 125!CHECK-NEXT: }{{$}} 126!CHECK: acc.yield 127!CHECK-NEXT: }{{$}} 128 129 !$acc parallel loop wait(wait1, wait2) 130 DO i = 1, n 131 a(i) = b(i) 132 END DO 133 134!CHECK: [[WAIT4:%.*]] = fir.load %{{.*}} : !fir.ref<i32> 135!CHECK: [[WAIT5:%.*]] = fir.load %{{.*}} : !fir.ref<i32> 136!CHECK: acc.parallel wait([[WAIT4]]: i32, [[WAIT5]]: i32) { 137!CHECK: acc.loop { 138!CHECK: fir.do_loop 139!CHECK: acc.yield 140!CHECK-NEXT: }{{$}} 141!CHECK: acc.yield 142!CHECK-NEXT: }{{$}} 143 144 !$acc parallel loop num_gangs(1) 145 DO i = 1, n 146 a(i) = b(i) 147 END DO 148 149!CHECK: [[NUMGANGS1:%.*]] = arith.constant 1 : i32 150!CHECK: acc.parallel num_gangs([[NUMGANGS1]]: i32) { 151!CHECK: acc.loop { 152!CHECK: fir.do_loop 153!CHECK: acc.yield 154!CHECK-NEXT: }{{$}} 155!CHECK: acc.yield 156!CHECK-NEXT: }{{$}} 157 158 !$acc parallel loop num_gangs(numGangs) 159 DO i = 1, n 160 a(i) = b(i) 161 END DO 162 163!CHECK: [[NUMGANGS2:%.*]] = fir.load %{{.*}} : !fir.ref<i32> 164!CHECK: acc.parallel num_gangs([[NUMGANGS2]]: i32) { 165!CHECK: acc.loop { 166!CHECK: fir.do_loop 167!CHECK: acc.yield 168!CHECK-NEXT: }{{$}} 169!CHECK: acc.yield 170!CHECK-NEXT: }{{$}} 171 172 !$acc parallel loop num_workers(10) 173 DO i = 1, n 174 a(i) = b(i) 175 END DO 176 177!CHECK: [[NUMWORKERS1:%.*]] = arith.constant 10 : i32 178!CHECK: acc.parallel num_workers([[NUMWORKERS1]]: i32) { 179!CHECK: acc.loop { 180!CHECK: fir.do_loop 181!CHECK: acc.yield 182!CHECK-NEXT: }{{$}} 183!CHECK: acc.yield 184!CHECK-NEXT: }{{$}} 185 186 !$acc parallel loop num_workers(numWorkers) 187 DO i = 1, n 188 a(i) = b(i) 189 END DO 190 191!CHECK: [[NUMWORKERS2:%.*]] = fir.load %{{.*}} : !fir.ref<i32> 192!CHECK: acc.parallel num_workers([[NUMWORKERS2]]: i32) { 193!CHECK: acc.loop { 194!CHECK: fir.do_loop 195!CHECK: acc.yield 196!CHECK-NEXT: }{{$}} 197!CHECK: acc.yield 198!CHECK-NEXT: }{{$}} 199 200 !$acc parallel loop vector_length(128) 201 DO i = 1, n 202 a(i) = b(i) 203 END DO 204 205!CHECK: [[VECTORLENGTH1:%.*]] = arith.constant 128 : i32 206!CHECK: acc.parallel vector_length([[VECTORLENGTH1]]: i32) { 207!CHECK: acc.loop { 208!CHECK: fir.do_loop 209!CHECK: acc.yield 210!CHECK-NEXT: }{{$}} 211!CHECK: acc.yield 212!CHECK-NEXT: }{{$}} 213 214 !$acc parallel loop vector_length(vectorLength) 215 DO i = 1, n 216 a(i) = b(i) 217 END DO 218 219!CHECK: [[VECTORLENGTH2:%.*]] = fir.load %{{.*}} : !fir.ref<i32> 220!CHECK: acc.parallel vector_length([[VECTORLENGTH2]]: i32) { 221!CHECK: acc.loop { 222!CHECK: fir.do_loop 223!CHECK: acc.yield 224!CHECK-NEXT: }{{$}} 225!CHECK: acc.yield 226!CHECK-NEXT: }{{$}} 227 228 !$acc parallel loop if(.TRUE.) 229 DO i = 1, n 230 a(i) = b(i) 231 END DO 232 233!CHECK: [[IF1:%.*]] = arith.constant true 234!CHECK: acc.parallel if([[IF1]]) { 235!CHECK: acc.loop { 236!CHECK: fir.do_loop 237!CHECK: acc.yield 238!CHECK-NEXT: }{{$}} 239!CHECK: acc.yield 240!CHECK-NEXT: }{{$}} 241 242 !$acc parallel loop if(ifCondition) 243 DO i = 1, n 244 a(i) = b(i) 245 END DO 246 247!CHECK: [[IFCOND:%.*]] = fir.load %{{.*}} : !fir.ref<!fir.logical<4>> 248!CHECK: [[IF2:%.*]] = fir.convert [[IFCOND]] : (!fir.logical<4>) -> i1 249!CHECK: acc.parallel if([[IF2]]) { 250!CHECK: acc.loop { 251!CHECK: fir.do_loop 252!CHECK: acc.yield 253!CHECK-NEXT: }{{$}} 254!CHECK: acc.yield 255!CHECK-NEXT: }{{$}} 256 257 !$acc parallel loop self(.TRUE.) 258 DO i = 1, n 259 a(i) = b(i) 260 END DO 261 262!CHECK: [[SELF1:%.*]] = arith.constant true 263!CHECK: acc.parallel self([[SELF1]]) { 264!CHECK: acc.loop { 265!CHECK: fir.do_loop 266!CHECK: acc.yield 267!CHECK-NEXT: }{{$}} 268!CHECK: acc.yield 269!CHECK-NEXT: }{{$}} 270 271 !$acc parallel loop self 272 DO i = 1, n 273 a(i) = b(i) 274 END DO 275 276!CHECK: acc.parallel { 277!CHECK: acc.loop { 278!CHECK: fir.do_loop 279!CHECK: acc.yield 280!CHECK-NEXT: }{{$}} 281!CHECK: acc.yield 282!CHECK-NEXT: } attributes {selfAttr} 283 284 !$acc parallel loop self(ifCondition) 285 DO i = 1, n 286 a(i) = b(i) 287 END DO 288 289!CHECK: [[SELF2:%.*]] = fir.convert [[IFCONDITION]] : (!fir.ref<!fir.logical<4>>) -> i1 290!CHECK: acc.parallel self([[SELF2]]) { 291!CHECK: acc.loop { 292!CHECK: fir.do_loop 293!CHECK: acc.yield 294!CHECK-NEXT: }{{$}} 295!CHECK: acc.yield 296!CHECK-NEXT: }{{$}} 297 298 !$acc parallel loop copy(a, b) 299 DO i = 1, n 300 a(i) = b(i) 301 END DO 302 303!CHECK: acc.parallel copy([[A]]: !fir.ref<!fir.array<10xf32>>, [[B]]: !fir.ref<!fir.array<10xf32>>) { 304!CHECK: acc.loop { 305!CHECK: fir.do_loop 306!CHECK: acc.yield 307!CHECK-NEXT: }{{$}} 308!CHECK: acc.yield 309!CHECK-NEXT: }{{$}} 310 311 !$acc parallel loop copy(a) copy(b) 312 DO i = 1, n 313 a(i) = b(i) 314 END DO 315 316!CHECK: acc.parallel copy([[A]]: !fir.ref<!fir.array<10xf32>>, [[B]]: !fir.ref<!fir.array<10xf32>>) { 317!CHECK: acc.loop { 318!CHECK: fir.do_loop 319!CHECK: acc.yield 320!CHECK-NEXT: }{{$}} 321!CHECK: acc.yield 322!CHECK-NEXT: }{{$}} 323 324 !$acc parallel loop copyin(a) copyin(readonly: b) 325 DO i = 1, n 326 a(i) = b(i) 327 END DO 328 329!CHECK: acc.parallel copyin([[A]]: !fir.ref<!fir.array<10xf32>>) copyin_readonly([[B]]: !fir.ref<!fir.array<10xf32>>) { 330!CHECK: acc.loop { 331!CHECK: fir.do_loop 332!CHECK: acc.yield 333!CHECK-NEXT: }{{$}} 334!CHECK: acc.yield 335!CHECK-NEXT: }{{$}} 336 337 !$acc parallel loop copyout(a) copyout(zero: b) 338 DO i = 1, n 339 a(i) = b(i) 340 END DO 341 342!CHECK: acc.parallel copyout([[A]]: !fir.ref<!fir.array<10xf32>>) copyout_zero([[B]]: !fir.ref<!fir.array<10xf32>>) { 343!CHECK: acc.loop { 344!CHECK: fir.do_loop 345!CHECK: acc.yield 346!CHECK-NEXT: }{{$}} 347!CHECK: acc.yield 348!CHECK-NEXT: }{{$}} 349 350 !$acc parallel loop create(b) create(zero: a) 351 DO i = 1, n 352 a(i) = b(i) 353 END DO 354 355!CHECK: acc.parallel create([[B]]: !fir.ref<!fir.array<10xf32>>) create_zero([[A]]: !fir.ref<!fir.array<10xf32>>) { 356!CHECK: acc.loop { 357!CHECK: fir.do_loop 358!CHECK: acc.yield 359!CHECK-NEXT: }{{$}} 360!CHECK: acc.yield 361!CHECK-NEXT: }{{$}} 362 363 !$acc parallel loop no_create(a, b) 364 DO i = 1, n 365 a(i) = b(i) 366 END DO 367 368!CHECK: acc.parallel no_create([[A]]: !fir.ref<!fir.array<10xf32>>, [[B]]: !fir.ref<!fir.array<10xf32>>) { 369!CHECK: acc.loop { 370!CHECK: fir.do_loop 371!CHECK: acc.yield 372!CHECK-NEXT: }{{$}} 373!CHECK: acc.yield 374!CHECK-NEXT: }{{$}} 375 376 !$acc parallel loop present(a, b) 377 DO i = 1, n 378 a(i) = b(i) 379 END DO 380 381!CHECK: acc.parallel present([[A]]: !fir.ref<!fir.array<10xf32>>, [[B]]: !fir.ref<!fir.array<10xf32>>) { 382!CHECK: acc.loop { 383!CHECK: fir.do_loop 384!CHECK: acc.yield 385!CHECK-NEXT: }{{$}} 386!CHECK: acc.yield 387!CHECK-NEXT: }{{$}} 388 389 !$acc parallel loop deviceptr(a) deviceptr(b) 390 DO i = 1, n 391 a(i) = b(i) 392 END DO 393 394!CHECK: acc.parallel deviceptr([[A]]: !fir.ref<!fir.array<10xf32>>, [[B]]: !fir.ref<!fir.array<10xf32>>) { 395!CHECK: acc.loop { 396!CHECK: fir.do_loop 397!CHECK: acc.yield 398!CHECK-NEXT: }{{$}} 399!CHECK: acc.yield 400!CHECK-NEXT: }{{$}} 401 402 !$acc parallel loop attach(f, g) 403 DO i = 1, n 404 a(i) = b(i) 405 END DO 406 407!CHECK: acc.parallel attach([[F]]: !fir.ref<!fir.box<!fir.ptr<f32>>>, [[G]]: !fir.ref<!fir.box<!fir.ptr<f32>>>) { 408!CHECK: acc.loop { 409!CHECK: fir.do_loop 410!CHECK: acc.yield 411!CHECK-NEXT: }{{$}} 412!CHECK: acc.yield 413!CHECK-NEXT: }{{$}} 414 415 !$acc parallel loop private(a) firstprivate(b) 416 DO i = 1, n 417 a(i) = b(i) 418 END DO 419 420!CHECK: acc.parallel private([[A]]: !fir.ref<!fir.array<10xf32>>) firstprivate([[B]]: !fir.ref<!fir.array<10xf32>>) { 421!CHECK: acc.loop private([[A]]: !fir.ref<!fir.array<10xf32>>) { 422!CHECK: fir.do_loop 423!CHECK: acc.yield 424!CHECK-NEXT: }{{$}} 425!CHECK: acc.yield 426!CHECK-NEXT: }{{$}} 427 428 !$acc parallel loop seq 429 DO i = 1, n 430 a(i) = b(i) 431 END DO 432 433!CHECK: acc.parallel { 434!CHECK: acc.loop { 435!CHECK: fir.do_loop 436!CHECK: acc.yield 437!CHECK-NEXT: } attributes {seq} 438!CHECK: acc.yield 439!CHECK-NEXT: }{{$}} 440 441 !$acc parallel loop auto 442 DO i = 1, n 443 a(i) = b(i) 444 END DO 445 446!CHECK: acc.parallel { 447!CHECK: acc.loop { 448!CHECK: fir.do_loop 449!CHECK: acc.yield 450!CHECK-NEXT: } attributes {auto} 451!CHECK: acc.yield 452!CHECK-NEXT: }{{$}} 453 454 !$acc parallel loop independent 455 DO i = 1, n 456 a(i) = b(i) 457 END DO 458 459!CHECK: acc.parallel { 460!CHECK: acc.loop { 461!CHECK: fir.do_loop 462!CHECK: acc.yield 463!CHECK-NEXT: } attributes {independent} 464!CHECK: acc.yield 465!CHECK-NEXT: }{{$}} 466 467 !$acc parallel loop gang 468 DO i = 1, n 469 a(i) = b(i) 470 END DO 471 472!CHECK: acc.parallel { 473!CHECK: acc.loop gang { 474!CHECK: fir.do_loop 475!CHECK: acc.yield 476!CHECK-NEXT: }{{$}} 477!CHECK: acc.yield 478!CHECK-NEXT: }{{$}} 479 480 !$acc parallel loop gang(num: 8) 481 DO i = 1, n 482 a(i) = b(i) 483 END DO 484 485!CHECK: acc.parallel { 486!CHECK: [[GANGNUM1:%.*]] = arith.constant 8 : i32 487!CHECK-NEXT: acc.loop gang(num=[[GANGNUM1]]: i32) { 488!CHECK: fir.do_loop 489!CHECK: acc.yield 490!CHECK-NEXT: }{{$}} 491!CHECK: acc.yield 492!CHECK-NEXT: }{{$}} 493 494 !$acc parallel loop gang(num: gangNum) 495 DO i = 1, n 496 a(i) = b(i) 497 END DO 498 499!CHECK: acc.parallel { 500!CHECK: [[GANGNUM2:%.*]] = fir.load %{{.*}} : !fir.ref<i32> 501!CHECK-NEXT: acc.loop gang(num=[[GANGNUM2]]: i32) { 502!CHECK: fir.do_loop 503!CHECK: acc.yield 504!CHECK-NEXT: }{{$}} 505!CHECK: acc.yield 506!CHECK-NEXT: }{{$}} 507 508 !$acc parallel loop gang(num: gangNum, static: gangStatic) 509 DO i = 1, n 510 a(i) = b(i) 511 END DO 512 513!CHECK: acc.parallel { 514!CHECK: acc.loop gang(num=%{{.*}}: i32, static=%{{.*}}: i32) { 515!CHECK: fir.do_loop 516!CHECK: acc.yield 517!CHECK-NEXT: }{{$}} 518!CHECK: acc.yield 519!CHECK-NEXT: }{{$}} 520 521 !$acc parallel loop vector 522 DO i = 1, n 523 a(i) = b(i) 524 END DO 525!CHECK: acc.parallel { 526!CHECK: acc.loop vector { 527!CHECK: fir.do_loop 528!CHECK: acc.yield 529!CHECK-NEXT: }{{$}} 530!CHECK: acc.yield 531!CHECK-NEXT: }{{$}} 532 533 !$acc parallel loop vector(128) 534 DO i = 1, n 535 a(i) = b(i) 536 END DO 537 538!CHECK: acc.parallel { 539!CHECK: [[CONSTANT128:%.*]] = arith.constant 128 : i32 540!CHECK: acc.loop vector([[CONSTANT128]]: i32) { 541!CHECK: fir.do_loop 542!CHECK: acc.yield 543!CHECK-NEXT: }{{$}} 544!CHECK: acc.yield 545!CHECK-NEXT: }{{$}} 546 547 !$acc parallel loop vector(vectorLength) 548 DO i = 1, n 549 a(i) = b(i) 550 END DO 551 552!CHECK: acc.parallel { 553!CHECK: [[VECTORLENGTH:%.*]] = fir.load %{{.*}} : !fir.ref<i32> 554!CHECK: acc.loop vector([[VECTORLENGTH]]: i32) { 555!CHECK: fir.do_loop 556!CHECK: acc.yield 557!CHECK-NEXT: }{{$}} 558!CHECK: acc.yield 559!CHECK-NEXT: }{{$}} 560 561 !$acc parallel loop worker 562 DO i = 1, n 563 a(i) = b(i) 564 END DO 565 566!CHECK: acc.parallel { 567!CHECK: acc.loop worker { 568!CHECK: fir.do_loop 569!CHECK: acc.yield 570!CHECK-NEXT: }{{$}} 571!CHECK: acc.yield 572!CHECK-NEXT: }{{$}} 573 574 !$acc parallel loop worker(128) 575 DO i = 1, n 576 a(i) = b(i) 577 END DO 578 579!CHECK: acc.parallel { 580!CHECK: [[WORKER128:%.*]] = arith.constant 128 : i32 581!CHECK: acc.loop worker([[WORKER128]]: i32) { 582!CHECK: fir.do_loop 583!CHECK: acc.yield 584!CHECK-NEXT: }{{$}} 585!CHECK: acc.yield 586!CHECK-NEXT: }{{$}} 587 588 !$acc parallel loop collapse(2) 589 DO i = 1, n 590 DO j = 1, n 591 d(i, j) = e(i, j) 592 END DO 593 END DO 594 595!CHECK: acc.parallel { 596!CHECK: acc.loop { 597!CHECK: fir.do_loop 598!CHECK: fir.do_loop 599!CHECK: acc.yield 600!CHECK-NEXT: } attributes {collapse = 2 : i64} 601!CHECK: acc.yield 602!CHECK-NEXT: }{{$}} 603 604 !$acc parallel loop 605 DO i = 1, n 606 !$acc loop 607 DO j = 1, n 608 d(i, j) = e(i, j) 609 END DO 610 END DO 611 612!CHECK: acc.parallel { 613!CHECK: acc.loop { 614!CHECK: fir.do_loop 615!CHECK: acc.loop { 616!CHECK: fir.do_loop 617!CHECK: acc.yield 618!CHECK-NEXT: }{{$}} 619!CHECK: acc.yield 620!CHECK-NEXT: }{{$}} 621!CHECK: acc.yield 622!CHECK-NEXT: }{{$}} 623 624 !$acc parallel loop tile(2) 625 DO i = 1, n 626 a(i) = b(i) 627 END DO 628 629!CHECK: acc.parallel { 630!CHECK: [[TILESIZE:%.*]] = arith.constant 2 : i32 631!CHECK: acc.loop tile([[TILESIZE]]: i32) { 632!CHECK: fir.do_loop 633!CHECK: acc.yield 634!CHECK-NEXT: }{{$}} 635!CHECK: acc.yield 636!CHECK-NEXT: }{{$}} 637 638 !$acc parallel loop tile(*) 639 DO i = 1, n 640 a(i) = b(i) 641 END DO 642 643!CHECK: acc.parallel { 644!CHECK: [[TILESIZEM1:%.*]] = arith.constant -1 : i32 645!CHECK: acc.loop tile([[TILESIZEM1]]: i32) { 646!CHECK: fir.do_loop 647!CHECK: acc.yield 648!CHECK-NEXT: }{{$}} 649!CHECK: acc.yield 650!CHECK-NEXT: }{{$}} 651 652 !$acc parallel loop tile(2, 2) 653 DO i = 1, n 654 DO j = 1, n 655 d(i, j) = e(i, j) 656 END DO 657 END DO 658 659!CHECK: acc.parallel { 660!CHECK: [[TILESIZE1:%.*]] = arith.constant 2 : i32 661!CHECK: [[TILESIZE2:%.*]] = arith.constant 2 : i32 662!CHECK: acc.loop tile([[TILESIZE1]]: i32, [[TILESIZE2]]: i32) { 663!CHECK: fir.do_loop 664!CHECK: acc.yield 665!CHECK-NEXT: }{{$}} 666!CHECK: acc.yield 667!CHECK-NEXT: }{{$}} 668 669 !$acc parallel loop tile(tileSize) 670 DO i = 1, n 671 a(i) = b(i) 672 END DO 673 674!CHECK: acc.parallel { 675!CHECK: acc.loop tile(%{{.*}}: i32) { 676!CHECK: fir.do_loop 677!CHECK: acc.yield 678!CHECK-NEXT: }{{$}} 679!CHECK: acc.yield 680!CHECK-NEXT: }{{$}} 681 682 !$acc parallel loop tile(tileSize, tileSize) 683 DO i = 1, n 684 DO j = 1, n 685 d(i, j) = e(i, j) 686 END DO 687 END DO 688 689!CHECK: acc.parallel { 690!CHECK: acc.loop tile(%{{.*}}: i32, %{{.*}}: i32) { 691!CHECK: fir.do_loop 692!CHECK: acc.yield 693!CHECK-NEXT: }{{$}} 694!CHECK: acc.yield 695!CHECK-NEXT: }{{$}} 696 697end subroutine acc_parallel_loop 698