Skip to content

Commit a745238

Browse files
Lancernlanza
authored andcommitted
[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 07da011 commit a745238

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
@@ -3805,7 +3805,8 @@ def IterEndOp : CIR_Op<"iterator_end"> {
38053805
// Floating Point Ops
38063806
//===----------------------------------------------------------------------===//
38073807

3808-
class UnaryFPToIntBuiltinOp<string mnemonic> : CIR_Op<mnemonic, [Pure]> {
3808+
class UnaryFPToIntBuiltinOp<string mnemonic, string llvmOpName>
3809+
: CIR_Op<mnemonic, [Pure]> {
38093810
let arguments = (ins CIR_AnyFloat:$src);
38103811
let results = (outs CIR_IntType:$result);
38113812

@@ -3817,12 +3818,14 @@ class UnaryFPToIntBuiltinOp<string mnemonic> : CIR_Op<mnemonic, [Pure]> {
38173818
let assemblyFormat = [{
38183819
$src `:` type($src) `->` type($result) attr-dict
38193820
}];
3821+
3822+
let llvmOp = llvmOpName;
38203823
}
38213824

3822-
def LroundOp : UnaryFPToIntBuiltinOp<"lround">;
3823-
def LLroundOp : UnaryFPToIntBuiltinOp<"llround">;
3824-
def LrintOp : UnaryFPToIntBuiltinOp<"lrint">;
3825-
def LLrintOp : UnaryFPToIntBuiltinOp<"llrint">;
3825+
def LroundOp : UnaryFPToIntBuiltinOp<"lround", "LroundOp">;
3826+
def LLroundOp : UnaryFPToIntBuiltinOp<"llround", "LlroundOp">;
3827+
def LrintOp : UnaryFPToIntBuiltinOp<"lrint", "LrintOp">;
3828+
def LLrintOp : UnaryFPToIntBuiltinOp<"llrint", "LlrintOp">;
38263829

38273830
class UnaryFPToFPBuiltinOp<string mnemonic, string llvmOpName>
38283831
: CIR_Op<mnemonic, [Pure, SameOperandsAndResultType]> {
@@ -3851,7 +3854,7 @@ def SinOp : UnaryFPToFPBuiltinOp<"sin", "SinOp">;
38513854
def SqrtOp : UnaryFPToFPBuiltinOp<"sqrt", "SqrtOp">;
38523855
def TruncOp : UnaryFPToFPBuiltinOp<"trunc", "FTruncOp">;
38533856

3854-
class BinaryFPToFPBuiltinOp<string mnemonic>
3857+
class BinaryFPToFPBuiltinOp<string mnemonic, string llvmOpName>
38553858
: CIR_Op<mnemonic, [Pure, SameOperandsAndResultType]> {
38563859
let summary = [{
38573860
libc builtin equivalent ignoring floating-point exceptions and errno.
@@ -3863,13 +3866,15 @@ class BinaryFPToFPBuiltinOp<string mnemonic>
38633866
let assemblyFormat = [{
38643867
$lhs `,` $rhs `:` qualified(type($lhs)) attr-dict
38653868
}];
3869+
3870+
let llvmOp = llvmOpName;
38663871
}
38673872

3868-
def CopysignOp : BinaryFPToFPBuiltinOp<"copysign">;
3869-
def FMaxOp : BinaryFPToFPBuiltinOp<"fmax">;
3870-
def FMinOp : BinaryFPToFPBuiltinOp<"fmin">;
3871-
def FModOp : BinaryFPToFPBuiltinOp<"fmod">;
3872-
def PowOp : BinaryFPToFPBuiltinOp<"pow">;
3873+
def CopysignOp : BinaryFPToFPBuiltinOp<"copysign", "CopySignOp">;
3874+
def FMaxOp : BinaryFPToFPBuiltinOp<"fmax", "MaxNumOp">;
3875+
def FMinOp : BinaryFPToFPBuiltinOp<"fmin", "MinNumOp">;
3876+
def FModOp : BinaryFPToFPBuiltinOp<"fmod", "FRemOp">;
3877+
def PowOp : BinaryFPToFPBuiltinOp<"pow", "PowOp">;
38733878

38743879
//===----------------------------------------------------------------------===//
38753880
// Branch Probability Operations

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

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

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