Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 79 additions & 1 deletion clang/include/clang/CIR/Dialect/IR/CIROps.td
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,15 @@ class LLVMLoweringInfo {
}

class CIR_Op<string mnemonic, list<Trait> traits = []> :
Op<CIR_Dialect, mnemonic, traits>, LLVMLoweringInfo;
Op<CIR_Dialect, mnemonic, traits>, LLVMLoweringInfo {
// Should we generate an LLVM lowering pattern for this op?
bit hasLLVMLowering = true;
// Is the LLVM lowering pattern for this operation recursive?
bit isLLVMLoweringRecursive = false;
// Extra class declarations to be included in the generated LLVM lowering
// pattern.
code extraLLVMLoweringPatternDecl = "";
}

//===----------------------------------------------------------------------===//
// CastOp
Expand Down Expand Up @@ -218,6 +226,10 @@ def CIR_CastOp : CIR_Op<"cast", [
// The input and output types should match the cast kind.
let hasVerifier = 1;
let hasFolder = 1;

let extraLLVMLoweringPatternDecl = [{
mlir::Type convertTy(mlir::Type ty) const;
}];
}


Expand Down Expand Up @@ -297,6 +309,8 @@ def CIR_ConstantOp : CIR_Op<"const", [
}];

let hasFolder = 1;

let isLLVMLoweringRecursive = true;
}

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -613,6 +627,8 @@ def CIR_IfOp : CIR_Op<"if", [
CArg<"BuilderCallbackRef", "buildTerminatedBody">:$thenBuilder,
CArg<"BuilderCallbackRef", "nullptr">:$elseBuilder)>
];

let hasLLVMLowering = false;
}

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -659,6 +675,7 @@ def CIR_ConditionOp : CIR_Op<"condition", [
let arguments = (ins CIR_BoolType:$condition);
let assemblyFormat = " `(` $condition `)` attr-dict ";
let hasVerifier = 1;
let hasLLVMLowering = false;
}

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -726,6 +743,8 @@ def CIR_YieldOp : CIR_Op<"yield", [
let builders = [
OpBuilder<(ins), [{ /* nothing to do */ }]>,
];

let hasLLVMLowering = false;
}

//===----------------------------------------------------------------------===//
Expand All @@ -741,6 +760,7 @@ def CIR_BreakOp : CIR_Op<"break", [Terminator]> {
}];
let assemblyFormat = "attr-dict";
let hasVerifier = 1;
let hasLLVMLowering = false;
}

//===----------------------------------------------------------------------===//
Expand All @@ -756,6 +776,7 @@ def CIR_ContinueOp : CIR_Op<"continue", [Terminator]> {
}];
let assemblyFormat = "attr-dict";
let hasVerifier = 1;
let hasLLVMLowering = false;
}

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -814,6 +835,8 @@ def CIR_ScopeOp : CIR_Op<"scope", [
// Scopes without yielding values.
OpBuilder<(ins "llvm::function_ref<void(mlir::OpBuilder &, mlir::Location)>":$scopeBuilder)>
];

let hasLLVMLowering = false;
}

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -860,6 +883,8 @@ def CIR_CaseOp : CIR_Op<"case", [
"CaseOpKind":$kind,
"mlir::OpBuilder::InsertPoint &":$insertPoint)>
];

let hasLLVMLowering = false;
}

def CIR_SwitchOp : CIR_Op<"switch", [
Expand Down Expand Up @@ -1025,6 +1050,8 @@ def CIR_SwitchOp : CIR_Op<"switch", [
// This is an expensive and need to be used with caution.
bool isSimpleForm(llvm::SmallVectorImpl<CaseOp> &cases);
}];

let hasLLVMLowering = false;
}

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -1170,6 +1197,8 @@ def CIR_GotoOp : CIR_Op<"goto", [Terminator]> {
}];
let arguments = (ins StrAttr:$label);
let assemblyFormat = [{ $label attr-dict }];

let hasLLVMLowering = false;
}

//===----------------------------------------------------------------------===//
Expand All @@ -1185,6 +1214,8 @@ def CIR_LabelOp : CIR_Op<"label", [AlwaysSpeculatable]> {
let arguments = (ins StrAttr:$label);
let assemblyFormat = [{ $label attr-dict }];
let hasVerifier = 1;

let hasLLVMLowering = false;
}

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -1349,6 +1380,8 @@ def CIR_WhileOp : CIR_WhileOpBase<"while"> {
}
```
}];

let hasLLVMLowering = false;
}

def CIR_DoWhileOp : CIR_WhileOpBase<"do"> {
Expand All @@ -1375,6 +1408,8 @@ def CIR_DoWhileOp : CIR_WhileOpBase<"do"> {
}
```
}];

