Skip to content

Commit dd08d61

Browse files
Lancernsmeenai
authored andcommitted
[CIR][NFC] Extend simple lowering to unary fp2int ops and binary fp2fp ops (llvm#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 b56eb7a commit dd08d61

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
@@ -3543,73 +3543,6 @@ class CIRCmpThreeWayOpLowering
35433543
}
35443544
};
35453545

3546-
template <typename CIROp, typename LLVMOp>
3547-
class CIRUnaryFPBuiltinOpLowering : public mlir::OpConversionPattern<CIROp> {
3548-
public:
3549-
using mlir::OpConversionPattern<CIROp>::OpConversionPattern;
3550-
3551-
mlir::LogicalResult
3552-
matchAndRewrite(CIROp op,
3553-
typename mlir::OpConversionPattern<CIROp>::OpAdaptor adaptor,
3554-
mlir::ConversionPatternRewriter &rewriter) const override {
3555-
auto resTy = this->getTypeConverter()->convertType(op.getType());
3556-
rewriter.replaceOpWithNewOp<LLVMOp>(op, resTy, adaptor.getSrc());
3557-
return mlir::success();
3558-
}
3559-
};
3560-
3561-
using CIRLroundOpLowering =
3562-
CIRUnaryFPBuiltinOpLowering<mlir::cir::LroundOp, mlir::LLVM::LroundOp>;
3563-
using CIRLLroundOpLowering =
3564-
CIRUnaryFPBuiltinOpLowering<mlir::cir::LLroundOp, mlir::LLVM::LlroundOp>;
3565-
using CIRLrintOpLowering =
3566-
CIRUnaryFPBuiltinOpLowering<mlir::cir::LrintOp, mlir::LLVM::LrintOp>;
3567-
using CIRLLrintOpLowering =
3568-
CIRUnaryFPBuiltinOpLowering<mlir::cir::LLrintOp, mlir::LLVM::LlrintOp>;
3569-
3570-
template <typename CIROp, typename LLVMOp>
3571-
class CIRBinaryFPToFPBuiltinOpLowering
3572-
: public mlir::OpConversionPattern<CIROp> {
3573-
public:
3574-
using mlir::OpConversionPattern<CIROp>::OpConversionPattern;
3575-
3576-
mlir::LogicalResult
3577-
matchAndRewrite(CIROp op,
3578-
typename mlir::OpConversionPattern<CIROp>::OpAdaptor adaptor,
3579-
mlir::ConversionPatternRewriter &rewriter) const override {
3580-
auto resTy = this->getTypeConverter()->convertType(op.getType());
3581-
rewriter.replaceOpWithNewOp<LLVMOp>(op, resTy, adaptor.getLhs(),
3582-
adaptor.getRhs());
3583-
return mlir::success();
3584-
}
3585-
};
3586-
3587-
using CIRCopysignOpLowering =
3588-
CIRBinaryFPToFPBuiltinOpLowering<mlir::cir::CopysignOp,
3589-
mlir::LLVM::CopySignOp>;
3590-
using CIRFMaxOpLowering =
3591-
CIRBinaryFPToFPBuiltinOpLowering<mlir::cir::FMaxOp, mlir::LLVM::MaxNumOp>;
3592-
using CIRFMinOpLowering =
3593-
CIRBinaryFPToFPBuiltinOpLowering<mlir::cir::FMinOp, mlir::LLVM::MinNumOp>;
3594-
using CIRPowOpLowering =
3595-
CIRBinaryFPToFPBuiltinOpLowering<mlir::cir::PowOp, mlir::LLVM::PowOp>;
3596-
3597-
// cir.fmod is special. Instead of lowering it to an intrinsic call, lower it to
3598-
// the frem LLVM instruction.
3599-
class CIRFModOpLowering : public mlir::OpConversionPattern<mlir::cir::FModOp> {
3600-
public:
3601-
using mlir::OpConversionPattern<mlir::cir::FModOp>::OpConversionPattern;
3602-
3603-
mlir::LogicalResult
3604-
matchAndRewrite(mlir::cir::FModOp op, OpAdaptor adaptor,
3605-
mlir::ConversionPatternRewriter &rewriter) const override {
3606-
auto resTy = this->getTypeConverter()->convertType(op.getType());
3607-
rewriter.replaceOpWithNewOp<mlir::LLVM::FRemOp>(op, resTy, adaptor.getLhs(),
3608-
adaptor.getRhs());
3609-
return mlir::success();
3610-
}
3611-
};
3612-
36133546
class CIRClearCacheOpLowering
36143547
: public mlir::OpConversionPattern<mlir::cir::ClearCacheOp> {
36153548
public:
@@ -3837,12 +3770,9 @@ void populateCIRToLLVMConversionPatterns(mlir::RewritePatternSet &patterns,
38373770
CIRStackSaveLowering, CIRUnreachableLowering, CIRTrapLowering,
38383771
CIRInlineAsmOpLowering, CIRSetBitfieldLowering, CIRGetBitfieldLowering,
38393772
CIRPrefetchLowering, CIRObjSizeOpLowering, CIRIsConstantOpLowering,
3840-
CIRCmpThreeWayOpLowering, CIRLroundOpLowering, CIRLLroundOpLowering,
3841-
CIRLrintOpLowering, CIRLLrintOpLowering, CIRCopysignOpLowering,
3842-
CIRFModOpLowering, CIRFMaxOpLowering, CIRFMinOpLowering, CIRPowOpLowering,
3843-
CIRClearCacheOpLowering, CIRUndefOpLowering, CIREhTypeIdOpLowering,
3844-
CIRCatchParamOpLowering, CIRResumeOpLowering, CIRAllocExceptionOpLowering,
3845-
CIRThrowOpLowering
3773+
CIRCmpThreeWayOpLowering, CIRClearCacheOpLowering, CIRUndefOpLowering,
3774+
CIREhTypeIdOpLowering, CIRCatchParamOpLowering, CIRResumeOpLowering,
3775+
CIRAllocExceptionOpLowering, CIRThrowOpLowering
38463776
#define GET_BUILTIN_LOWERING_LIST
38473777
#include "clang/CIR/Dialect/IR/CIRBuiltinsLowering.inc"
38483778
#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)
@@ -54,7 +66,7 @@ void clang::EmitCIRBuiltinsLowering(const RecordKeeper &Records,
5466
for (const auto *Builtin :
5567
Records.getAllDerivedDefinitions("LLVMLoweringInfo")) {
5668
if (!Builtin->getValueAsString("llvmOp").empty())
57-
GenerateLowering(OS, Builtin);
69+
GenerateLowering(Builtin);
5870
}
5971

6072
OS << "#ifdef GET_BUILTIN_LOWERING_CLASSES\n"

0 commit comments

Comments
 (0)