xref: /llvm-project/mlir/lib/Dialect/SPIRV/IR/SPIRVCanonicalization.td (revision ce90957461d5d5e4290a61267b4726d3842483d7)
1//==- SPIRVCanonicalization.td - Canonicalization Patterns ---*- tablegen -*==//
2
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines SPIR-V canonicalization patterns.
10//
11//===----------------------------------------------------------------------===//
12
13include "mlir/IR/PatternBase.td"
14include "mlir/Dialect/SPIRV/IR/SPIRVOps.td"
15
16//===----------------------------------------------------------------------===//
17// spirv.LogicalNot
18//===----------------------------------------------------------------------===//
19
20def ConvertLogicalNotOfIEqual : Pat<
21    (SPIRV_LogicalNotOp (SPIRV_IEqualOp $lhs, $rhs)),
22    (SPIRV_INotEqualOp $lhs, $rhs)>;
23
24def ConvertLogicalNotOfINotEqual : Pat<
25    (SPIRV_LogicalNotOp (SPIRV_INotEqualOp $lhs, $rhs)),
26    (SPIRV_IEqualOp $lhs, $rhs)>;
27
28def ConvertLogicalNotOfLogicalEqual : Pat<
29    (SPIRV_LogicalNotOp (SPIRV_LogicalEqualOp $lhs, $rhs)),
30    (SPIRV_LogicalNotEqualOp $lhs, $rhs)>;
31
32def ConvertLogicalNotOfLogicalNotEqual : Pat<
33    (SPIRV_LogicalNotOp (SPIRV_LogicalNotEqualOp $lhs, $rhs)),
34    (SPIRV_LogicalEqualOp $lhs, $rhs)>;
35
36//===----------------------------------------------------------------------===//
37// spirv.Select -> spirv.GL.*Clamp
38//===----------------------------------------------------------------------===//
39
40def ValuesAreEqual : Constraint<CPred<"$0 == $1">>;
41
42foreach CmpClampPair = [
43    [SPIRV_FOrdLessThanOp, SPIRV_GLFClampOp],
44    [SPIRV_FOrdLessThanEqualOp, SPIRV_GLFClampOp],
45    [SPIRV_SLessThanOp, SPIRV_GLSClampOp],
46    [SPIRV_SLessThanEqualOp, SPIRV_GLSClampOp],
47    [SPIRV_ULessThanOp, SPIRV_GLUClampOp],
48    [SPIRV_ULessThanEqualOp, SPIRV_GLUClampOp]] in {
49
50// Detect: $min < $input, $input < $max
51def ConvertComparisonIntoClamp1_#CmpClampPair[0] : Pat<
52    (SPIRV_SelectOp
53        (CmpClampPair[0]
54            (SPIRV_SelectOp:$middle0
55                (CmpClampPair[0] $min, $input),
56                $input,
57                $min
58            ),
59            $max
60        ),
61        $middle1,
62        $max),
63    (CmpClampPair[1] $input, $min, $max),
64    [(ValuesAreEqual $middle0, $middle1)]>;
65
66// Detect: $input < $min, $max < $input
67def ConvertComparisonIntoClamp2_#CmpClampPair[0] : Pat<
68    (SPIRV_SelectOp
69        (CmpClampPair[0] $max, $input),
70        $max,
71        (SPIRV_SelectOp
72            (CmpClampPair[0] $input, $min),
73            $min,
74            $input
75        )),
76    (CmpClampPair[1] $input, $min, $max)>;
77}
78