9#ifndef LLVM_CLANG_CIR_DIALECT_BUILDER_CIRBASEBUILDER_H
10#define LLVM_CLANG_CIR_DIALECT_BUILDER_CIRBASEBUILDER_H
18#include "llvm/ADT/STLForwardCompat.h"
19#include "llvm/IR/FPEnv.h"
20#include "llvm/Support/ErrorHandling.h"
22#include "mlir/IR/Builders.h"
23#include "mlir/IR/BuiltinAttributes.h"
24#include "mlir/IR/Location.h"
25#include "mlir/IR/OperationSupport.h"
26#include "mlir/IR/Types.h"
39 llvm::to_underlying(
b));
44 llvm::to_underlying(
b));
63 :
mlir::OpBuilder(&mlirContext) {}
67 const llvm::APInt &val) {
68 return cir::ConstantOp::create(*
this, loc, cir::IntAttr::get(typ, val));
71 cir::ConstantOp
getConstant(mlir::Location loc, mlir::TypedAttr attr) {
72 return cir::ConstantOp::create(*
this, loc, attr);
77 return getConstant(loc, cir::IntAttr::get(ty, value));
80 mlir::Value
getSignedInt(mlir::Location loc, int64_t val,
unsigned numBits) {
81 auto type = cir::IntType::get(getContext(), numBits,
true);
83 llvm::APInt(numBits, val,
true));
88 auto type = cir::IntType::get(getContext(), numBits,
false);
98 assert(mlir::isa<cir::PointerType>(t) &&
"expected cir.ptr");
103 return cir::DataMemberAttr::get(ty);
107 if (mlir::isa<cir::IntType>(ty))
108 return cir::IntAttr::get(ty, 0);
109 if (cir::isAnyFloatingPointType(ty))
110 return cir::FPAttr::getZero(ty);
111 if (
auto complexType = mlir::dyn_cast<cir::ComplexType>(ty))
112 return cir::ZeroAttr::get(complexType);
113 if (
auto arrTy = mlir::dyn_cast<cir::ArrayType>(ty))
114 return cir::ZeroAttr::get(arrTy);
115 if (
auto vecTy = mlir::dyn_cast<cir::VectorType>(ty))
116 return cir::ZeroAttr::get(vecTy);
117 if (
auto ptrTy = mlir::dyn_cast<cir::PointerType>(ty))
119 if (
auto recordTy = mlir::dyn_cast<cir::RecordType>(ty))
120 return cir::ZeroAttr::get(recordTy);
121 if (
auto dataMemberTy = mlir::dyn_cast<cir::DataMemberType>(ty))
123 if (mlir::isa<cir::BoolType>(ty)) {
126 llvm_unreachable(
"Zero initializer for given type is NYI");
129 cir::ConstantOp
getBool(
bool state, mlir::Location loc) {
130 return cir::ConstantOp::create(*
this, loc,
getCIRBoolAttr(state));
135 cir::BoolType
getBoolTy() {
return cir::BoolType::get(getContext()); }
136 cir::VoidType
getVoidTy() {
return cir::VoidType::get(getContext()); }
139 return cir::IntType::get(getContext(), n,
false);
143 if (
auto intType = mlir::dyn_cast<cir::IntTypeInterface>(eltTy))
144 return intType.getWidth();
145 if (
auto floatType = mlir::dyn_cast<cir::FPTypeInterface>(eltTy))
146 return floatType.getWidth();
148 llvm_unreachable(
"Unsupported type in getCIRIntOrFloatBitWidth");
151 return cir::IntType::get(getContext(), n,
true);
155 return cir::PointerType::get(ty);
159 mlir::ptr::MemorySpaceAttrInterface as) {
160 return cir::PointerType::get(ty, as);
167 mlir::ptr::MemorySpaceAttrInterface addrSpaceAttr =
173 return getPointerTo(cir::VoidType::get(getContext()), langAS);
176 cir::PointerType
getVoidPtrTy(mlir::ptr::MemorySpaceAttrInterface as) {
177 return getPointerTo(cir::VoidType::get(getContext()), as);
180 cir::MethodAttr
getMethodAttr(cir::MethodType ty, cir::FuncOp methodFuncOp) {
181 auto methodFuncSymbolRef = mlir::FlatSymbolRefAttr::get(methodFuncOp);
182 return cir::MethodAttr::get(ty, methodFuncSymbolRef);
186 return cir::MethodAttr::get(ty);
190 return cir::BoolAttr::get(getContext(), state);
198 auto resultComplexTy = cir::ComplexType::get(real.getType());
199 return cir::ComplexCreateOp::create(*
this, loc, resultComplexTy, real,
204 auto resultType = operand.getType();
205 if (
auto complexResultType = mlir::dyn_cast<cir::ComplexType>(resultType))
206 resultType = complexResultType.getElementType();
207 return cir::ComplexRealOp::create(*
this, loc, resultType, operand);
211 auto resultType = operand.getType();
212 if (
auto complexResultType = mlir::dyn_cast<cir::ComplexType>(resultType))
213 resultType = complexResultType.getElementType();
214 return cir::ComplexImagOp::create(*
this, loc, resultType, operand);
218 bool isVolatile =
false, uint64_t alignment = 0) {
220 return cir::LoadOp::create(*
this, loc, ptr,
false, isVolatile,
221 alignmentAttr, cir::SyncScopeKindAttr{},
222 cir::MemOrderAttr{});
226 uint64_t alignment) {
227 return createLoad(loc, ptr,
false, alignment);
231 return cir::UnaryOp::create(*
this, value.getLoc(), value.getType(),
232 cir::UnaryOpKind::Not, value);
238 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> condBuilder,
239 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> bodyBuilder) {
240 return cir::DoWhileOp::create(*
this, loc, condBuilder, bodyBuilder);
246 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> condBuilder,
247 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> bodyBuilder) {
248 return cir::WhileOp::create(*
this, loc, condBuilder, bodyBuilder);
254 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> condBuilder,
255 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> bodyBuilder,
256 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> stepBuilder) {
257 return cir::ForOp::create(*
this, loc, condBuilder, bodyBuilder,
263 return cir::BreakOp::create(*
this, loc);
268 return cir::ContinueOp::create(*
this, loc);
272 mlir::Value operand) {
273 return cir::UnaryOp::create(*
this, loc,
kind, operand);
277 return cir::ConstPtrAttr::get(type, getI64IntegerAttr(value));
280 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
281 mlir::Type type, llvm::StringRef name,
282 mlir::IntegerAttr alignment,
283 mlir::Value dynAllocSize) {
284 return cir::AllocaOp::create(*
this, loc, addrType, type, name, alignment,
288 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
289 mlir::Type type, llvm::StringRef name,
291 mlir::Value dynAllocSize) {
293 return createAlloca(loc, addrType, type, name, alignmentAttr, dynAllocSize);
296 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
297 mlir::Type type, llvm::StringRef name,
298 mlir::IntegerAttr alignment) {
299 return cir::AllocaOp::create(*
this, loc, addrType, type, name, alignment);
302 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
303 mlir::Type type, llvm::StringRef name,
306 return createAlloca(loc, addrType, type, name, alignmentAttr);
312 mlir::ArrayAttr indices = {}) {
313 cir::PointerType type =
getPointerTo(globalOp.getSymType());
319 cir::GlobalOp globalOp,
320 mlir::ArrayAttr indices = {}) {
321 auto symbol = mlir::FlatSymbolRefAttr::get(globalOp.getSymNameAttr());
322 return cir::GlobalViewAttr::get(type, symbol, indices);
326 bool threadLocal =
false) {
328 return cir::GetGlobalOp::create(*
this, loc,
330 global.getSymNameAttr(), threadLocal);
339 bool isVolatile =
false) {
340 return cir::CopyOp::create(*
this, dst.getLoc(), dst, src, isVolatile);
343 cir::StoreOp
createStore(mlir::Location loc, mlir::Value val, mlir::Value dst,
344 bool isVolatile =
false,
345 mlir::IntegerAttr align = {},
346 cir::SyncScopeKindAttr scope = {},
347 cir::MemOrderAttr order = {}) {
348 return cir::StoreOp::create(*
this, loc, val, dst, isVolatile, align, scope,
355 if (boolTy != mlir::cast<cir::PointerType>(addr.getType()).getPointee())
361 mlir::Value flag =
getBool(val, loc);
367 mlir::StringRef name,
368 mlir::Type type,
bool isConstant,
369 cir::GlobalLinkageKind linkage) {
370 mlir::OpBuilder::InsertionGuard guard(*
this);
371 setInsertionPointToStart(mlirModule.getBody());
372 return cir::GlobalOp::create(*
this, loc, name, type, isConstant, linkage);
376 mlir::Value base, llvm::StringRef name,
378 return cir::GetMemberOp::create(*
this, loc, resultTy, base, name, index);
385 return cir::LoadOp::create(*
this, loc, addr,
false,
386 false, alignmentAttr,
391 mlir::Value stride) {
392 return cir::PtrStrideOp::create(*
this, loc, base.getType(), base, stride);
399 cir::CallOp
createCallOp(mlir::Location loc, mlir::SymbolRefAttr callee,
400 mlir::Type returnType, mlir::ValueRange operands,
404 auto op = cir::CallOp::create(*
this, loc, callee, returnType, operands);
407 if (!argAttrs.empty()) {
408 llvm::SmallVector<mlir::Attribute> argDictAttrs;
409 argDictAttrs.reserve(argAttrs.size());
412 argAttrs, std::back_inserter(argDictAttrs),
413 [
this](llvm::ArrayRef<mlir::NamedAttribute> singleArgAttrs) {
414 return mlir::DictionaryAttr::get(getContext(), singleArgAttrs);
417 op.setArgAttrsAttr(mlir::ArrayAttr::get(getContext(), argDictAttrs));
420 if (!resAttrs.empty()) {
421 auto resultDictAttr = mlir::DictionaryAttr::get(getContext(), resAttrs);
422 op.setResAttrsAttr(mlir::ArrayAttr::get(getContext(), resultDictAttr));
428 mlir::ValueRange operands,
432 return createCallOp(loc, mlir::SymbolRefAttr::get(callee),
433 callee.getFunctionType().getReturnType(), operands,
434 attrs, argAttrs, resAttrs);
439 cir::FuncType funcType, mlir::ValueRange operands,
443 llvm::SmallVector<mlir::Value> resOperands{indirectTarget};
444 resOperands.append(operands.begin(), operands.end());
446 return createCallOp(loc, mlir::SymbolRefAttr(), funcType.getReturnType(),
447 resOperands, attrs, argAttrs, resAttrs);
450 cir::CallOp
createCallOp(mlir::Location loc, mlir::SymbolRefAttr callee,
451 mlir::ValueRange operands = mlir::ValueRange(),
455 return createCallOp(loc, callee, cir::VoidType(), operands, attrs, argAttrs,
464 mlir::Value src, mlir::Type newTy) {
465 if (newTy == src.getType())
467 return cir::CastOp::create(*
this, loc, newTy,
kind, src);
472 if (newTy == src.getType())
478 return createCast(cir::CastKind::integral, src, newTy);
482 return createCast(cir::CastKind::int_to_ptr, src, newTy);
486 return createCast(cir::CastKind::ptr_to_int, src, newTy);
494 return createCast(cir::CastKind::bool_to_int, src, newTy);
498 return createCast(cir::CastKind::bitcast, src, newTy);
503 return createCast(loc, cir::CastKind::bitcast, src, newTy);
507 assert(mlir::isa<cir::PointerType>(src.getType()) &&
"expected ptr src");
512 mlir::Value nullPtr =
getNullPtr(ptr.getType(), ptr.getLoc());
513 return createCompare(ptr.getLoc(), cir::CmpOpKind::eq, ptr, nullPtr);
518 return createCast(loc, cir::CastKind::address_space, src, newTy);
533 return cir::VecExtractOp::create(*
this, loc, vec, idxVal);
537 mlir::Value newElt, uint64_t idx) {
540 return cir::VecInsertOp::create(*
this, loc, vec, newElt, idxVal);
548 cir::BinOpKind
kind, mlir::Value rhs) {
549 return cir::BinOp::create(*
this, loc, lhs.getType(),
kind, lhs, rhs);
554 llvm::APInt val = llvm::APInt::getLowBitsSet(size, bits);
555 auto type = cir::IntType::get(getContext(), size,
false);
559 mlir::Value
createAnd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
560 return createBinop(loc, lhs, cir::BinOpKind::And, rhs);
563 mlir::Value
createOr(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
564 return createBinop(loc, lhs, cir::BinOpKind::Or, rhs);
568 mlir::Value trueValue, mlir::Value falseValue) {
569 assert(trueValue.getType() == falseValue.getType() &&
570 "trueValue and falseValue should have the same type");
571 return cir::SelectOp::create(*
this, loc, trueValue.getType(),
condition,
572 trueValue, falseValue);
585 mlir::Value
createMul(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
587 auto op = cir::BinOp::create(*
this, loc, lhs.getType(), cir::BinOpKind::Mul,
589 op.setNoUnsignedWrap(
604 mlir::Value
createSub(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
606 auto op = cir::BinOp::create(*
this, loc, lhs.getType(), cir::BinOpKind::Sub,
608 op.setNoUnsignedWrap(
626 mlir::Value
createAdd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
628 auto op = cir::BinOp::create(*
this, loc, lhs.getType(), cir::BinOpKind::Add,
630 op.setNoUnsignedWrap(
649 mlir::Value lhs, mlir::Value rhs) {
650 return cir::CmpOp::create(*
this, loc,
kind, lhs, rhs);
654 mlir::Value lhs, mlir::Value rhs) {
655 VectorType vecCast = mlir::cast<VectorType>(lhs.getType());
658 VectorType integralVecTy =
659 cir::VectorType::get(integralTy, vecCast.getSize());
660 return cir::VecCmpOp::create(*
this, loc, integralVecTy,
kind, lhs, rhs);
663 mlir::Value
createIsNaN(mlir::Location loc, mlir::Value operand) {
664 return createCompare(loc, cir::CmpOpKind::ne, operand, operand);
667 mlir::Value
createShift(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
669 return cir::ShiftOp::create(*
this, loc, lhs.getType(), lhs, rhs,
674 const llvm::APInt &rhs,
bool isShiftLeft) {
679 mlir::Value
createShift(mlir::Location loc, mlir::Value lhs,
unsigned bits,
681 auto width = mlir::dyn_cast<cir::IntType>(lhs.getType()).getWidth();
682 auto shift = llvm::APInt(width, bits);
712 std::find_if(block->rbegin(), block->rend(), [](mlir::Operation &op) {
713 return mlir::isa<cir::AllocaOp, cir::LabelOp>(&op);
716 if (last != block->rend())
717 return OpBuilder::InsertPoint(block, ++mlir::Block::iterator(&*last));
718 return OpBuilder::InsertPoint(block, block->begin());
739 return alignment ? getI64IntegerAttr(alignment) : mlir::IntegerAttr();
747 cir::ConstantOp
getNullPtr(mlir::Type ty, mlir::Location loc) {
758 cir::YieldOp
createYield(mlir::Location loc, mlir::ValueRange value = {}) {
759 return cir::YieldOp::create(*
this, loc, value);
768 mlir::Value objectPtr) {
771 mlir::cast<cir::MethodType>(method.getType()).getMemberFuncTy();
772 auto methodFuncInputTypes = methodFuncTy.getInputs();
774 auto objectPtrTy = mlir::cast<cir::PointerType>(objectPtr.getType());
775 mlir::Type adjustedThisTy =
getVoidPtrTy(objectPtrTy.getAddrSpace());
778 calleeFuncInputTypes.insert(calleeFuncInputTypes.end(),
779 methodFuncInputTypes.begin(),
780 methodFuncInputTypes.end());
781 cir::FuncType calleeFuncTy =
782 methodFuncTy.clone(calleeFuncInputTypes, methodFuncTy.getReturnType());
787 auto op = cir::GetMethodOp::create(*
this, loc, calleeTy, adjustedThisTy,
789 return {op.getCallee(), op.getAdjustedThis()};
Provides definitions for the various language-specific address spaces.
*collection of selector each with an associated kind and an ordered *collection of selectors A selector has a an optional score condition
*collection of selector each with an associated kind and an ordered *collection of selectors A selector has a kind
mlir::Value createNSWSub(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
cir::ConstantOp getBool(bool state, mlir::Location loc)
mlir::Value createShift(mlir::Location loc, mlir::Value lhs, unsigned bits, bool isShiftLeft)
cir::StoreOp createFlagStore(mlir::Location loc, bool val, mlir::Value dst)
cir::WhileOp createWhile(mlir::Location loc, llvm::function_ref< void(mlir::OpBuilder &, mlir::Location)> condBuilder, llvm::function_ref< void(mlir::OpBuilder &, mlir::Location)> bodyBuilder)
Create a while operation.
cir::BreakOp createBreak(mlir::Location loc)
Create a break operation.
mlir::TypedAttr getConstNullPtrAttr(mlir::Type t)
cir::PointerType getVoidPtrTy(mlir::ptr::MemorySpaceAttrInterface as)
mlir::IntegerAttr getAlignmentAttr(int64_t alignment)
mlir::Value createShift(mlir::Location loc, mlir::Value lhs, const llvm::APInt &rhs, bool isShiftLeft)
mlir::Value getConstAPInt(mlir::Location loc, mlir::Type typ, const llvm::APInt &val)
cir::GlobalViewAttr getGlobalViewAttr(cir::PointerType type, cir::GlobalOp globalOp, mlir::ArrayAttr indices={})
Get constant address of a global variable as an MLIR attribute.
mlir::Value createCast(cir::CastKind kind, mlir::Value src, mlir::Type newTy)
mlir::Value createLogicalOr(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
mlir::Value createShift(mlir::Location loc, mlir::Value lhs, mlir::Value rhs, bool isShiftLeft)
mlir::Value createSub(mlir::Location loc, mlir::Value lhs, mlir::Value rhs, OverflowBehavior ob=OverflowBehavior::None)
cir::ConditionOp createCondition(mlir::Value condition)
Create a loop condition.
mlir::Value createLowBitsSet(mlir::Location loc, unsigned size, unsigned bits)
mlir::Value createNSWAdd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
mlir::Value createGetGlobal(cir::GlobalOp global, bool threadLocal=false)
cir::GlobalViewAttr getGlobalViewAttr(cir::GlobalOp globalOp, mlir::ArrayAttr indices={})
Get constant address of a global variable as an MLIR attribute.
cir::MethodAttr getMethodAttr(cir::MethodType ty, cir::FuncOp methodFuncOp)
cir::VoidType getVoidTy()
cir::ConstantOp getNullValue(mlir::Type ty, mlir::Location loc)
cir::BoolAttr getCIRBoolAttr(bool state)
mlir::Value createBoolToInt(mlir::Value src, mlir::Type newTy)
cir::ConstantOp getConstant(mlir::Location loc, mlir::TypedAttr attr)
cir::MethodAttr getNullMethodAttr(cir::MethodType ty)
mlir::Value createNUWAdd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
mlir::Value createOr(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
mlir::Value createPtrIsNull(mlir::Value ptr)
mlir::Value createShiftLeft(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
mlir::Value createCast(mlir::Location loc, cir::CastKind kind, mlir::Value src, mlir::Type newTy)
mlir::IntegerAttr getSizeFromCharUnits(clang::CharUnits size)
cir::PtrStrideOp createPtrStride(mlir::Location loc, mlir::Value base, mlir::Value stride)
mlir::Value createIntToPtr(mlir::Value src, mlir::Type newTy)
cir::ForOp createFor(mlir::Location loc, llvm::function_ref< void(mlir::OpBuilder &, mlir::Location)> condBuilder, llvm::function_ref< void(mlir::OpBuilder &, mlir::Location)> bodyBuilder, llvm::function_ref< void(mlir::OpBuilder &, mlir::Location)> stepBuilder)
Create a for operation.
static OpBuilder::InsertPoint getBestAllocaInsertPoint(mlir::Block *block)
mlir::Value createPtrToInt(mlir::Value src, mlir::Type newTy)
mlir::Value createNUWSub(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
cir::ConstantOp getFalse(mlir::Location loc)
cir::CallOp createCallOp(mlir::Location loc, mlir::SymbolRefAttr callee, mlir::ValueRange operands=mlir::ValueRange(), llvm::ArrayRef< mlir::NamedAttribute > attrs={}, llvm::ArrayRef< mlir::NamedAttrList > argAttrs={}, llvm::ArrayRef< mlir::NamedAttribute > resAttrs={})
mlir::Value createAdd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs, OverflowBehavior ob=OverflowBehavior::None)
cir::GetMemberOp createGetMember(mlir::Location loc, mlir::Type resultTy, mlir::Value base, llvm::StringRef name, unsigned index)
cir::PointerType getPointerTo(mlir::Type ty)
mlir::Value createNot(mlir::Value value)
mlir::Value createComplexImag(mlir::Location loc, mlir::Value operand)
cir::ConstantOp getTrue(mlir::Location loc)
mlir::Value createNSWMul(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
cir::ConstantOp getNullPtr(mlir::Type ty, mlir::Location loc)
cir::IntType getUIntNTy(int n)
cir::DoWhileOp createDoWhile(mlir::Location loc, llvm::function_ref< void(mlir::OpBuilder &, mlir::Location)> condBuilder, llvm::function_ref< void(mlir::OpBuilder &, mlir::Location)> bodyBuilder)
Create a do-while operation.
mlir::Value createNUWAMul(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
cir::CopyOp createCopy(mlir::Value dst, mlir::Value src, bool isVolatile=false)
Create a copy with inferred length.
mlir::Value createPtrBitcast(mlir::Value src, mlir::Type newPointeeTy)
mlir::Value createShiftLeft(mlir::Location loc, mlir::Value lhs, unsigned bits)
mlir::Value createAlloca(mlir::Location loc, cir::PointerType addrType, mlir::Type type, llvm::StringRef name, clang::CharUnits alignment, mlir::Value dynAllocSize)
mlir::Value getSignedInt(mlir::Location loc, int64_t val, unsigned numBits)
mlir::Value createAnd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
cir::PointerType getPointerTo(mlir::Type ty, clang::LangAS langAS)
mlir::Value createExtractElement(mlir::Location loc, mlir::Value vec, uint64_t idx)
cir::VecCmpOp createVecCompare(mlir::Location loc, cir::CmpOpKind kind, mlir::Value lhs, mlir::Value rhs)
mlir::Value createIntCast(mlir::Value src, mlir::Type newTy)
mlir::Value createInsertElement(mlir::Location loc, mlir::Value vec, mlir::Value newElt, uint64_t idx)
mlir::Value createBitcast(mlir::Value src, mlir::Type newTy)
CIRBaseBuilderTy(mlir::MLIRContext &mlirContext)
mlir::Value createBitcast(mlir::Location loc, mlir::Value src, mlir::Type newTy)
mlir::TypedAttr getNullDataMemberAttr(cir::DataMemberType ty)
cir::GlobalOp createGlobal(mlir::ModuleOp mlirModule, mlir::Location loc, mlir::StringRef name, mlir::Type type, bool isConstant, cir::GlobalLinkageKind linkage)
mlir::Value createGetGlobal(mlir::Location loc, cir::GlobalOp global, bool threadLocal=false)
cir::CmpOp createCompare(mlir::Location loc, cir::CmpOpKind kind, mlir::Value lhs, mlir::Value rhs)
mlir::IntegerAttr getAlignmentAttr(clang::CharUnits alignment)
mlir::Value createBinop(mlir::Location loc, mlir::Value lhs, cir::BinOpKind kind, mlir::Value rhs)
mlir::Value createAlloca(mlir::Location loc, cir::PointerType addrType, mlir::Type type, llvm::StringRef name, mlir::IntegerAttr alignment)
mlir::Value createSelect(mlir::Location loc, mlir::Value condition, mlir::Value trueValue, mlir::Value falseValue)
cir::ContinueOp createContinue(mlir::Location loc)
Create a continue operation.
mlir::Value createMul(mlir::Location loc, mlir::Value lhs, mlir::Value rhs, OverflowBehavior ob=OverflowBehavior::None)
cir::PointerType getPointerTo(mlir::Type ty, mlir::ptr::MemorySpaceAttrInterface as)
mlir::TypedAttr getZeroInitAttr(mlir::Type ty)
cir::LoadOp createLoad(mlir::Location loc, mlir::Value ptr, bool isVolatile=false, uint64_t alignment=0)
mlir::Value createAlloca(mlir::Location loc, cir::PointerType addrType, mlir::Type type, llvm::StringRef name, clang::CharUnits alignment)
CIRBaseBuilderTy(mlir::OpBuilder &builder)
static unsigned getCIRIntOrFloatBitWidth(mlir::Type eltTy)
cir::CallOp createIndirectCallOp(mlir::Location loc, mlir::Value indirectTarget, cir::FuncType funcType, mlir::ValueRange operands, llvm::ArrayRef< mlir::NamedAttribute > attrs={}, llvm::ArrayRef< mlir::NamedAttrList > argAttrs={}, llvm::ArrayRef< mlir::NamedAttribute > resAttrs={})
cir::ConstantOp getConstantInt(mlir::Location loc, mlir::Type ty, int64_t value)
mlir::Value createComplexCreate(mlir::Location loc, mlir::Value real, mlir::Value imag)
mlir::Value createAddrSpaceCast(mlir::Value src, mlir::Type newTy)
mlir::Value createPtrToBoolCast(mlir::Value v)
cir::BoolAttr getTrueAttr()
cir::PointerType getVoidPtrTy(clang::LangAS langAS=clang::LangAS::Default)
mlir::Value createShiftRight(mlir::Location loc, mlir::Value lhs, unsigned bits)
mlir::Value createIsNaN(mlir::Location loc, mlir::Value operand)
cir::IntType getSIntNTy(int n)
mlir::Value createAlignedLoad(mlir::Location loc, mlir::Value ptr, uint64_t alignment)
mlir::TypedAttr getConstPtrAttr(mlir::Type type, int64_t value)
mlir::Value createAddrSpaceCast(mlir::Location loc, mlir::Value src, mlir::Type newTy)
cir::CallOp createCallOp(mlir::Location loc, mlir::SymbolRefAttr callee, mlir::Type returnType, mlir::ValueRange operands, llvm::ArrayRef< mlir::NamedAttribute > attrs={}, llvm::ArrayRef< mlir::NamedAttrList > argAttrs={}, llvm::ArrayRef< mlir::NamedAttribute > resAttrs={})
mlir::Value createDummyValue(mlir::Location loc, mlir::Type type, clang::CharUnits alignment)
cir::BoolAttr getFalseAttr()
mlir::Value createShiftRight(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
cir::StoreOp createStore(mlir::Location loc, mlir::Value val, mlir::Value dst, bool isVolatile=false, mlir::IntegerAttr align={}, cir::SyncScopeKindAttr scope={}, cir::MemOrderAttr order={})
cir::CallOp createCallOp(mlir::Location loc, cir::FuncOp callee, mlir::ValueRange operands, llvm::ArrayRef< mlir::NamedAttribute > attrs={}, llvm::ArrayRef< mlir::NamedAttrList > argAttrs={}, llvm::ArrayRef< mlir::NamedAttribute > resAttrs={})
cir::YieldOp createYield(mlir::Location loc, mlir::ValueRange value={})
Create a yield operation.
mlir::Value createLogicalAnd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
mlir::Value createUnaryOp(mlir::Location loc, cir::UnaryOpKind kind, mlir::Value operand)
mlir::IntegerAttr getAlignmentAttr(llvm::Align alignment)
cir::LoadOp createFlagLoad(mlir::Location loc, mlir::Value addr)
Emit a load from an boolean flag variable.
mlir::Value createAlloca(mlir::Location loc, cir::PointerType addrType, mlir::Type type, llvm::StringRef name, mlir::IntegerAttr alignment, mlir::Value dynAllocSize)
cir::BoolType getBoolTy()
mlir::Value getUnsignedInt(mlir::Location loc, uint64_t val, unsigned numBits)
GetMethodResults createGetMethod(mlir::Location loc, mlir::Value method, mlir::Value objectPtr)
mlir::Value createComplexReal(mlir::Location loc, mlir::Value operand)
CharUnits - This is an opaque type for sizes expressed in character units.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
constexpr OverflowBehavior operator|(OverflowBehavior a, OverflowBehavior b)
constexpr OverflowBehavior operator&(OverflowBehavior a, OverflowBehavior b)
constexpr OverflowBehavior & operator|=(OverflowBehavior &a, OverflowBehavior b)
constexpr OverflowBehavior & operator&=(OverflowBehavior &a, OverflowBehavior b)
mlir::ptr::MemorySpaceAttrInterface toCIRAddressSpaceAttr(mlir::MLIRContext &ctx, clang::LangAS langAS)
Convert an AST LangAS to the appropriate CIR address space attribute interface.
LangAS
Defines the address space values used by the address space qualifier of QualType.
static bool addressSpace()
static bool targetCodeGenInfoGetNullPointer()