let hasLLVMLowering = false;
}

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -1442,6 +1477,8 @@ def CIR_ForOp : CIR_LoopOpBase<"for"> {
return llvm::SmallVector<mlir::Region *, 3>{&getCond(), &getBody(), &getStep()};
}
}];

let hasLLVMLowering = false;
}

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -1480,6 +1517,8 @@ def CIR_CmpOp : CIR_Op<"cmp", [Pure, SameTypeOperands]> {
let assemblyFormat = [{
`(` $kind `,` $lhs `,` $rhs `)` `:` type($lhs) `,` type($result) attr-dict
}];

let isLLVMLoweringRecursive = true;
}

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -1550,6 +1589,10 @@ def CIR_BinOp : CIR_Op<"binop", [
}];

let hasVerifier = 1;

let extraLLVMLoweringPatternDecl = [{
mlir::LLVM::IntegerOverflowFlags getIntOverflowFlag(cir::BinOp op) const;
}];
}

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -1687,6 +1730,8 @@ def CIR_TernaryOp : CIR_Op<"ternary", [
`false` $falseRegion
`)` `:` functional-type(operands, results) attr-dict
}];

let hasLLVMLowering = false;
}

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -1790,6 +1835,20 @@ def CIR_GlobalOp : CIR_Op<"global", [
"cir::GlobalLinkageKind::ExternalLinkage">:$linkage)>];

let hasVerifier = 1;

let isLLVMLoweringRecursive = true;
let extraLLVMLoweringPatternDecl = [{
mlir::LogicalResult matchAndRewriteRegionInitializedGlobal(
cir::GlobalOp op, mlir::Attribute init,
mlir::ConversionPatternRewriter &rewriter) const;

void setupRegionInitializedLLVMGlobalOp(
cir::GlobalOp op, mlir::ConversionPatternRewriter &rewriter) const;

mutable mlir::LLVM::ComdatOp comdatOp = nullptr;
mlir::SymbolRefAttr getComdatAttr(cir::GlobalOp &op,
mlir::OpBuilder &builder) const;
}];
}

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -2340,6 +2399,19 @@ def CIR_FuncOp : CIR_Op<"func", [

let hasCustomAssemblyFormat = 1;
let hasVerifier = 1;

let extraLLVMLoweringPatternDecl = [{
static mlir::StringRef getLinkageAttrNameString() { return "linkage"; }

void lowerFuncAttributes(
cir::FuncOp func, bool filterArgAndResAttrs,
mlir::SmallVectorImpl<mlir::NamedAttribute> &result) const;

mlir::LogicalResult
matchAndRewriteAlias(cir::FuncOp op, llvm::StringRef aliasee, mlir::Type ty,
OpAdaptor adaptor,
mlir::ConversionPatternRewriter &rewriter) const;
}];
}

//===----------------------------------------------------------------------===//
Expand Down Expand Up @@ -2761,6 +2833,8 @@ class CIR_ArrayInitDestroy<string mnemonic> : CIR_Op<mnemonic> {
regionBuilder($_builder, $_state.location);
}]>
];

let hasLLVMLowering = false;
}

