xref: /llvm-project/mlir/test/Dialect/SPIRV/Linking/ModuleCombiner/deduplication.mlir (revision 52ca1499313fb72efa635d86d285fc4a36c58f34)
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