Files
revng-revng/include/revng/CliftTransforms/RewriteHelpers.h
T
Lauri Vasama be8351a17d Split up Clift PrimitiveType
* PrimitiveType is now an interface.
* VoidKind is now VoidType.
* FloatKind is now FloatType.
* The integer kinds are now IntegerType with IntegerKind.
2026-04-08 12:18:10 +03:00

55 lines
2.1 KiB
C++

#pragma once
//
// This file is distributed under the MIT License. See LICENSE.md for details.
//
#include "revng/Clift/CliftOpHelpers.h"
#include "revng/CliftTransforms/PatternRewriter.h"
namespace mlir::clift {
inline IntegerType getBooleanType(mlir::MLIRContext *Context) {
return IntegerType::get(Context, IntegerKind::Signed, /*Size=*/1);
}
/// Transform the expression tree in \p Region with a new expression tree.
///
/// \p Transform is used to compute the new expression tree root. It is invoked
/// with the expression tree root value of \p Region.
void transformExpression(mlir::PatternRewriter &Rewriter,
mlir::Region &Region,
llvm::function_ref<Value(Value)> Transform);
/// Move the expression tree from \p SourceRegion into \p TargetRegion and
/// merge the two expressions together into a single expression at the root of
/// the resulting expression tree in \p TargetRegion.
///
/// \p Merge is used to compute the new expression tree root. It is invoked with
/// 1. the expression tree root value of \p SourceRegion, and
/// 2. the expression tree root value of \p TargetRegion.
void mergeExpressionInto(mlir::PatternRewriter &Rewriter,
mlir::Region &SourceRegion,
mlir::Region &TargetRegion,
llvm::function_ref<Value(Value, Value)> Merge);
/// Returns true if the condition described the specified region is a non-zero
/// ImmediateOp.
bool isTriviallyTrue(mlir::Region &Condition);
/// Inverts the condition expression in the specified region.
void invertBooleanExpression(mlir::PatternRewriter &Rewriter,
mlir::Location Loc,
mlir::Region &Region);
/// Inverts the condition and the two statement regions of the specified if
/// operation.
void invertIfStatement(mlir::PatternRewriter &Rewriter, IfOp If);
/// Returns the position of the next statement executed starting from the
/// specified position, or the end of a block if the end of the function or of a
/// loop is encountered.
BlockPosition getFallthroughTarget(BlockPosition Position);
} // namespace mlir::clift