xref: /llvm-project/mlir/test/Dialect/SPIRV/Transforms/gl-canonicalize.mlir (revision 5ab6ef758f0f549fb39bf9b34a6a743e989b212a)
1// RUN: mlir-opt -split-input-file -spirv-canonicalize-gl %s | FileCheck %s
2
3// CHECK-LABEL: func @clamp_fordlessthan
4//  CHECK-SAME: (%[[INPUT:.*]]: f32, %[[MIN:.*]]: f32, %[[MAX:.*]]: f32)
5func.func @clamp_fordlessthan(%input: f32, %min: f32, %max: f32) -> f32 {
6  // CHECK: [[RES:%.*]] = spirv.GL.FClamp %[[INPUT]], %[[MIN]], %[[MAX]]
7  %0 = spirv.FOrdLessThan %min, %input : f32
8  %mid = spirv.Select %0, %input, %min : i1, f32
9  %1 = spirv.FOrdLessThan %mid, %max : f32
10  %2 = spirv.Select %1, %mid, %max : i1, f32
11
12  // CHECK-NEXT: spirv.ReturnValue [[RES]]
13  spirv.ReturnValue %2 : f32
14}
15
16// -----
17
18// CHECK-LABEL: func @clamp_fordlessthan
19//  CHECK-SAME: (%[[INPUT:.*]]: f32, %[[MIN:.*]]: f32, %[[MAX:.*]]: f32)
20func.func @clamp_fordlessthan(%input: f32, %min: f32, %max: f32) -> f32 {
21  // CHECK: [[RES:%.*]] = spirv.GL.FClamp %[[INPUT]], %[[MIN]], %[[MAX]]
22  %0 = spirv.FOrdLessThan %input, %min : f32
23  %mid = spirv.Select %0, %min, %input : i1, f32
24  %1 = spirv.FOrdLessThan %max, %input : f32
25  %2 = spirv.Select %1, %max, %mid : i1, f32
26
27  // CHECK-NEXT: spirv.ReturnValue [[RES]]
28  spirv.ReturnValue %2 : f32
29}
30
31// -----
32
33// CHECK-LABEL: func @clamp_fordlessthanequal
34//  CHECK-SAME: (%[[INPUT:.*]]: f32, %[[MIN:.*]]: f32, %[[MAX:.*]]: f32)
35func.func @clamp_fordlessthanequal(%input: f32, %min: f32, %max: f32) -> f32 {
36  // CHECK: [[RES:%.*]] = spirv.GL.FClamp %[[INPUT]], %[[MIN]], %[[MAX]]
37  %0 = spirv.FOrdLessThanEqual %min, %input : f32
38  %mid = spirv.Select %0, %input, %min : i1, f32
39  %1 = spirv.FOrdLessThanEqual %mid, %max : f32
40  %2 = spirv.Select %1, %mid, %max : i1, f32
41
42  // CHECK-NEXT: spirv.ReturnValue [[RES]]
43  spirv.ReturnValue %2 : f32
44}
45
46// -----
47
48// CHECK-LABEL: func @clamp_fordlessthanequal
49//  CHECK-SAME: (%[[INPUT:.*]]: f32, %[[MIN:.*]]: f32, %[[MAX:.*]]: f32)
50func.func @clamp_fordlessthanequal(%input: f32, %min: f32, %max: f32) -> f32 {
51  // CHECK: [[RES:%.*]] = spirv.GL.FClamp %[[INPUT]], %[[MIN]], %[[MAX]]
52  %0 = spirv.FOrdLessThanEqual %input, %min : f32
53  %mid = spirv.Select %0, %min, %input : i1, f32
54  %1 = spirv.FOrdLessThanEqual %max, %input : f32
55  %2 = spirv.Select %1, %max, %mid : i1, f32
56
57  // CHECK-NEXT: spirv.ReturnValue [[RES]]
58  spirv.ReturnValue %2 : f32
59}
60
61// -----
62
63// CHECK-LABEL: func @clamp_slessthan
64//  CHECK-SAME: (%[[INPUT:.*]]: si32, %[[MIN:.*]]: si32, %[[MAX:.*]]: si32)
65func.func @clamp_slessthan(%input: si32, %min: si32, %max: si32) -> si32 {
66  // CHECK: [[RES:%.*]] = spirv.GL.SClamp %[[INPUT]], %[[MIN]], %[[MAX]]
67  %0 = spirv.SLessThan %min, %input : si32
68  %mid = spirv.Select %0, %input, %min : i1, si32
69  %1 = spirv.SLessThan %mid, %max : si32
70  %2 = spirv.Select %1, %mid, %max : i1, si32
71
72  // CHECK-NEXT: spirv.ReturnValue [[RES]]
73  spirv.ReturnValue %2 : si32
74}
75
76// -----
77
78// CHECK-LABEL: func @clamp_slessthan
79//  CHECK-SAME: (%[[INPUT:.*]]: si32, %[[MIN:.*]]: si32, %[[MAX:.*]]: si32)
80func.func @clamp_slessthan(%input: si32, %min: si32, %max: si32) -> si32 {
81  // CHECK: [[RES:%.*]] = spirv.GL.SClamp %[[INPUT]], %[[MIN]], %[[MAX]]
82  %0 = spirv.SLessThan %input, %min : si32
83  %mid = spirv.Select %0, %min, %input : i1, si32
84  %1 = spirv.SLessThan %max, %input : si32
85  %2 = spirv.Select %1, %max, %mid : i1, si32
86
87  // CHECK-NEXT: spirv.ReturnValue [[RES]]
88  spirv.ReturnValue %2 : si32
89}
90
91// -----
92
93// CHECK-LABEL: func @clamp_slessthanequal
94//  CHECK-SAME: (%[[INPUT:.*]]: si32, %[[MIN:.*]]: si32, %[[MAX:.*]]: si32)
95func.func @clamp_slessthanequal(%input: si32, %min: si32, %max: si32) -> si32 {
96  // CHECK: [[RES:%.*]] = spirv.GL.SClamp %[[INPUT]], %[[MIN]], %[[MAX]]
97  %0 = spirv.SLessThanEqual %min, %input : si32
98  %mid = spirv.Select %0, %input, %min : i1, si32
99  %1 = spirv.SLessThanEqual %mid, %max : si32
100  %2 = spirv.Select %1, %mid, %max : i1, si32
101
102  // CHECK-NEXT: spirv.ReturnValue [[RES]]
103  spirv.ReturnValue %2 : si32
104}
105
106// -----
107
108// CHECK-LABEL: func @clamp_slessthanequal
109//  CHECK-SAME: (%[[INPUT:.*]]: si32, %[[MIN:.*]]: si32, %[[MAX:.*]]: si32)
110func.func @clamp_slessthanequal(%input: si32, %min: si32, %max: si32) -> si32 {
111  // CHECK: [[RES:%.*]] = spirv.GL.SClamp %[[INPUT]], %[[MIN]], %[[MAX]]
112  %0 = spirv.SLessThanEqual %input, %min : si32
113  %mid = spirv.Select %0, %min, %input : i1, si32
114  %1 = spirv.SLessThanEqual %max, %input : si32
115  %2 = spirv.Select %1, %max, %mid : i1, si32
116
117  // CHECK-NEXT: spirv.ReturnValue [[RES]]
118  spirv.ReturnValue %2 : si32
119}
120
121// -----
122
123// CHECK-LABEL: func @clamp_ulessthan
124//  CHECK-SAME: (%[[INPUT:.*]]: i32, %[[MIN:.*]]: i32, %[[MAX:.*]]: i32)
125func.func @clamp_ulessthan(%input: i32, %min: i32, %max: i32) -> i32 {
126  // CHECK: [[RES:%.*]] = spirv.GL.UClamp %[[INPUT]], %[[MIN]], %[[MAX]]
127  %0 = spirv.ULessThan %min, %input : i32
128  %mid = spirv.Select %0, %input, %min : i1, i32
129  %1 = spirv.ULessThan %mid, %max : i32
130  %2 = spirv.Select %1, %mid, %max : i1, i32
131
132  // CHECK-NEXT: spirv.ReturnValue [[RES]]
133  spirv.ReturnValue %2 : i32
134}
135
136// -----
137
138// CHECK-LABEL: func @clamp_ulessthan
139//  CHECK-SAME: (%[[INPUT:.*]]: i32, %[[MIN:.*]]: i32, %[[MAX:.*]]: i32)
140func.func @clamp_ulessthan(%input: i32, %min: i32, %max: i32) -> i32 {
141  // CHECK: [[RES:%.*]] = spirv.GL.UClamp %[[INPUT]], %[[MIN]], %[[MAX]]
142  %0 = spirv.ULessThan %input, %min : i32
143  %mid = spirv.Select %0, %min, %input : i1, i32
144  %1 = spirv.ULessThan %max, %input : i32
145  %2 = spirv.Select %1, %max, %mid : i1, i32
146
147  // CHECK-NEXT: spirv.ReturnValue [[RES]]
148  spirv.ReturnValue %2 : i32
149}
150
151// -----
152
153// CHECK-LABEL: func @clamp_ulessthanequal
154//  CHECK-SAME: (%[[INPUT:.*]]: i32, %[[MIN:.*]]: i32, %[[MAX:.*]]: i32)
155func.func @clamp_ulessthanequal(%input: i32, %min: i32, %max: i32) -> i32 {
156  // CHECK: [[RES:%.*]] = spirv.GL.UClamp %[[INPUT]], %[[MIN]], %[[MAX]]
157  %0 = spirv.ULessThanEqual %min, %input : i32
158  %mid = spirv.Select %0, %input, %min : i1, i32
159  %1 = spirv.ULessThanEqual %mid, %max : i32
160  %2 = spirv.Select %1, %mid, %max : i1, i32
161
162  // CHECK-NEXT: spirv.ReturnValue [[RES]]
163  spirv.ReturnValue %2 : i32
164}
165
166// -----
167
168// CHECK-LABEL: func @clamp_ulessthanequal
169//  CHECK-SAME: (%[[INPUT:.*]]: i32, %[[MIN:.*]]: i32, %[[MAX:.*]]: i32)
170func.func @clamp_ulessthanequal(%input: i32, %min: i32, %max: i32) -> i32 {
171  // CHECK: [[RES:%.*]] = spirv.GL.UClamp %[[INPUT]], %[[MIN]], %[[MAX]]
172  %0 = spirv.ULessThanEqual %input, %min : i32
173  %mid = spirv.Select %0, %min, %input : i1, i32
174  %1 = spirv.ULessThanEqual %max, %input : i32
175  %2 = spirv.Select %1, %max, %mid : i1, i32
176
177  // CHECK-NEXT: spirv.ReturnValue [[RES]]
178  spirv.ReturnValue %2 : i32
179}
180