1//===- Passes.h - Pass Entrypoints ------------------------------*- C++ -*-===//
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#ifndef MLIR_DIALECT_ARITH_TRANSFORMS_PASSES_H_
10#define MLIR_DIALECT_ARITH_TRANSFORMS_PASSES_H_
11
12#include "mlir/Pass/Pass.h"
13
14namespace mlir {
15class DataFlowSolver;
16class ConversionTarget;
17class TypeConverter;
18
19namespace arith {
20
21#define GEN_PASS_DECL
22#include "mlir/Dialect/Arith/Transforms/Passes.h.inc"
23
24class WideIntEmulationConverter;
25class NarrowTypeEmulationConverter;
26
27/// Create a pass to bufferize arith.constant ops.
28std::unique_ptr<Pass> createConstantBufferizePass(uint64_t alignment = 0);
29
30/// Adds patterns to emulate wide Arith and Function ops over integer
31/// types into supported ones. This is done by splitting original power-of-two
32/// i2N integer types into two iN halves.
33void populateArithWideIntEmulationPatterns(
34 WideIntEmulationConverter &typeConverter, RewritePatternSet &patterns);
35
36/// Adds patterns to emulate narrow Arith and Function ops into wide
37/// supported types. Users need to add conversions about the computation
38/// domain of narrow types.
39void populateArithNarrowTypeEmulationPatterns(
40 NarrowTypeEmulationConverter &typeConverter, RewritePatternSet &patterns);
41
42/// Populate the type conversions needed to emulate the unsupported
43/// `sourceTypes` with `destType`
44void populateEmulateUnsupportedFloatsConversions(TypeConverter &converter,
45 ArrayRef<Type> sourceTypes,
46 Type targetType);
47
48/// Add rewrite patterns for converting operations that use illegal float types
49/// to ones that use legal ones.
50void populateEmulateUnsupportedFloatsPatterns(RewritePatternSet &patterns,
51 TypeConverter &converter);
52
53/// Set up a dialect conversion to reject arithmetic operations on unsupported
54/// float types.
55void populateEmulateUnsupportedFloatsLegality(ConversionTarget &target,
56 TypeConverter &converter);
57/// Add patterns to expand Arith ceil/floor division ops.
58void populateCeilFloorDivExpandOpsPatterns(RewritePatternSet &patterns);
59
60/// Add patterns to expand Arith bf16 patterns to lower level bitcasts/shifts.
61void populateExpandBFloat16Patterns(RewritePatternSet &patterns);
62
63/// Add patterns to expand Arith ops.
64void populateArithExpandOpsPatterns(RewritePatternSet &patterns);
65
66/// Create a pass to replace signed ops with unsigned ones where they are proven
67/// equivalent.
68std::unique_ptr<Pass> createArithUnsignedWhenEquivalentPass();
69
70/// Add patterns for int range based optimizations.
71void populateIntRangeOptimizationsPatterns(RewritePatternSet &patterns,
72 DataFlowSolver &solver);
73
74/// Create a pass which do optimizations based on integer range analysis.
75std::unique_ptr<Pass> createIntRangeOptimizationsPass();
76
77/// Add patterns for integer bitwidth narrowing.
78void populateArithIntNarrowingPatterns(RewritePatternSet &patterns,
79 const ArithIntNarrowingOptions &options);
80
81//===----------------------------------------------------------------------===//
82// Registration
83//===----------------------------------------------------------------------===//
84
85/// Generate the code for registering passes.
86#define GEN_PASS_REGISTRATION
87#include "mlir/Dialect/Arith/Transforms/Passes.h.inc"
88
89} // namespace arith
90} // namespace mlir
91
92#endif // MLIR_DIALECT_ARITH_TRANSFORMS_PASSES_H_
93

source code of mlir/include/mlir/Dialect/Arith/Transforms/Passes.h