1// RUN: mlir-opt -test-spirv-module-combiner -split-input-file -verify-diagnostics %s | FileCheck %s 2 3// Test basic renaming of conflicting funcOps. 4 5// CHECK: module { 6// CHECK-NEXT: spirv.module Logical GLSL450 { 7// CHECK-NEXT: spirv.func @foo 8// CHECK-NEXT: spirv.ReturnValue 9// CHECK-NEXT: } 10 11// CHECK-NEXT: spirv.func @foo_1 12// CHECK-NEXT: spirv.ReturnValue 13// CHECK-NEXT: } 14// CHECK-NEXT: } 15// CHECK-NEXT: } 16 17module { 18spirv.module Logical GLSL450 { 19 spirv.func @foo(%arg0 : i32) -> i32 "None" { 20 spirv.ReturnValue %arg0 : i32 21 } 22} 23 24spirv.module Logical GLSL450 { 25 spirv.func @foo(%arg0 : f32) -> f32 "None" { 26 spirv.ReturnValue %arg0 : f32 27 } 28} 29} 30 31// ----- 32 33// Test basic renaming of conflicting funcOps across 3 modules. 34 35// CHECK: module { 36// CHECK-NEXT: spirv.module Logical GLSL450 { 37// CHECK-NEXT: spirv.func @foo 38// CHECK-NEXT: spirv.ReturnValue 39// CHECK-NEXT: } 40 41// CHECK-NEXT: spirv.func @foo_1 42// CHECK-NEXT: spirv.FAdd 43// CHECK-NEXT: spirv.ReturnValue 44// CHECK-NEXT: } 45 46// CHECK-NEXT: spirv.func @foo_2 47// CHECK-NEXT: spirv.ISub 48// CHECK-NEXT: spirv.ReturnValue 49// CHECK-NEXT: } 50// CHECK-NEXT: } 51// CHECK-NEXT: } 52 53module { 54spirv.module Logical GLSL450 { 55 spirv.func @foo(%arg0 : i32) -> i32 "None" { 56 spirv.ReturnValue %arg0 : i32 57 } 58} 59 60spirv.module Logical GLSL450 { 61 spirv.func @foo(%arg0 : f32) -> f32 "None" { 62 %0 = spirv.FAdd %arg0, %arg0 : f32 63 spirv.ReturnValue %0 : f32 64 } 65} 66 67spirv.module Logical GLSL450 { 68 spirv.func @foo(%arg0 : i32) -> i32 "None" { 69 %0 = spirv.ISub %arg0, %arg0 : i32 70 spirv.ReturnValue %0 : i32 71 } 72} 73} 74 75// ----- 76 77// Test properly updating references to a renamed funcOp. 78 79// CHECK: module { 80// CHECK-NEXT: spirv.module Logical GLSL450 { 81// CHECK-NEXT: spirv.func @foo 82// CHECK-NEXT: spirv.ReturnValue 83// CHECK-NEXT: } 84 85// CHECK-NEXT: spirv.func @foo_1 86// CHECK-NEXT: spirv.ReturnValue 87// CHECK-NEXT: } 88 89// CHECK-NEXT: spirv.func @bar 90// CHECK-NEXT: spirv.FunctionCall @foo_1 91// CHECK-NEXT: spirv.ReturnValue 92// CHECK-NEXT: } 93// CHECK-NEXT: } 94// CHECK-NEXT: } 95 96module { 97spirv.module Logical GLSL450 { 98 spirv.func @foo(%arg0 : i32) -> i32 "None" { 99 spirv.ReturnValue %arg0 : i32 100 } 101} 102 103spirv.module Logical GLSL450 { 104 spirv.func @foo(%arg0 : f32) -> f32 "None" { 105 spirv.ReturnValue %arg0 : f32 106 } 107 108 spirv.func @bar(%arg0 : f32) -> f32 "None" { 109 %0 = spirv.FunctionCall @foo(%arg0) : (f32) -> (f32) 110 spirv.ReturnValue %0 : f32 111 } 112} 113} 114 115// ----- 116 117// Test properly updating references to a renamed funcOp if the functionCallOp 118// preceeds the callee funcOp definition. 119 120// CHECK: module { 121// CHECK-NEXT: spirv.module Logical GLSL450 { 122// CHECK-NEXT: spirv.func @foo 123// CHECK-NEXT: spirv.ReturnValue 124// CHECK-NEXT: } 125 126// CHECK-NEXT: spirv.func @bar 127// CHECK-NEXT: spirv.FunctionCall @foo_1 128// CHECK-NEXT: spirv.ReturnValue 129// CHECK-NEXT: } 130 131// CHECK-NEXT: spirv.func @foo_1 132// CHECK-NEXT: spirv.ReturnValue 133// CHECK-NEXT: } 134// CHECK-NEXT: } 135// CHECK-NEXT: } 136 137module { 138spirv.module Logical GLSL450 { 139 spirv.func @foo(%arg0 : i32) -> i32 "None" { 140 spirv.ReturnValue %arg0 : i32 141 } 142} 143 144spirv.module Logical GLSL450 { 145 spirv.func @bar(%arg0 : f32) -> f32 "None" { 146 %0 = spirv.FunctionCall @foo(%arg0) : (f32) -> (f32) 147 spirv.ReturnValue %0 : f32 148 } 149 150 spirv.func @foo(%arg0 : f32) -> f32 "None" { 151 spirv.ReturnValue %arg0 : f32 152 } 153} 154} 155 156// ----- 157 158// Test properly updating entryPointOp and executionModeOp attached to renamed 159// funcOp. 160 161// CHECK: module { 162// CHECK-NEXT: spirv.module Logical GLSL450 { 163// CHECK-NEXT: spirv.func @foo 164// CHECK-NEXT: spirv.ReturnValue 165// CHECK-NEXT: } 166 167// CHECK-NEXT: spirv.func @foo_1 168// CHECK-NEXT: spirv.ReturnValue 169// CHECK-NEXT: } 170 171// CHECK-NEXT: spirv.EntryPoint "GLCompute" @foo_1 172// CHECK-NEXT: spirv.ExecutionMode @foo_1 "ContractionOff" 173// CHECK-NEXT: } 174// CHECK-NEXT: } 175 176module { 177spirv.module Logical GLSL450 { 178 spirv.func @foo(%arg0 : i32) -> i32 "None" { 179 spirv.ReturnValue %arg0 : i32 180 } 181} 182 183spirv.module Logical GLSL450 { 184 spirv.func @foo(%arg0 : f32) -> f32 "None" { 185 spirv.ReturnValue %arg0 : f32 186 } 187 188 spirv.EntryPoint "GLCompute" @foo 189 spirv.ExecutionMode @foo "ContractionOff" 190} 191} 192 193// ----- 194 195// CHECK: module { 196// CHECK-NEXT: spirv.module Logical GLSL450 { 197// CHECK-NEXT: spirv.func @foo 198// CHECK-NEXT: spirv.ReturnValue 199// CHECK-NEXT: } 200 201// CHECK-NEXT: spirv.EntryPoint "GLCompute" @fo 202// CHECK-NEXT: spirv.ExecutionMode @foo "ContractionOff" 203 204// CHECK-NEXT: spirv.func @foo_1 205// CHECK-NEXT: spirv.ReturnValue 206// CHECK-NEXT: } 207 208// CHECK-NEXT: spirv.EntryPoint "GLCompute" @foo_1 209// CHECK-NEXT: spirv.ExecutionMode @foo_1 "ContractionOff" 210// CHECK-NEXT: } 211// CHECK-NEXT: } 212 213module { 214spirv.module Logical GLSL450 { 215 spirv.func @foo(%arg0 : i32) -> i32 "None" { 216 spirv.ReturnValue %arg0 : i32 217 } 218 219 spirv.EntryPoint "GLCompute" @foo 220 spirv.ExecutionMode @foo "ContractionOff" 221} 222 223spirv.module Logical GLSL450 { 224 spirv.func @foo(%arg0 : f32) -> f32 "None" { 225 spirv.ReturnValue %arg0 : f32 226 } 227 228 spirv.EntryPoint "GLCompute" @foo 229 spirv.ExecutionMode @foo "ContractionOff" 230} 231} 232 233// ----- 234 235// Resolve conflicting funcOp and globalVariableOp. 236 237// CHECK: module { 238// CHECK-NEXT: spirv.module Logical GLSL450 { 239// CHECK-NEXT: spirv.func @foo 240// CHECK-NEXT: spirv.ReturnValue 241// CHECK-NEXT: } 242 243// CHECK-NEXT: spirv.GlobalVariable @foo_1 244// CHECK-NEXT: } 245 246module { 247spirv.module Logical GLSL450 { 248 spirv.func @foo(%arg0 : i32) -> i32 "None" { 249 spirv.ReturnValue %arg0 : i32 250 } 251} 252 253spirv.module Logical GLSL450 { 254 spirv.GlobalVariable @foo bind(1, 0) : !spirv.ptr<f32, Input> 255} 256} 257 258// ----- 259 260// Resolve conflicting funcOp and globalVariableOp and update the global variable's 261// references. 262 263// CHECK: module { 264// CHECK-NEXT: spirv.module Logical GLSL450 { 265// CHECK-NEXT: spirv.func @foo 266// CHECK-NEXT: spirv.ReturnValue 267// CHECK-NEXT: } 268 269// CHECK-NEXT: spirv.GlobalVariable @foo_1 270// CHECK-NEXT: spirv.func @bar 271// CHECK-NEXT: spirv.mlir.addressof @foo_1 272// CHECK-NEXT: spirv.Load 273// CHECK-NEXT: spirv.ReturnValue 274// CHECK-NEXT: } 275// CHECK-NEXT: } 276 277module { 278spirv.module Logical GLSL450 { 279 spirv.func @foo(%arg0 : i32) -> i32 "None" { 280 spirv.ReturnValue %arg0 : i32 281 } 282} 283 284spirv.module Logical GLSL450 { 285 spirv.GlobalVariable @foo bind(1, 0) : !spirv.ptr<f32, Input> 286 287 spirv.func @bar() -> f32 "None" { 288 %0 = spirv.mlir.addressof @foo : !spirv.ptr<f32, Input> 289 %1 = spirv.Load "Input" %0 : f32 290 spirv.ReturnValue %1 : f32 291 } 292} 293} 294 295// ----- 296 297// Resolve conflicting globalVariableOp and funcOp and update the global variable's 298// references. 299 300// CHECK: module { 301// CHECK-NEXT: spirv.module Logical GLSL450 { 302// CHECK-NEXT: spirv.GlobalVariable @foo_1 303// CHECK-NEXT: spirv.func @bar 304// CHECK-NEXT: spirv.mlir.addressof @foo_1 305// CHECK-NEXT: spirv.Load 306// CHECK-NEXT: spirv.ReturnValue 307// CHECK-NEXT: } 308 309// CHECK-NEXT: spirv.func @foo 310// CHECK-NEXT: spirv.ReturnValue 311// CHECK-NEXT: } 312// CHECK-NEXT: } 313 314module { 315spirv.module Logical GLSL450 { 316 spirv.GlobalVariable @foo bind(1, 0) : !spirv.ptr<f32, Input> 317 318 spirv.func @bar() -> f32 "None" { 319 %0 = spirv.mlir.addressof @foo : !spirv.ptr<f32, Input> 320 %1 = spirv.Load "Input" %0 : f32 321 spirv.ReturnValue %1 : f32 322 } 323} 324 325spirv.module Logical GLSL450 { 326 spirv.func @foo(%arg0 : i32) -> i32 "None" { 327 spirv.ReturnValue %arg0 : i32 328 } 329} 330} 331 332// ----- 333 334// Resolve conflicting funcOp and specConstantOp. 335 336// CHECK: module { 337// CHECK-NEXT: spirv.module Logical GLSL450 { 338// CHECK-NEXT: spirv.func @foo 339// CHECK-NEXT: spirv.ReturnValue 340// CHECK-NEXT: } 341 342// CHECK-NEXT: spirv.SpecConstant @foo_1 343// CHECK-NEXT: } 344 345module { 346spirv.module Logical GLSL450 { 347 spirv.func @foo(%arg0 : i32) -> i32 "None" { 348 spirv.ReturnValue %arg0 : i32 349 } 350} 351 352spirv.module Logical GLSL450 { 353 spirv.SpecConstant @foo = -5 : i32 354} 355} 356 357// ----- 358 359// Resolve conflicting funcOp and specConstantOp and update the spec constant's 360// references. 361 362// CHECK: module { 363// CHECK-NEXT: spirv.module Logical GLSL450 { 364// CHECK-NEXT: spirv.func @foo 365// CHECK-NEXT: spirv.ReturnValue 366// CHECK-NEXT: } 367 368// CHECK-NEXT: spirv.SpecConstant @foo_1 369// CHECK-NEXT: spirv.func @bar 370// CHECK-NEXT: spirv.mlir.referenceof @foo_1 371// CHECK-NEXT: spirv.ReturnValue 372// CHECK-NEXT: } 373// CHECK-NEXT: } 374 375module { 376spirv.module Logical GLSL450 { 377 spirv.func @foo(%arg0 : i32) -> i32 "None" { 378 spirv.ReturnValue %arg0 : i32 379 } 380} 381 382spirv.module Logical GLSL450 { 383 spirv.SpecConstant @foo = -5 : i32 384 385 spirv.func @bar() -> i32 "None" { 386 %0 = spirv.mlir.referenceof @foo : i32 387 spirv.ReturnValue %0 : i32 388 } 389} 390} 391 392// ----- 393 394// Resolve conflicting specConstantOp and funcOp and update the spec constant's 395// references. 396 397// CHECK: module { 398// CHECK-NEXT: spirv.module Logical GLSL450 { 399// CHECK-NEXT: spirv.SpecConstant @foo_1 400// CHECK-NEXT: spirv.func @bar 401// CHECK-NEXT: spirv.mlir.referenceof @foo_1 402// CHECK-NEXT: spirv.ReturnValue 403// CHECK-NEXT: } 404 405// CHECK-NEXT: spirv.func @foo 406// CHECK-NEXT: spirv.ReturnValue 407// CHECK-NEXT: } 408// CHECK-NEXT: } 409 410module { 411spirv.module Logical GLSL450 { 412 spirv.SpecConstant @foo = -5 : i32 413 414 spirv.func @bar() -> i32 "None" { 415 %0 = spirv.mlir.referenceof @foo : i32 416 spirv.ReturnValue %0 : i32 417 } 418} 419 420spirv.module Logical GLSL450 { 421 spirv.func @foo(%arg0 : i32) -> i32 "None" { 422 spirv.ReturnValue %arg0 : i32 423 } 424} 425} 426 427// ----- 428 429// Resolve conflicting funcOp and specConstantCompositeOp. 430 431// CHECK: module { 432// CHECK-NEXT: spirv.module Logical GLSL450 { 433// CHECK-NEXT: spirv.func @foo 434// CHECK-NEXT: spirv.ReturnValue 435// CHECK-NEXT: } 436 437// CHECK-NEXT: spirv.SpecConstant @bar 438// CHECK-NEXT: spirv.SpecConstantComposite @foo_1 (@bar, @bar) 439// CHECK-NEXT: } 440 441module { 442spirv.module Logical GLSL450 { 443 spirv.func @foo(%arg0 : i32) -> i32 "None" { 444 spirv.ReturnValue %arg0 : i32 445 } 446} 447 448spirv.module Logical GLSL450 { 449 spirv.SpecConstant @bar = -5 : i32 450 spirv.SpecConstantComposite @foo (@bar, @bar) : !spirv.array<2 x i32> 451} 452} 453 454// ----- 455 456// Resolve conflicting funcOp and specConstantCompositeOp and update the spec 457// constant's references. 458 459// CHECK: module { 460// CHECK-NEXT: spirv.module Logical GLSL450 { 461// CHECK-NEXT: spirv.func @foo 462// CHECK-NEXT: spirv.ReturnValue 463// CHECK-NEXT: } 464 465// CHECK-NEXT: spirv.SpecConstant @bar 466// CHECK-NEXT: spirv.SpecConstantComposite @foo_1 (@bar, @bar) 467// CHECK-NEXT: spirv.func @baz 468// CHECK-NEXT: spirv.mlir.referenceof @foo_1 469// CHECK-NEXT: spirv.CompositeExtract 470// CHECK-NEXT: spirv.ReturnValue 471// CHECK-NEXT: } 472// CHECK-NEXT: } 473 474module { 475spirv.module Logical GLSL450 { 476 spirv.func @foo(%arg0 : i32) -> i32 "None" { 477 spirv.ReturnValue %arg0 : i32 478 } 479} 480 481spirv.module Logical GLSL450 { 482 spirv.SpecConstant @bar = -5 : i32 483 spirv.SpecConstantComposite @foo (@bar, @bar) : !spirv.array<2 x i32> 484 485 spirv.func @baz() -> i32 "None" { 486 %0 = spirv.mlir.referenceof @foo : !spirv.array<2 x i32> 487 %1 = spirv.CompositeExtract %0[0 : i32] : !spirv.array<2 x i32> 488 spirv.ReturnValue %1 : i32 489 } 490} 491} 492 493// ----- 494 495// Resolve conflicting specConstantCompositeOp and funcOp and update the spec 496// constant's references. 497 498// CHECK: module { 499// CHECK-NEXT: spirv.module Logical GLSL450 { 500// CHECK-NEXT: spirv.SpecConstant @bar 501// CHECK-NEXT: spirv.SpecConstantComposite @foo_1 (@bar, @bar) 502// CHECK-NEXT: spirv.func @baz 503// CHECK-NEXT: spirv.mlir.referenceof @foo_1 504// CHECK-NEXT: spirv.CompositeExtract 505// CHECK-NEXT: spirv.ReturnValue 506// CHECK-NEXT: } 507 508// CHECK-NEXT: spirv.func @foo 509// CHECK-NEXT: spirv.ReturnValue 510// CHECK-NEXT: } 511// CHECK-NEXT: } 512 513module { 514spirv.module Logical GLSL450 { 515 spirv.SpecConstant @bar = -5 : i32 516 spirv.SpecConstantComposite @foo (@bar, @bar) : !spirv.array<2 x i32> 517 518 spirv.func @baz() -> i32 "None" { 519 %0 = spirv.mlir.referenceof @foo : !spirv.array<2 x i32> 520 %1 = spirv.CompositeExtract %0[0 : i32] : !spirv.array<2 x i32> 521 spirv.ReturnValue %1 : i32 522 } 523} 524 525spirv.module Logical GLSL450 { 526 spirv.func @foo(%arg0 : i32) -> i32 "None" { 527 spirv.ReturnValue %arg0 : i32 528 } 529} 530} 531 532// ----- 533 534// Resolve conflicting spec constants and funcOps and update the spec constant's 535// references. 536 537// CHECK: module { 538// CHECK-NEXT: spirv.module Logical GLSL450 { 539// CHECK-NEXT: spirv.SpecConstant @bar_1 540// CHECK-NEXT: spirv.SpecConstantComposite @foo_2 (@bar_1, @bar_1) 541// CHECK-NEXT: spirv.func @baz 542// CHECK-NEXT: spirv.mlir.referenceof @foo_2 543// CHECK-NEXT: spirv.CompositeExtract 544// CHECK-NEXT: spirv.ReturnValue 545// CHECK-NEXT: } 546 547// CHECK-NEXT: spirv.func @foo 548// CHECK-NEXT: spirv.ReturnValue 549// CHECK-NEXT: } 550 551// CHECK-NEXT: spirv.func @bar 552// CHECK-NEXT: spirv.ReturnValue 553// CHECK-NEXT: } 554// CHECK-NEXT: } 555 556module { 557spirv.module Logical GLSL450 { 558 spirv.SpecConstant @bar = -5 : i32 559 spirv.SpecConstantComposite @foo (@bar, @bar) : !spirv.array<2 x i32> 560 561 spirv.func @baz() -> i32 "None" { 562 %0 = spirv.mlir.referenceof @foo : !spirv.array<2 x i32> 563 %1 = spirv.CompositeExtract %0[0 : i32] : !spirv.array<2 x i32> 564 spirv.ReturnValue %1 : i32 565 } 566} 567 568spirv.module Logical GLSL450 { 569 spirv.func @foo(%arg0 : i32) -> i32 "None" { 570 spirv.ReturnValue %arg0 : i32 571 } 572 573 spirv.func @bar(%arg0 : f32) -> f32 "None" { 574 spirv.ReturnValue %arg0 : f32 575 } 576} 577} 578 579// ----- 580 581// Resolve conflicting globalVariableOps. 582 583// CHECK: module { 584// CHECK-NEXT: spirv.module Logical GLSL450 { 585// CHECK-NEXT: spirv.GlobalVariable @foo_1 bind(1, 0) 586 587// CHECK-NEXT: spirv.GlobalVariable @foo bind(2, 0) 588// CHECK-NEXT: } 589 590module { 591spirv.module Logical GLSL450 { 592 spirv.GlobalVariable @foo bind(1, 0) : !spirv.ptr<f32, Input> 593} 594 595spirv.module Logical GLSL450 { 596 spirv.GlobalVariable @foo bind(2, 0) : !spirv.ptr<f32, Input> 597} 598} 599 600// ----- 601 602// CHECK: module { 603// CHECK-NEXT: spirv.module Logical GLSL450 { 604// CHECK-NEXT: spirv.GlobalVariable @foo_1 built_in("GlobalInvocationId") 605 606// CHECK-NEXT: spirv.GlobalVariable @foo built_in("LocalInvocationId") 607// CHECK-NEXT: } 608 609module { 610spirv.module Logical GLSL450 { 611 spirv.GlobalVariable @foo built_in("GlobalInvocationId") : !spirv.ptr<vector<3xi32>, Input> 612} 613 614spirv.module Logical GLSL450 { 615 spirv.GlobalVariable @foo built_in("LocalInvocationId") : !spirv.ptr<vector<3xi32>, Input> 616} 617} 618 619// ----- 620 621// Resolve conflicting globalVariableOp and specConstantOp. 622 623// CHECK: module { 624// CHECK-NEXT: spirv.module Logical GLSL450 { 625// CHECK-NEXT: spirv.GlobalVariable @foo_1 626 627// CHECK-NEXT: spirv.SpecConstant @foo 628// CHECK-NEXT: } 629 630module { 631spirv.module Logical GLSL450 { 632 spirv.GlobalVariable @foo bind(1, 0) : !spirv.ptr<f32, Input> 633} 634 635spirv.module Logical GLSL450 { 636 spirv.SpecConstant @foo = -5 : i32 637} 638} 639 640// ----- 641 642// Resolve conflicting specConstantOp and globalVariableOp. 643 644// CHECK: module { 645// CHECK-NEXT: spirv.module Logical GLSL450 { 646// CHECK-NEXT: spirv.SpecConstant @foo_1 647 648// CHECK-NEXT: spirv.GlobalVariable @foo 649// CHECK-NEXT: } 650 651module { 652spirv.module Logical GLSL450 { 653 spirv.SpecConstant @foo = -5 : i32 654} 655 656spirv.module Logical GLSL450 { 657 spirv.GlobalVariable @foo bind(1, 0) : !spirv.ptr<f32, Input> 658} 659} 660 661// ----- 662 663// Resolve conflicting globalVariableOp and specConstantCompositeOp. 664 665// CHECK: module { 666// CHECK-NEXT: spirv.module Logical GLSL450 { 667// CHECK-NEXT: spirv.GlobalVariable @foo_1 668 669// CHECK-NEXT: spirv.SpecConstant @bar 670// CHECK-NEXT: spirv.SpecConstantComposite @foo (@bar, @bar) 671// CHECK-NEXT: } 672 673module { 674spirv.module Logical GLSL450 { 675 spirv.GlobalVariable @foo bind(1, 0) : !spirv.ptr<f32, Input> 676} 677 678spirv.module Logical GLSL450 { 679 spirv.SpecConstant @bar = -5 : i32 680 spirv.SpecConstantComposite @foo (@bar, @bar) : !spirv.array<2 x i32> 681} 682} 683 684// ----- 685 686// Resolve conflicting globalVariableOp and specConstantComposite. 687 688// CHECK: module { 689// CHECK-NEXT: spirv.module Logical GLSL450 { 690// CHECK-NEXT: spirv.SpecConstant @bar 691// CHECK-NEXT: spirv.SpecConstantComposite @foo_1 (@bar, @bar) 692 693// CHECK-NEXT: spirv.GlobalVariable @foo 694// CHECK-NEXT: } 695 696module { 697spirv.module Logical GLSL450 { 698 spirv.SpecConstant @bar = -5 : i32 699 spirv.SpecConstantComposite @foo (@bar, @bar) : !spirv.array<2 x i32> 700} 701 702spirv.module Logical GLSL450 { 703 spirv.GlobalVariable @foo bind(1, 0) : !spirv.ptr<f32, Input> 704} 705} 706