Skip to content

Commit 987f1e1

Browse files
authored
[CIR][NFC] Extend simple lowering to unary fp2int ops and binary fp2fp ops (#818)
This PR makes simple lowering generate the result type lowering logic and make it suitable for unary fp2int operations and binary fp2fp operations.
1 parent 8b2274d commit 987f1e1

File tree

3 files changed

+35
-88
lines changed

3 files changed

+35
-88
lines changed

clang/include/clang/CIR/Dialect/IR/CIROps.td

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3796,7 +3796,8 @@ def IterEndOp : CIR_Op<"iterator_end"> {
37963796
// Floating Point Ops
37973797
//===----------------------------------------------------------------------===//
37983798

3799-
class UnaryFPToIntBuiltinOp<string mnemonic> : CIR_Op<mnemonic, [Pure]> {
3799+
class UnaryFPToIntBuiltinOp<string mnemonic, string llvmOpName>
3800+
: CIR_Op<mnemonic, [Pure]> {
38003801
let arguments = (ins CIR_AnyFloat:$src);
38013802
let results = (outs CIR_IntType:$result);
38023803

@@ -3808,12 +3809,14 @@ class UnaryFPToIntBuiltinOp<string mnemonic> : CIR_Op<mnemonic, [Pure]> {
38083809
let assemblyFormat = [{
38093810
$src `:` type($src) `->` type($result) attr-dict
38103811
}];
3812+
3813+
let llvmOp = llvmOpName;
38113814
}
38123815

3813-
def LroundOp : UnaryFPToIntBuiltinOp<"lround">;
3814-
def LLroundOp : UnaryFPToIntBuiltinOp<"llround">;
3815-
def LrintOp : UnaryFPToIntBuiltinOp<"lrint">;
3816-
def LLrintOp : UnaryFPToIntBuiltinOp<"llrint">;
3816+
def LroundOp : UnaryFPToIntBuiltinOp<"lround", "LroundOp">;
3817+
def LLroundOp : UnaryFPToIntBuiltinOp<"llround", "LlroundOp">;
3818+
def LrintOp : UnaryFPToIntBuiltinOp<"lrint", "LrintOp">;
3819+
def LLrintOp : UnaryFPToIntBuiltinOp<"llrint", "LlrintOp">;
38173820

38183821
class UnaryFPToFPBuiltinOp<string mnemonic, string llvmOpName>
38193822
: CIR_Op<mnemonic, [Pure, SameOperandsAndResultType]> {
@@ -3842,7 +3845,7 @@ def SinOp : UnaryFPToFPBuiltinOp<"sin", "SinOp">;
38423845
def SqrtOp : UnaryFPToFPBuiltinOp<"sqrt", "SqrtOp">;
38433846
def TruncOp : UnaryFPToFPBuiltinOp<"trunc", "FTruncOp">;
38443847

3845-
class BinaryFPToFPBuiltinOp<string mnemonic>
3848+
class BinaryFPToFPBuiltinOp<string mnemonic, string llvmOpName>
38463849
: CIR_Op<mnemonic, [Pure, SameOperandsAndResultType]> {
38473850
let summary = [{
38483851
libc builtin equivalent ignoring floating-point exceptions and errno.
@@ -3854,13 +3857,15 @@ class BinaryFPToFPBuiltinOp<string mnemonic>
38543857
let assemblyFormat = [{
38553858
$lhs `,` $rhs `:` qualified(type($lhs)) attr-dict
38563859
}];
3860+
3861+
let llvmOp = llvmOpName;
38573862
}
38583863

3859-
def CopysignOp : BinaryFPToFPBuiltinOp<"copysign">;
3860-
def FMaxOp : BinaryFPToFPBuiltinOp<"fmax">;
3861-
def FMinOp : BinaryFPToFPBuiltinOp<"fmin">;
3862-
def FModOp : BinaryFPToFPBuiltinOp<"fmod">;
3863-
def PowOp : BinaryFPToFPBuiltinOp<"pow">;
3864+
def CopysignOp : BinaryFPToFPBuiltinOp<"copysign", "CopySignOp">;
3865+
def FMaxOp : BinaryFPToFPBuiltinOp<"fmax", "MaxNumOp">;
3866+
def FMinOp : BinaryFPToFPBuiltinOp<"fmin", "MinNumOp">;
3867+
def FModOp : BinaryFPToFPBuiltinOp<"fmod", "FRemOp">;
3868+
def PowOp : BinaryFPToFPBuiltinOp<"pow", "PowOp">;
38643869

38653870
//===----------------------------------------------------------------------===//
38663871
// Branch Probability Operations

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp

Lines changed: 3 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -3541,73 +3541,6 @@ class CIRCmpThreeWayOpLowering
35413541
}
35423542
};
35433543

3544-
template <typename CIROp, typename LLVMOp>
3545-
class CIRUnaryFPBuiltinOpLowering : public mlir::OpConversionPattern<CIROp> {
3546-
public:
3547-
using mlir::OpConversionPattern<CIROp>::OpConversionPattern;
3548-
3549-
mlir::LogicalResult
3550-
matchAndRewrite(CIROp op,
3551-
typename mlir::OpConversionPattern<CIROp>::OpAdaptor adaptor,
3552-
mlir::ConversionPatternRewriter &rewriter) const override {
3553-
auto resTy = this->getTypeConverter()->convertType(op.getType());
3554-
rewriter.replaceOpWithNewOp<LLVMOp>(op, resTy, adaptor.getSrc());
3555-
return mlir::success();
3556-
}
3557-
};
3558-
3559-
using CIRLroundOpLowering =
3560-
CIRUnaryFPBuiltinOpLowering<mlir::cir::LroundOp, mlir::LLVM::LroundOp>;
3561-
using CIRLLroundOpLowering =
3562-
CIRUnaryFPBuiltinOpLowering<mlir::cir::LLroundOp, mlir::LLVM::LlroundOp>;
3563-
using CIRLrintOpLowering =
3564-
CIRUnaryFPBuiltinOpLowering<mlir::cir::LrintOp, mlir::LLVM::LrintOp>;
3565-
using CIRLLrintOpLowering =
3566-
CIRUnaryFPBuiltinOpLowering<mlir::cir::LLrintOp, mlir::LLVM::LlrintOp>;
3567-
3568-
template <typename CIROp, typename LLVMOp>
3569-
class CIRBinaryFPToFPBuiltinOpLowering
3570-
: public mlir::OpConversionPattern<CIROp> {
3571-
public:
3572-
using mlir::OpConversionPattern<CIROp>::OpConversionPattern;
3573-
3574-
mlir::LogicalResult
3575-
matchAndRewrite(CIROp op,
3576-
typename mlir::OpConversionPattern<CIROp>::OpAdaptor adaptor,
3577-
mlir::ConversionPatternRewriter &rewriter) const override {
3578-
auto resTy = this->getTypeConverter()->convertType(op.getType());
3579-
rewriter.replaceOpWithNewOp<LLVMOp>(op, resTy, adaptor.getLhs(),
3580-
adaptor.getRhs());
3581-
return mlir::success();
3582-
}
3583-
};
3584-
3585-
using CIRCopysignOpLowering =
3586-
CIRBinaryFPToFPBuiltinOpLowering<mlir::cir::CopysignOp,
3587-
mlir::LLVM::CopySignOp>;
3588-
using CIRFMaxOpLowering =
3589-
CIRBinaryFPToFPBuiltinOpLowering<mlir::cir::FMaxOp, mlir::LLVM::MaxNumOp>;
3590-
using CIRFMinOpLowering =
3591-
CIRBinaryFPToFPBuiltinOpLowering<mlir::cir::FMinOp, mlir::LLVM::MinNumOp>;
3592-
using CIRPowOpLowering =
3593-
CIRBinaryFPToFPBuiltinOpLowering<mlir::cir::PowOp, mlir::LLVM::PowOp>;
3594-
3595-
// cir.fmod is special. Instead of lowering it to an intrinsic call, lower it to
3596-
// the frem LLVM instruction.
3597-
class CIRFModOpLowering : public mlir::OpConversionPattern<mlir::cir::FModOp> {
3598-
public:
3599-
using mlir::OpConversionPattern<mlir::cir::FModOp>::OpConversionPattern;
3600-
3601-
mlir::LogicalResult
3602-
matchAndRewrite(mlir::cir::FModOp op, OpAdaptor adaptor,
3603-
mlir::ConversionPatternRewriter &rewriter) const override {
3604-
auto resTy = this->getTypeConverter()->convertType(op.getType());
3605-
rewriter.replaceOpWithNewOp<mlir::LLVM::FRemOp>(op, resTy, adaptor.getLhs(),
3606-
adaptor.getRhs());
3607-
return mlir::success();
3608-
}
3609-
};
3610-
36113544
class CIRClearCacheOpLowering
36123545
: public mlir::OpConversionPattern<mlir::cir::ClearCacheOp> {
36133546
public:
@@ -3834,12 +3767,9 @@ void populateCIRToLLVMConversionPatterns(mlir::RewritePatternSet &patterns,
38343767
CIRStackSaveLowering, CIRUnreachableLowering, CIRTrapLowering,
38353768
CIRInlineAsmOpLowering, CIRSetBitfieldLowering, CIRGetBitfieldLowering,
38363769
CIRPrefetchLowering, CIRObjSizeOpLowering, CIRIsConstantOpLowering,
3837-
CIRCmpThreeWayOpLowering, CIRLroundOpLowering, CIRLLroundOpLowering,
3838-
CIRLrintOpLowering, CIRLLrintOpLowering, CIRCopysignOpLowering,
3839-
CIRFModOpLowering, CIRFMaxOpLowering, CIRFMinOpLowering, CIRPowOpLowering,
3840-
CIRClearCacheOpLowering, CIRUndefOpLowering, CIREhTypeIdOpLowering,
3841-
CIRCatchParamOpLowering, CIRResumeOpLowering, CIRAllocExceptionOpLowering,
3842-
CIRThrowOpLowering
3770+
CIRCmpThreeWayOpLowering, CIRClearCacheOpLowering, CIRUndefOpLowering,
3771+
CIREhTypeIdOpLowering, CIRCatchParamOpLowering, CIRResumeOpLowering,
3772+
CIRAllocExceptionOpLowering, CIRThrowOpLowering
38433773
#define GET_BUILTIN_LOWERING_LIST
38443774
#include "clang/CIR/Dialect/IR/CIRBuiltinsLowering.inc"
38453775
#undef GET_BUILTIN_LOWERING_LIST

clang/utils/TableGen/CIRLoweringEmitter.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace {
1515
std::string ClassDefinitions;
1616
std::string ClassList;
1717

18-
void GenerateLowering(raw_ostream &OS, const Record *Operation) {
18+
void GenerateLowering(const Record *Operation) {
1919
using namespace std::string_literals;
2020
std::string Name = Operation->getName().str();
2121
std::string LLVMOp = Operation->getValueAsString("llvmOp").str();
@@ -30,9 +30,21 @@ void GenerateLowering(raw_ostream &OS, const Record *Operation) {
3030
mlir::LogicalResult
3131
matchAndRewrite(mlir::cir::)C++" +
3232
Name +
33-
R"C++( op, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) const override {
33+
" op, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) "
34+
"const "
35+
"override {";
36+
37+
auto ResultCount = Operation->getValueAsDag("results")->getNumArgs();
38+
if (ResultCount > 0)
39+
ClassDefinitions += R"C++(
40+
auto resTy = this->getTypeConverter()->convertType(op.getType());)C++";
41+
42+
ClassDefinitions += R"C++(
3443
rewriter.replaceOpWithNewOp<mlir::LLVM::)C++" +
35-
LLVMOp + ">(op";
44+
LLVMOp + ">(op";
45+
46+
if (ResultCount > 0)
47+
ClassDefinitions += ", resTy";
3648

3749
auto ArgCount = Operation->getValueAsDag("arguments")->getNumArgs();
3850
for (size_t i = 0; i != ArgCount; ++i)
@@ -53,7 +65,7 @@ void clang::EmitCIRBuiltinsLowering(RecordKeeper &Records, raw_ostream &OS) {
5365
for (const auto *Builtin :
5466
Records.getAllDerivedDefinitions("LLVMLoweringInfo")) {
5567
if (!Builtin->getValueAsString("llvmOp").empty())
56-
GenerateLowering(OS, Builtin);
68+
GenerateLowering(Builtin);
5769
}
5870

5971
OS << "#ifdef GET_BUILTIN_LOWERING_CLASSES\n"

0 commit comments

Comments
 (0)