706 lines · plain
1// RUN: mlir-opt -test-spirv-module-combiner -split-input-file -verify-diagnostics %s | FileCheck %s2 3// Test basic renaming of conflicting funcOps.4 5// CHECK: module {6// CHECK-NEXT: spirv.module Logical GLSL450 {7// CHECK-NEXT: spirv.func @foo8// CHECK-NEXT: spirv.ReturnValue9// CHECK-NEXT: }10 11// CHECK-NEXT: spirv.func @foo_112// CHECK-NEXT: spirv.ReturnValue13// 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 : i3221 }22}23 24spirv.module Logical GLSL450 {25 spirv.func @foo(%arg0 : f32) -> f32 "None" {26 spirv.ReturnValue %arg0 : f3227 }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 @foo38// CHECK-NEXT: spirv.ReturnValue39// CHECK-NEXT: }40 41// CHECK-NEXT: spirv.func @foo_142// CHECK-NEXT: spirv.FAdd43// CHECK-NEXT: spirv.ReturnValue44// CHECK-NEXT: }45 46// CHECK-NEXT: spirv.func @foo_247// CHECK-NEXT: spirv.ISub48// CHECK-NEXT: spirv.ReturnValue49// 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 : i3257 }58}59 60spirv.module Logical GLSL450 {61 spirv.func @foo(%arg0 : f32) -> f32 "None" {62 %0 = spirv.FAdd %arg0, %arg0 : f3263 spirv.ReturnValue %0 : f3264 }65}66 67spirv.module Logical GLSL450 {68 spirv.func @foo(%arg0 : i32) -> i32 "None" {69 %0 = spirv.ISub %arg0, %arg0 : i3270 spirv.ReturnValue %0 : i3271 }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 @foo82// CHECK-NEXT: spirv.ReturnValue83// CHECK-NEXT: }84 85// CHECK-NEXT: spirv.func @foo_186// CHECK-NEXT: spirv.ReturnValue87// CHECK-NEXT: }88 89// CHECK-NEXT: spirv.func @bar90// CHECK-NEXT: spirv.FunctionCall @foo_191// CHECK-NEXT: spirv.ReturnValue92// 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 : i32100 }101}102 103spirv.module Logical GLSL450 {104 spirv.func @foo(%arg0 : f32) -> f32 "None" {105 spirv.ReturnValue %arg0 : f32106 }107 108 spirv.func @bar(%arg0 : f32) -> f32 "None" {109 %0 = spirv.FunctionCall @foo(%arg0) : (f32) -> (f32)110 spirv.ReturnValue %0 : f32111 }112}113}114 115// -----116 117// Test properly updating references to a renamed funcOp if the functionCallOp118// preceeds the callee funcOp definition.119 120// CHECK: module {121// CHECK-NEXT: spirv.module Logical GLSL450 {122// CHECK-NEXT: spirv.func @foo123// CHECK-NEXT: spirv.ReturnValue124// CHECK-NEXT: }125 126// CHECK-NEXT: spirv.func @bar127// CHECK-NEXT: spirv.FunctionCall @foo_1128// CHECK-NEXT: spirv.ReturnValue129// CHECK-NEXT: }130 131// CHECK-NEXT: spirv.func @foo_1132// CHECK-NEXT: spirv.ReturnValue133// 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 : i32141 }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 : f32148 }149 150 spirv.func @foo(%arg0 : f32) -> f32 "None" {151 spirv.ReturnValue %arg0 : f32152 }153}154}155 156// -----157 158// Test properly updating entryPointOp and executionModeOp attached to renamed159// funcOp.160 161// CHECK: module {162// CHECK-NEXT: spirv.module Logical GLSL450 {163// CHECK-NEXT: spirv.func @foo164// CHECK-NEXT: spirv.ReturnValue165// CHECK-NEXT: }166 167// CHECK-NEXT: spirv.func @foo_1168// CHECK-NEXT: spirv.ReturnValue169// CHECK-NEXT: }170 171// CHECK-NEXT: spirv.EntryPoint "GLCompute" @foo_1172// 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 : i32180 }181}182 183spirv.module Logical GLSL450 {184 spirv.func @foo(%arg0 : f32) -> f32 "None" {185 spirv.ReturnValue %arg0 : f32186 }187 188 spirv.EntryPoint "GLCompute" @foo189 spirv.ExecutionMode @foo "ContractionOff"190}191}192 193// -----194 195// CHECK: module {196// CHECK-NEXT: spirv.module Logical GLSL450 {197// CHECK-NEXT: spirv.func @foo198// CHECK-NEXT: spirv.ReturnValue199// CHECK-NEXT: }200 201// CHECK-NEXT: spirv.EntryPoint "GLCompute" @fo202// CHECK-NEXT: spirv.ExecutionMode @foo "ContractionOff"203 204// CHECK-NEXT: spirv.func @foo_1205// CHECK-NEXT: spirv.ReturnValue206// CHECK-NEXT: }207 208// CHECK-NEXT: spirv.EntryPoint "GLCompute" @foo_1209// 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 : i32217 }218 219 spirv.EntryPoint "GLCompute" @foo220 spirv.ExecutionMode @foo "ContractionOff"221}222 223spirv.module Logical GLSL450 {224 spirv.func @foo(%arg0 : f32) -> f32 "None" {225 spirv.ReturnValue %arg0 : f32226 }227 228 spirv.EntryPoint "GLCompute" @foo229 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 @foo240// CHECK-NEXT: spirv.ReturnValue241// CHECK-NEXT: }242 243// CHECK-NEXT: spirv.GlobalVariable @foo_1244// CHECK-NEXT: }245 246module {247spirv.module Logical GLSL450 {248 spirv.func @foo(%arg0 : i32) -> i32 "None" {249 spirv.ReturnValue %arg0 : i32250 }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's261// references.262 263// CHECK: module {264// CHECK-NEXT: spirv.module Logical GLSL450 {265// CHECK-NEXT: spirv.func @foo266// CHECK-NEXT: spirv.ReturnValue267// CHECK-NEXT: }268 269// CHECK-NEXT: spirv.GlobalVariable @foo_1270// CHECK-NEXT: spirv.func @bar271// CHECK-NEXT: spirv.mlir.addressof @foo_1272// CHECK-NEXT: spirv.Load273// CHECK-NEXT: spirv.ReturnValue274// CHECK-NEXT: }275// CHECK-NEXT: }276 277module {278spirv.module Logical GLSL450 {279 spirv.func @foo(%arg0 : i32) -> i32 "None" {280 spirv.ReturnValue %arg0 : i32281 }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 : f32290 spirv.ReturnValue %1 : f32291 }292}293}294 295// -----296 297// Resolve conflicting globalVariableOp and funcOp and update the global variable's298// references.299 300// CHECK: module {301// CHECK-NEXT: spirv.module Logical GLSL450 {302// CHECK-NEXT: spirv.GlobalVariable @foo_1303// CHECK-NEXT: spirv.func @bar304// CHECK-NEXT: spirv.mlir.addressof @foo_1305// CHECK-NEXT: spirv.Load306// CHECK-NEXT: spirv.ReturnValue307// CHECK-NEXT: }308 309// CHECK-NEXT: spirv.func @foo310// CHECK-NEXT: spirv.ReturnValue311// 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 : f32321 spirv.ReturnValue %1 : f32322 }323}324 325spirv.module Logical GLSL450 {326 spirv.func @foo(%arg0 : i32) -> i32 "None" {327 spirv.ReturnValue %arg0 : i32328 }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 @foo339// CHECK-NEXT: spirv.ReturnValue340// CHECK-NEXT: }341 342// CHECK-NEXT: spirv.SpecConstant @foo_1343// CHECK-NEXT: }344 345module {346spirv.module Logical GLSL450 {347 spirv.func @foo(%arg0 : i32) -> i32 "None" {348 spirv.ReturnValue %arg0 : i32349 }350}351 352spirv.module Logical GLSL450 {353 spirv.SpecConstant @foo = -5 : i32354}355}356 357// -----358 359// Resolve conflicting funcOp and specConstantOp and update the spec constant's360// references.361 362// CHECK: module {363// CHECK-NEXT: spirv.module Logical GLSL450 {364// CHECK-NEXT: spirv.func @foo365// CHECK-NEXT: spirv.ReturnValue366// CHECK-NEXT: }367 368// CHECK-NEXT: spirv.SpecConstant @foo_1369// CHECK-NEXT: spirv.func @bar370// CHECK-NEXT: spirv.mlir.referenceof @foo_1371// CHECK-NEXT: spirv.ReturnValue372// CHECK-NEXT: }373// CHECK-NEXT: }374 375module {376spirv.module Logical GLSL450 {377 spirv.func @foo(%arg0 : i32) -> i32 "None" {378 spirv.ReturnValue %arg0 : i32379 }380}381 382spirv.module Logical GLSL450 {383 spirv.SpecConstant @foo = -5 : i32384 385 spirv.func @bar() -> i32 "None" {386 %0 = spirv.mlir.referenceof @foo : i32387 spirv.ReturnValue %0 : i32388 }389}390}391 392// -----393 394// Resolve conflicting specConstantOp and funcOp and update the spec constant's395// references.396 397// CHECK: module {398// CHECK-NEXT: spirv.module Logical GLSL450 {399// CHECK-NEXT: spirv.SpecConstant @foo_1400// CHECK-NEXT: spirv.func @bar401// CHECK-NEXT: spirv.mlir.referenceof @foo_1402// CHECK-NEXT: spirv.ReturnValue403// CHECK-NEXT: }404 405// CHECK-NEXT: spirv.func @foo406// CHECK-NEXT: spirv.ReturnValue407// CHECK-NEXT: }408// CHECK-NEXT: }409 410module {411spirv.module Logical GLSL450 {412 spirv.SpecConstant @foo = -5 : i32413 414 spirv.func @bar() -> i32 "None" {415 %0 = spirv.mlir.referenceof @foo : i32416 spirv.ReturnValue %0 : i32417 }418}419 420spirv.module Logical GLSL450 {421 spirv.func @foo(%arg0 : i32) -> i32 "None" {422 spirv.ReturnValue %arg0 : i32423 }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 @foo434// CHECK-NEXT: spirv.ReturnValue435// CHECK-NEXT: }436 437// CHECK-NEXT: spirv.SpecConstant @bar438// 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 : i32445 }446}447 448spirv.module Logical GLSL450 {449 spirv.SpecConstant @bar = -5 : i32450 spirv.SpecConstantComposite @foo (@bar, @bar) : !spirv.array<2 x i32>451}452}453 454// -----455 456// Resolve conflicting funcOp and specConstantCompositeOp and update the spec457// constant's references.458 459// CHECK: module {460// CHECK-NEXT: spirv.module Logical GLSL450 {461// CHECK-NEXT: spirv.func @foo462// CHECK-NEXT: spirv.ReturnValue463// CHECK-NEXT: }464 465// CHECK-NEXT: spirv.SpecConstant @bar466// CHECK-NEXT: spirv.SpecConstantComposite @foo_1 (@bar, @bar)467// CHECK-NEXT: spirv.func @baz468// CHECK-NEXT: spirv.mlir.referenceof @foo_1469// CHECK-NEXT: spirv.CompositeExtract470// CHECK-NEXT: spirv.ReturnValue471// CHECK-NEXT: }472// CHECK-NEXT: }473 474module {475spirv.module Logical GLSL450 {476 spirv.func @foo(%arg0 : i32) -> i32 "None" {477 spirv.ReturnValue %arg0 : i32478 }479}480 481spirv.module Logical GLSL450 {482 spirv.SpecConstant @bar = -5 : i32483 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 : i32489 }490}491}492 493// -----494 495// Resolve conflicting specConstantCompositeOp and funcOp and update the spec496// constant's references.497 498// CHECK: module {499// CHECK-NEXT: spirv.module Logical GLSL450 {500// CHECK-NEXT: spirv.SpecConstant @bar501// CHECK-NEXT: spirv.SpecConstantComposite @foo_1 (@bar, @bar)502// CHECK-NEXT: spirv.func @baz503// CHECK-NEXT: spirv.mlir.referenceof @foo_1504// CHECK-NEXT: spirv.CompositeExtract505// CHECK-NEXT: spirv.ReturnValue506// CHECK-NEXT: }507 508// CHECK-NEXT: spirv.func @foo509// CHECK-NEXT: spirv.ReturnValue510// CHECK-NEXT: }511// CHECK-NEXT: }512 513module {514spirv.module Logical GLSL450 {515 spirv.SpecConstant @bar = -5 : i32516 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 : i32522 }523}524 525spirv.module Logical GLSL450 {526 spirv.func @foo(%arg0 : i32) -> i32 "None" {527 spirv.ReturnValue %arg0 : i32528 }529}530}531 532// -----533 534// Resolve conflicting spec constants and funcOps and update the spec constant's535// references.536 537// CHECK: module {538// CHECK-NEXT: spirv.module Logical GLSL450 {539// CHECK-NEXT: spirv.SpecConstant @bar_1540// CHECK-NEXT: spirv.SpecConstantComposite @foo_2 (@bar_1, @bar_1)541// CHECK-NEXT: spirv.func @baz542// CHECK-NEXT: spirv.mlir.referenceof @foo_2543// CHECK-NEXT: spirv.CompositeExtract544// CHECK-NEXT: spirv.ReturnValue545// CHECK-NEXT: }546 547// CHECK-NEXT: spirv.func @foo548// CHECK-NEXT: spirv.ReturnValue549// CHECK-NEXT: }550 551// CHECK-NEXT: spirv.func @bar552// CHECK-NEXT: spirv.ReturnValue553// CHECK-NEXT: }554// CHECK-NEXT: }555 556module {557spirv.module Logical GLSL450 {558 spirv.SpecConstant @bar = -5 : i32559 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 : i32565 }566}567 568spirv.module Logical GLSL450 {569 spirv.func @foo(%arg0 : i32) -> i32 "None" {570 spirv.ReturnValue %arg0 : i32571 }572 573 spirv.func @bar(%arg0 : f32) -> f32 "None" {574 spirv.ReturnValue %arg0 : f32575 }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_1626 627// CHECK-NEXT: spirv.SpecConstant @foo628// 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 : i32637}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_1647 648// CHECK-NEXT: spirv.GlobalVariable @foo649// CHECK-NEXT: }650 651module {652spirv.module Logical GLSL450 {653 spirv.SpecConstant @foo = -5 : i32654}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_1668 669// CHECK-NEXT: spirv.SpecConstant @bar670// 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 : i32680 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 @bar691// CHECK-NEXT: spirv.SpecConstantComposite @foo_1 (@bar, @bar)692 693// CHECK-NEXT: spirv.GlobalVariable @foo694// CHECK-NEXT: }695 696module {697spirv.module Logical GLSL450 {698 spirv.SpecConstant @bar = -5 : i32699 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