101178654SLei Zhang// RUN: mlir-opt -test-spirv-module-combiner -split-input-file -verify-diagnostics %s | FileCheck %s 201178654SLei Zhang 301178654SLei Zhang// Deduplicate 2 global variables with the same descriptor set and binding. 401178654SLei Zhang 501178654SLei Zhang// CHECK: module { 65ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.module Logical GLSL450 { 75ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.GlobalVariable @foo 801178654SLei Zhang 95ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.func @use_foo 105ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.mlir.addressof @foo 115ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.Load 125ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.ReturnValue 1301178654SLei Zhang// CHECK-NEXT: } 1401178654SLei Zhang 155ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.func @use_bar 165ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.mlir.addressof @foo 175ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.Load 185ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.FAdd 195ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.ReturnValue 2001178654SLei Zhang// CHECK-NEXT: } 2101178654SLei Zhang// CHECK-NEXT: } 2201178654SLei Zhang// CHECK-NEXT: } 2301178654SLei Zhang 245ab6ef75SJakub Kuderskispirv.module Logical GLSL450 { 255ab6ef75SJakub Kuderski spirv.GlobalVariable @foo bind(1, 0) : !spirv.ptr<f32, Input> 2601178654SLei Zhang 275ab6ef75SJakub Kuderski spirv.func @use_foo() -> f32 "None" { 285ab6ef75SJakub Kuderski %0 = spirv.mlir.addressof @foo : !spirv.ptr<f32, Input> 295ab6ef75SJakub Kuderski %1 = spirv.Load "Input" %0 : f32 305ab6ef75SJakub Kuderski spirv.ReturnValue %1 : f32 3101178654SLei Zhang } 3201178654SLei Zhang} 3301178654SLei Zhang 345ab6ef75SJakub Kuderskispirv.module Logical GLSL450 { 355ab6ef75SJakub Kuderski spirv.GlobalVariable @bar bind(1, 0) : !spirv.ptr<f32, Input> 3601178654SLei Zhang 375ab6ef75SJakub Kuderski spirv.func @use_bar() -> f32 "None" { 385ab6ef75SJakub Kuderski %0 = spirv.mlir.addressof @bar : !spirv.ptr<f32, Input> 395ab6ef75SJakub Kuderski %1 = spirv.Load "Input" %0 : f32 405ab6ef75SJakub Kuderski %2 = spirv.FAdd %1, %1 : f32 415ab6ef75SJakub Kuderski spirv.ReturnValue %2 : f32 4201178654SLei Zhang } 4301178654SLei Zhang} 4401178654SLei Zhang 4501178654SLei Zhang// ----- 4601178654SLei Zhang 4701178654SLei Zhang// Deduplicate 2 global variables with the same descriptor set and binding but different types. 4801178654SLei Zhang 4901178654SLei Zhang// CHECK: module { 505ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.module Logical GLSL450 { 515ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.GlobalVariable @foo bind(1, 0) 5201178654SLei Zhang 535ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.GlobalVariable @bar bind(1, 0) 5401178654SLei Zhang 555ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.func @use_bar 565ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.mlir.addressof @bar 575ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.Load 585ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.ReturnValue 5901178654SLei Zhang// CHECK-NEXT: } 6001178654SLei Zhang// CHECK-NEXT: } 6101178654SLei Zhang// CHECK-NEXT: } 6201178654SLei Zhang 635ab6ef75SJakub Kuderskispirv.module Logical GLSL450 { 645ab6ef75SJakub Kuderski spirv.GlobalVariable @foo bind(1, 0) : !spirv.ptr<i32, Input> 6501178654SLei Zhang} 6601178654SLei Zhang 675ab6ef75SJakub Kuderskispirv.module Logical GLSL450 { 685ab6ef75SJakub Kuderski spirv.GlobalVariable @bar bind(1, 0) : !spirv.ptr<f32, Input> 6901178654SLei Zhang 705ab6ef75SJakub Kuderski spirv.func @use_bar() -> f32 "None" { 715ab6ef75SJakub Kuderski %0 = spirv.mlir.addressof @bar : !spirv.ptr<f32, Input> 725ab6ef75SJakub Kuderski %1 = spirv.Load "Input" %0 : f32 735ab6ef75SJakub Kuderski spirv.ReturnValue %1 : f32 7401178654SLei Zhang } 7501178654SLei Zhang} 7601178654SLei Zhang 7701178654SLei Zhang// ----- 7801178654SLei Zhang 7901178654SLei Zhang// Deduplicate 2 global variables with the same built-in attribute. 8001178654SLei Zhang 8101178654SLei Zhang// CHECK: module { 825ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.module Logical GLSL450 { 835ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.GlobalVariable @foo built_in("GlobalInvocationId") 845ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.func @use_bar 855ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.mlir.addressof @foo 865ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.Load 875ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.ReturnValue 8801178654SLei Zhang// CHECK-NEXT: } 8901178654SLei Zhang// CHECK-NEXT: } 9001178654SLei Zhang// CHECK-NEXT: } 9101178654SLei Zhang 925ab6ef75SJakub Kuderskispirv.module Logical GLSL450 { 935ab6ef75SJakub Kuderski spirv.GlobalVariable @foo built_in("GlobalInvocationId") : !spirv.ptr<vector<3xi32>, Input> 9401178654SLei Zhang} 9501178654SLei Zhang 965ab6ef75SJakub Kuderskispirv.module Logical GLSL450 { 975ab6ef75SJakub Kuderski spirv.GlobalVariable @bar built_in("GlobalInvocationId") : !spirv.ptr<vector<3xi32>, Input> 9801178654SLei Zhang 995ab6ef75SJakub Kuderski spirv.func @use_bar() -> vector<3xi32> "None" { 1005ab6ef75SJakub Kuderski %0 = spirv.mlir.addressof @bar : !spirv.ptr<vector<3xi32>, Input> 1015ab6ef75SJakub Kuderski %1 = spirv.Load "Input" %0 : vector<3xi32> 1025ab6ef75SJakub Kuderski spirv.ReturnValue %1 : vector<3xi32> 10301178654SLei Zhang } 10401178654SLei Zhang} 10501178654SLei Zhang 10601178654SLei Zhang// ----- 10701178654SLei Zhang 10823326b9fSLei Zhang// Deduplicate 2 spec constants with the same spec ID. 10923326b9fSLei Zhang 11001178654SLei Zhang// CHECK: module { 1115ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.module Logical GLSL450 { 1125ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.SpecConstant @foo spec_id(5) 11301178654SLei Zhang 1145ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.func @use_foo() 1155ab6ef75SJakub Kuderski// CHECK-NEXT: %0 = spirv.mlir.referenceof @foo 1165ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.ReturnValue 11701178654SLei Zhang// CHECK-NEXT: } 11801178654SLei Zhang 1195ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.func @use_bar() 1205ab6ef75SJakub Kuderski// CHECK-NEXT: %0 = spirv.mlir.referenceof @foo 1215ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.FAdd 1225ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.ReturnValue 12301178654SLei Zhang// CHECK-NEXT: } 12401178654SLei Zhang// CHECK-NEXT: } 12501178654SLei Zhang// CHECK-NEXT: } 12601178654SLei Zhang 1275ab6ef75SJakub Kuderskispirv.module Logical GLSL450 { 1285ab6ef75SJakub Kuderski spirv.SpecConstant @foo spec_id(5) = 1. : f32 12901178654SLei Zhang 1305ab6ef75SJakub Kuderski spirv.func @use_foo() -> (f32) "None" { 1315ab6ef75SJakub Kuderski %0 = spirv.mlir.referenceof @foo : f32 1325ab6ef75SJakub Kuderski spirv.ReturnValue %0 : f32 13301178654SLei Zhang } 13401178654SLei Zhang} 13501178654SLei Zhang 1365ab6ef75SJakub Kuderskispirv.module Logical GLSL450 { 1375ab6ef75SJakub Kuderski spirv.SpecConstant @bar spec_id(5) = 1. : f32 13801178654SLei Zhang 1395ab6ef75SJakub Kuderski spirv.func @use_bar() -> (f32) "None" { 1405ab6ef75SJakub Kuderski %0 = spirv.mlir.referenceof @bar : f32 1415ab6ef75SJakub Kuderski %1 = spirv.FAdd %0, %0 : f32 1425ab6ef75SJakub Kuderski spirv.ReturnValue %1 : f32 14301178654SLei Zhang } 14401178654SLei Zhang} 14523326b9fSLei Zhang 14623326b9fSLei Zhang// ----- 14723326b9fSLei Zhang 14823326b9fSLei Zhang// Don't deduplicate functions with similar ops but different operands. 14923326b9fSLei Zhang 1505ab6ef75SJakub Kuderski// CHECK: spirv.module Logical GLSL450 { 1515ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.func @foo(%[[ARG0:.+]]: f32, %[[ARG1:.+]]: f32, %[[ARG2:.+]]: f32) 1525ab6ef75SJakub Kuderski// CHECK-NEXT: %[[ADD:.+]] = spirv.FAdd %[[ARG0]], %[[ARG1]] : f32 1535ab6ef75SJakub Kuderski// CHECK-NEXT: %[[MUL:.+]] = spirv.FMul %[[ADD]], %[[ARG2]] : f32 1545ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.ReturnValue %[[MUL]] : f32 15523326b9fSLei Zhang// CHECK-NEXT: } 1565ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.func @foo_1(%[[ARG0:.+]]: f32, %[[ARG1:.+]]: f32, %[[ARG2:.+]]: f32) 1575ab6ef75SJakub Kuderski// CHECK-NEXT: %[[ADD:.+]] = spirv.FAdd %[[ARG0]], %[[ARG2]] : f32 1585ab6ef75SJakub Kuderski// CHECK-NEXT: %[[MUL:.+]] = spirv.FMul %[[ADD]], %[[ARG1]] : f32 1595ab6ef75SJakub Kuderski// CHECK-NEXT: spirv.ReturnValue %[[MUL]] : f32 16023326b9fSLei Zhang// CHECK-NEXT: } 16123326b9fSLei Zhang// CHECK-NEXT: } 16223326b9fSLei Zhang 1635ab6ef75SJakub Kuderskispirv.module Logical GLSL450 { 1645ab6ef75SJakub Kuderski spirv.func @foo(%a: f32, %b: f32, %c: f32) -> f32 "None" { 1655ab6ef75SJakub Kuderski %add = spirv.FAdd %a, %b: f32 1665ab6ef75SJakub Kuderski %mul = spirv.FMul %add, %c: f32 1675ab6ef75SJakub Kuderski spirv.ReturnValue %mul: f32 16823326b9fSLei Zhang } 16923326b9fSLei Zhang} 17023326b9fSLei Zhang 1715ab6ef75SJakub Kuderskispirv.module Logical GLSL450 { 1725ab6ef75SJakub Kuderski spirv.func @foo(%a: f32, %b: f32, %c: f32) -> f32 "None" { 1735ab6ef75SJakub Kuderski %add = spirv.FAdd %a, %c: f32 1745ab6ef75SJakub Kuderski %mul = spirv.FMul %add, %b: f32 1755ab6ef75SJakub Kuderski spirv.ReturnValue %mul: f32 17623326b9fSLei Zhang } 17701178654SLei Zhang} 17801178654SLei Zhang 17901178654SLei Zhang// ----- 18001178654SLei Zhang 18123326b9fSLei Zhang// TODO: re-enable this test once we have better function deduplication. 18201178654SLei Zhang 18323326b9fSLei Zhang// XXXXX: module { 1845ab6ef75SJakub Kuderski// XXXXX-NEXT: spirv.module Logical GLSL450 { 1855ab6ef75SJakub Kuderski// XXXXX-NEXT: spirv.SpecConstant @bar spec_id(5) 18601178654SLei Zhang 1875ab6ef75SJakub Kuderski// XXXXX-NEXT: spirv.func @foo(%arg0: f32) 1885ab6ef75SJakub Kuderski// XXXXX-NEXT: spirv.ReturnValue 18923326b9fSLei Zhang// XXXXX-NEXT: } 19001178654SLei Zhang 1915ab6ef75SJakub Kuderski// XXXXX-NEXT: spirv.func @foo_different_body(%arg0: f32) 1925ab6ef75SJakub Kuderski// XXXXX-NEXT: spirv.mlir.referenceof 1935ab6ef75SJakub Kuderski// XXXXX-NEXT: spirv.ReturnValue 19423326b9fSLei Zhang// XXXXX-NEXT: } 19501178654SLei Zhang 1965ab6ef75SJakub Kuderski// XXXXX-NEXT: spirv.func @baz(%arg0: i32) 1975ab6ef75SJakub Kuderski// XXXXX-NEXT: spirv.ReturnValue 19823326b9fSLei Zhang// XXXXX-NEXT: } 19901178654SLei Zhang 2005ab6ef75SJakub Kuderski// XXXXX-NEXT: spirv.func @baz_no_return(%arg0: i32) 2015ab6ef75SJakub Kuderski// XXXXX-NEXT: spirv.Return 20223326b9fSLei Zhang// XXXXX-NEXT: } 20301178654SLei Zhang 2045ab6ef75SJakub Kuderski// XXXXX-NEXT: spirv.func @baz_no_return_different_control 2055ab6ef75SJakub Kuderski// XXXXX-NEXT: spirv.Return 20623326b9fSLei Zhang// XXXXX-NEXT: } 20701178654SLei Zhang 2085ab6ef75SJakub Kuderski// XXXXX-NEXT: spirv.func @baz_no_return_another_control 2095ab6ef75SJakub Kuderski// XXXXX-NEXT: spirv.Return 21023326b9fSLei Zhang// XXXXX-NEXT: } 21101178654SLei Zhang 2125ab6ef75SJakub Kuderski// XXXXX-NEXT: spirv.func @kernel 2135ab6ef75SJakub Kuderski// XXXXX-NEXT: spirv.Return 21423326b9fSLei Zhang// XXXXX-NEXT: } 21523326b9fSLei Zhang 2165ab6ef75SJakub Kuderski// XXXXX-NEXT: spirv.func @kernel_different_attr 2175ab6ef75SJakub Kuderski// XXXXX-NEXT: spirv.Return 21823326b9fSLei Zhang// XXXXX-NEXT: } 21923326b9fSLei Zhang// XXXXX-NEXT: } 22023326b9fSLei Zhang// XXXXX-NEXT: } 22101178654SLei Zhang 22201178654SLei Zhangmodule { 2235ab6ef75SJakub Kuderskispirv.module Logical GLSL450 { 2245ab6ef75SJakub Kuderski spirv.SpecConstant @bar spec_id(5) = 1. : f32 22501178654SLei Zhang 2265ab6ef75SJakub Kuderski spirv.func @foo(%arg0: f32) -> (f32) "None" { 2275ab6ef75SJakub Kuderski spirv.ReturnValue %arg0 : f32 22801178654SLei Zhang } 22901178654SLei Zhang 2305ab6ef75SJakub Kuderski spirv.func @foo_duplicate(%arg0: f32) -> (f32) "None" { 2315ab6ef75SJakub Kuderski spirv.ReturnValue %arg0 : f32 23201178654SLei Zhang } 23301178654SLei Zhang 2345ab6ef75SJakub Kuderski spirv.func @foo_different_body(%arg0: f32) -> (f32) "None" { 2355ab6ef75SJakub Kuderski %0 = spirv.mlir.referenceof @bar : f32 2365ab6ef75SJakub Kuderski spirv.ReturnValue %arg0 : f32 23701178654SLei Zhang } 23801178654SLei Zhang 2395ab6ef75SJakub Kuderski spirv.func @baz(%arg0: i32) -> (i32) "None" { 2405ab6ef75SJakub Kuderski spirv.ReturnValue %arg0 : i32 24101178654SLei Zhang } 24201178654SLei Zhang 2435ab6ef75SJakub Kuderski spirv.func @baz_no_return(%arg0: i32) "None" { 2445ab6ef75SJakub Kuderski spirv.Return 24501178654SLei Zhang } 24601178654SLei Zhang 2475ab6ef75SJakub Kuderski spirv.func @baz_no_return_duplicate(%arg0: i32) -> () "None" { 2485ab6ef75SJakub Kuderski spirv.Return 24901178654SLei Zhang } 25001178654SLei Zhang 2515ab6ef75SJakub Kuderski spirv.func @baz_no_return_different_control(%arg0: i32) -> () "Inline" { 2525ab6ef75SJakub Kuderski spirv.Return 25301178654SLei Zhang } 25401178654SLei Zhang 2555ab6ef75SJakub Kuderski spirv.func @baz_no_return_another_control(%arg0: i32) -> () "Inline|Pure" { 2565ab6ef75SJakub Kuderski spirv.Return 25701178654SLei Zhang } 25801178654SLei Zhang 2595ab6ef75SJakub Kuderski spirv.func @kernel( 26001178654SLei Zhang %arg0: f32, 2615ab6ef75SJakub Kuderski %arg1: !spirv.ptr<!spirv.struct<(!spirv.array<12 x f32>)>, CrossWorkgroup>) "None" 262*52ca1499SLei Zhang attributes {spirv.entry_point_abi = #spirv.entry_point_abi<workgroup_size = [32, 1, 1]>} { 2635ab6ef75SJakub Kuderski spirv.Return 26401178654SLei Zhang } 26501178654SLei Zhang 2665ab6ef75SJakub Kuderski spirv.func @kernel_different_attr( 26701178654SLei Zhang %arg0: f32, 2685ab6ef75SJakub Kuderski %arg1: !spirv.ptr<!spirv.struct<(!spirv.array<12 x f32>)>, CrossWorkgroup>) "None" 269*52ca1499SLei Zhang attributes {spirv.entry_point_abi = #spirv.entry_point_abi<workgroup_size = [64, 1, 1]>} { 2705ab6ef75SJakub Kuderski spirv.Return 27101178654SLei Zhang } 27201178654SLei Zhang} 27301178654SLei Zhang} 274