blob: 65f669c94cbe508c9a281ab95a6f3e800e37b4fd [file] [log] [blame]
//===-- CanonicalizationPatterns.td - FIR Canonicalization Patterns -------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
///
/// \file
/// Defines pattern rewrites for fir optimizations
///
//===----------------------------------------------------------------------===//
#ifndef FORTRAN_FIR_REWRITE_PATTERNS
#define FORTRAN_FIR_REWRITE_PATTERNS
include "mlir/IR/OpBase.td"
include "mlir/Dialect/Arithmetic/IR/ArithmeticOps.td"
include "mlir/Dialect/StandardOps/IR/Ops.td"
include "flang/Optimizer/Dialect/FIROps.td"
def IdenticalTypePred : Constraint<CPred<"$0.getType() == $1.getType()">>;
def IntegerTypePred : Constraint<CPred<"fir::isa_integer($0.getType())">>;
def IndexTypePred : Constraint<CPred<"$0.getType().isa<mlir::IndexType>()">>;
def SmallerWidthPred
: Constraint<CPred<"$0.getType().getIntOrFloatBitWidth() "
"<= $1.getType().getIntOrFloatBitWidth()">>;
def ConvertConvertOptPattern
: Pat<(fir_ConvertOp (fir_ConvertOp $arg)),
(fir_ConvertOp $arg),
[(IntegerTypePred $arg)]>;
def RedundantConvertOptPattern
: Pat<(fir_ConvertOp:$res $arg),
(replaceWithValue $arg),
[(IdenticalTypePred $res, $arg)
,(IntegerTypePred $arg)]>;
def CombineConvertOptPattern
: Pat<(fir_ConvertOp:$res(fir_ConvertOp:$irm $arg)),
(replaceWithValue $arg),
[(IdenticalTypePred $res, $arg)
,(IntegerTypePred $arg)
,(IntegerTypePred $irm)
,(SmallerWidthPred $arg, $irm)]>;
def createConstantOp
: NativeCodeCall<"$_builder.create<mlir::arith::ConstantOp>"
"($_loc, $_builder.getIndexType(), "
"rewriter.getIndexAttr($1.dyn_cast<IntegerAttr>()"
".getInt()))">;
def ForwardConstantConvertPattern
: Pat<(fir_ConvertOp:$res (Arith_ConstantOp:$cnt $attr)),
(createConstantOp $res, $attr),
[(IndexTypePred $res)
,(IntegerTypePred $cnt)]>;
#endif // FORTRAN_FIR_REWRITE_PATTERNS