def CIR_ArrayCtor : CIR_ArrayInitDestroy<"array.ctor"> {
Expand Down Expand Up @@ -3380,6 +3454,8 @@ def CIR_ComplexMulOp : CIR_Op<"complex.mul", [
let assemblyFormat = [{
$lhs `,` $rhs `range` `(` $range `)` `:` qualified(type($result)) attr-dict
}];

let hasLLVMLowering = false;
}

def CIR_ComplexDivOp : CIR_Op<"complex.div", [
Expand Down Expand Up @@ -3422,6 +3498,8 @@ def CIR_ComplexDivOp : CIR_Op<"complex.div", [
let assemblyFormat = [{
$lhs `,` $rhs `range` `(` $range `)` `:` qualified(type($result)) attr-dict
}];

let hasLLVMLowering = false;
}

//===----------------------------------------------------------------------===//
Expand Down
4 changes: 4 additions & 0 deletions clang/include/clang/CIR/Dialect/IR/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ mlir_tablegen(CIROpsAttributes.h.inc -gen-attrdef-decls)
mlir_tablegen(CIROpsAttributes.cpp.inc -gen-attrdef-defs)
add_public_tablegen_target(MLIRCIREnumsGen)

clang_tablegen(CIRLowering.inc -gen-cir-lowering
SOURCE CIROps.td
TARGET CIRLowering)

set(LLVM_TARGET_DEFINITIONS CIRTypeConstraints.td)
mlir_tablegen(CIRTypeConstraints.h.inc -gen-type-constraint-decls)
mlir_tablegen(CIRTypeConstraints.cpp.inc -gen-type-constraint-defs)
Expand Down
84 changes: 4 additions & 80 deletions clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2463,87 +2463,11 @@ void ConvertCIRToLLVMPass::runOnOperation() {

mlir::RewritePatternSet patterns(&getContext());

patterns.add<CIRToLLVMReturnOpLowering>(patterns.getContext());
// This could currently be merged with the group below, but it will get more
// arguments later, so we'll keep it separate for now.
patterns.add<CIRToLLVMAllocaOpLowering>(converter, patterns.getContext(), dl);
patterns.add<CIRToLLVMLoadOpLowering>(converter, patterns.getContext(), dl);
patterns.add<CIRToLLVMStoreOpLowering>(converter, patterns.getContext(), dl);
patterns.add<CIRToLLVMGlobalOpLowering>(converter, patterns.getContext(), dl);
patterns.add<CIRToLLVMCastOpLowering>(converter, patterns.getContext(), dl);
patterns.add<CIRToLLVMPtrStrideOpLowering>(converter, patterns.getContext(),
dl);
patterns.add<CIRToLLVMInlineAsmOpLowering>(converter, patterns.getContext(),
dl);
patterns.add<
// clang-format off
CIRToLLVMACosOpLowering,
CIRToLLVMASinOpLowering,
CIRToLLVMAssumeOpLowering,
CIRToLLVMAssumeAlignedOpLowering,
CIRToLLVMAssumeSepStorageOpLowering,
CIRToLLVMAtomicCmpXchgLowering,
CIRToLLVMBaseClassAddrOpLowering,
CIRToLLVMATanOpLowering,
CIRToLLVMBinOpLowering,
CIRToLLVMBitClrsbOpLowering,
CIRToLLVMBitClzOpLowering,
CIRToLLVMBitCtzOpLowering,
CIRToLLVMBitFfsOpLowering,
CIRToLLVMBitParityOpLowering,
CIRToLLVMBitPopcountOpLowering,
CIRToLLVMBitReverseOpLowering,
CIRToLLVMBrCondOpLowering,
CIRToLLVMBrOpLowering,
CIRToLLVMByteSwapOpLowering,
CIRToLLVMCallOpLowering,
CIRToLLVMCmpOpLowering,
CIRToLLVMComplexAddOpLowering,
CIRToLLVMComplexCreateOpLowering,
CIRToLLVMComplexImagOpLowering,
CIRToLLVMComplexImagPtrOpLowering,
CIRToLLVMComplexRealOpLowering,
CIRToLLVMComplexRealPtrOpLowering,
CIRToLLVMComplexSubOpLowering,
CIRToLLVMCopyOpLowering,
CIRToLLVMCosOpLowering,
CIRToLLVMConstantOpLowering,
CIRToLLVMExpectOpLowering,
CIRToLLVMFAbsOpLowering,
CIRToLLVMFrameAddrOpLowering,
CIRToLLVMFuncOpLowering,
CIRToLLVMGetBitfieldOpLowering,
CIRToLLVMGetGlobalOpLowering,
CIRToLLVMGetMemberOpLowering,
CIRToLLVMReturnAddrOpLowering,
CIRToLLVMRotateOpLowering,
CIRToLLVMSelectOpLowering,
CIRToLLVMSetBitfieldOpLowering,
CIRToLLVMShiftOpLowering,
CIRToLLVMStackRestoreOpLowering,
CIRToLLVMStackSaveOpLowering,
CIRToLLVMSwitchFlatOpLowering,
CIRToLLVMThrowOpLowering,
CIRToLLVMTrapOpLowering,
CIRToLLVMUnaryOpLowering,
CIRToLLVMUnreachableOpLowering,
CIRToLLVMVAArgOpLowering,
CIRToLLVMVAEndOpLowering,
CIRToLLVMVAStartOpLowering,
CIRToLLVMVecCmpOpLowering,
CIRToLLVMVecCreateOpLowering,
CIRToLLVMVecExtractOpLowering,
CIRToLLVMVecInsertOpLowering,
CIRToLLVMVecShuffleDynamicOpLowering,
CIRToLLVMVecShuffleOpLowering,
CIRToLLVMVecSplatOpLowering,
CIRToLLVMVecTernaryOpLowering,
CIRToLLVMVTableAddrPointOpLowering,
CIRToLLVMVTableGetVPtrOpLowering,
CIRToLLVMVTableGetVirtualFnAddrOpLowering,
CIRToLLVMVTTAddrPointOpLowering
// clang-format on
>(converter, patterns.getContext());
#define GET_LLVM_LOWERING_PATTERNS_LIST
#include "clang/CIR/Dialect/IR/CIRLowering.inc"
#undef GET_LLVM_LOWERING_PATTERNS_LIST
>(converter, patterns.getContext(), dl);

processCIRAttrs(module);

Expand Down
Loading