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/Dialect/Ptr/IR/MemorySpaceInterfaces.h"
23#include "mlir/IR/Builders.h"
24#include "mlir/IR/BuiltinAttributes.h"
25#include "mlir/IR/Location.h"
26#include "mlir/IR/OperationSupport.h"
27#include "mlir/IR/Types.h"
40 llvm::to_underlying(b));
45 llvm::to_underlying(b));
68 :
mlir::OpBuilder(&mlirContext) {}
72 const llvm::APInt &val) {
73 return cir::ConstantOp::create(*
this, loc, cir::IntAttr::get(typ, val));
76 cir::ConstantOp
getConstant(mlir::Location loc, mlir::TypedAttr attr) {
77 return cir::ConstantOp::create(*
this, loc, attr);
82 return getConstant(loc, cir::IntAttr::get(ty, value));
85 mlir::Value
getSignedInt(mlir::Location loc, int64_t val,
unsigned numBits) {
86 auto type = cir::IntType::get(getContext(), numBits,
true);
88 llvm::APInt(numBits, val,
true));
93 auto type = cir::IntType::get(getContext(), numBits,
false);
103 assert(mlir::isa<cir::PointerType>(t) &&
"expected cir.ptr");
108 return cir::DataMemberAttr::get(ty);
112 if (mlir::isa<cir::IntType>(ty))
113 return cir::IntAttr::get(ty, 0);
114 if (cir::isAnyFloatingPointType(ty))
115 return cir::FPAttr::getZero(ty);
116 if (
auto complexType = mlir::dyn_cast<cir::ComplexType>(ty))
117 return cir::ZeroAttr::get(complexType);
118 if (
auto arrTy = mlir::dyn_cast<cir::ArrayType>(ty))
119 return cir::ZeroAttr::get(arrTy);
120 if (
auto vecTy = mlir::dyn_cast<cir::VectorType>(ty))
121 return cir::ZeroAttr::get(vecTy);
122 if (
auto ptrTy = mlir::dyn_cast<cir::PointerType>(ty))
124 if (
auto recordTy = mlir::dyn_cast<cir::RecordType>(ty))
125 return cir::ZeroAttr::get(recordTy);
126 if (
auto dataMemberTy = mlir::dyn_cast<cir::DataMemberType>(ty))
128 if (
auto methodTy = mlir::dyn_cast<cir::MethodType>(ty))
130 if (
auto vptrTy = mlir::dyn_cast<cir::VPtrType>(ty))
131 return cir::ZeroAttr::get(vptrTy);
132 if (mlir::isa<cir::BoolType>(ty)) {
136 llvm_unreachable(
"Zero initializer for given type is NYI");
139 cir::ConstantOp
getBool(
bool state, mlir::Location loc) {
140 return cir::ConstantOp::create(*
this, loc,
getCIRBoolAttr(state));
145 cir::BoolType
getBoolTy() {
return cir::BoolType::get(getContext()); }
146 cir::VoidType
getVoidTy() {
return cir::VoidType::get(getContext()); }
149 return cir::IntType::get(getContext(), n,
false);
153 if (
auto intType = mlir::dyn_cast<cir::IntTypeInterface>(eltTy))
154 return intType.getWidth();
155 if (
auto floatType = mlir::dyn_cast<cir::FPTypeInterface>(eltTy))
156 return floatType.getWidth();
158 llvm_unreachable(
"Unsupported type in getCIRIntOrFloatBitWidth");
161 return cir::IntType::get(getContext(), n,
true);
165 return cir::PointerType::get(ty);
169 mlir::ptr::MemorySpaceAttrInterface as) {
170 return cir::PointerType::get(ty, as);
177 mlir::ptr::MemorySpaceAttrInterface addrSpaceAttr =
183 return getPointerTo(cir::VoidType::get(getContext()), langAS);
186 cir::PointerType
getVoidPtrTy(mlir::ptr::MemorySpaceAttrInterface as) {
187 return getPointerTo(cir::VoidType::get(getContext()), as);
190 cir::MethodAttr
getMethodAttr(cir::MethodType ty, cir::FuncOp methodFuncOp) {
191 auto methodFuncSymbolRef = mlir::FlatSymbolRefAttr::get(methodFuncOp);
192 return cir::MethodAttr::get(ty, methodFuncSymbolRef);
196 return cir::MethodAttr::get(ty);
200 return cir::BoolAttr::get(getContext(), state);
208 auto resultComplexTy = cir::ComplexType::get(real.getType());
209 return cir::ComplexCreateOp::create(*
this, loc, resultComplexTy, real,
214 auto resultType = operand.getType();
215 if (
auto complexResultType = mlir::dyn_cast<cir::ComplexType>(resultType))
216 resultType = complexResultType.getElementType();
217 return cir::ComplexRealOp::create(*
this, loc, resultType, operand);
221 auto resultType = operand.getType();
222 if (
auto complexResultType = mlir::dyn_cast<cir::ComplexType>(resultType))
223 resultType = complexResultType.getElementType();
224 return cir::ComplexImagOp::create(*
this, loc, resultType, operand);
228 return cir::ComplexConjOp::create(*
this, loc, operand.getType(), operand);
232 bool isVolatile =
false, uint64_t alignment = 0,
233 bool isNontemporal =
false) {
235 return cir::LoadOp::create(*
this, loc, ptr,
false, isVolatile,
236 isNontemporal, alignmentAttr,
237 cir::SyncScopeKindAttr{}, cir::MemOrderAttr{},
242 uint64_t alignment) {
243 return createLoad(loc, ptr,
false, alignment);
246 mlir::Value
createNot(mlir::Location loc, mlir::Value value) {
247 return cir::NotOp::create(*
this, loc, value);
257 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> condBuilder,
258 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> bodyBuilder) {
259 return cir::DoWhileOp::create(*
this, loc, condBuilder, bodyBuilder);
265 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> condBuilder,
266 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> bodyBuilder) {
267 return cir::WhileOp::create(*
this, loc, condBuilder, bodyBuilder);
273 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> condBuilder,
274 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> bodyBuilder,
275 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> stepBuilder) {
276 return cir::ForOp::create(*
this, loc, condBuilder, bodyBuilder,
282 return cir::BreakOp::create(*
this, loc);
287 return cir::ContinueOp::create(*
this, loc);
290 mlir::Value
createInc(mlir::Location loc, mlir::Value input,
292 return cir::IncOp::create(*
this, loc, input, nsw);
295 mlir::Value
createDec(mlir::Location loc, mlir::Value input,
297 return cir::DecOp::create(*
this, loc, input, nsw);
302 return cir::MinusOp::create(*
this, loc, input, nsw);
306 return cir::ConstPtrAttr::get(type, getI64IntegerAttr(value));
309 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
310 llvm::StringRef name, mlir::IntegerAttr alignment,
311 mlir::Value dynAllocSize) {
312 return cir::AllocaOp::create(*
this, loc, addrType, name, alignment,
316 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
317 mlir::Type type, llvm::StringRef name,
319 mlir::Value dynAllocSize) {
321 return createAlloca(loc, addrType, name, alignmentAttr, dynAllocSize);
324 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
325 llvm::StringRef name, mlir::IntegerAttr alignment) {
326 return cir::AllocaOp::create(*
this, loc, addrType, name, alignment);
329 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
332 return createAlloca(loc, addrType, name, alignmentAttr);
338 mlir::ArrayAttr indices = {}) {
339 cir::PointerType type =
getPointerTo(globalOp.getSymType());
345 cir::GlobalOp globalOp,
346 mlir::ArrayAttr indices = {}) {
347 auto symbol = mlir::FlatSymbolRefAttr::get(globalOp.getSymNameAttr());
348 return cir::GlobalViewAttr::get(type, symbol, indices);
354 cir::GlobalOp globalOp,
357 for (int64_t ind : indices)
358 attrs.push_back(getI64IntegerAttr(ind));
359 mlir::ArrayAttr arAttr = mlir::ArrayAttr::get(getContext(), attrs);
364 bool threadLocal =
false) {
366 return cir::GetGlobalOp::create(*
this, loc,
368 global.getSymNameAttr(), threadLocal);
372 bool threadLocal =
false) {
378 bool isVolatile =
false,
379 bool skipTailPadding =
false) {
380 return cir::CopyOp::create(*
this, dst.getLoc(), dst, src,
382 isVolatile, skipTailPadding);
385 cir::StoreOp
createStore(mlir::Location loc, mlir::Value val, mlir::Value dst,
386 bool isVolatile =
false,
bool isNontemporal =
false,
387 mlir::IntegerAttr align = {},
388 cir::SyncScopeKindAttr scope = {},
389 cir::MemOrderAttr order = {}) {
390 if (mlir::cast<cir::PointerType>(dst.getType()).getPointee() !=
393 return cir::StoreOp::create(*
this, loc, val, dst, isVolatile, isNontemporal,
394 align, scope, order);
400 if (boolTy != mlir::cast<cir::PointerType>(addr.getType()).getPointee())
406 mlir::Value flag =
getBool(val, loc);
410 [[nodiscard]] cir::GlobalOp
412 mlir::StringRef name, mlir::Type type,
bool isConstant,
413 cir::GlobalLinkageKind linkage,
414 mlir::ptr::MemorySpaceAttrInterface addrSpace) {
415 mlir::OpBuilder::InsertionGuard guard(*
this);
416 setInsertionPointToStart(mlirModule.getBody());
417 return cir::GlobalOp::create(*
this, loc, name, type, isConstant, addrSpace,
422 mlir::Value base, llvm::StringRef name,
424 return cir::GetMemberOp::create(*
this, loc, resultTy, base, name, index);
431 return cir::LoadOp::create(*
this, loc, addr,
false,
439 mlir::Value stride) {
440 return cir::PtrStrideOp::create(*
this, loc, base.getType(), base, stride);
447 cir::CallOp
createCallOp(mlir::Location loc, mlir::SymbolRefAttr callee,
448 mlir::Type returnType, mlir::ValueRange operands,
452 auto op = cir::CallOp::create(*
this, loc, callee, returnType, operands);
455 if (!argAttrs.empty()) {
456 llvm::SmallVector<mlir::Attribute> argDictAttrs;
457 argDictAttrs.reserve(argAttrs.size());
460 argAttrs, std::back_inserter(argDictAttrs),
461 [
this](llvm::ArrayRef<mlir::NamedAttribute> singleArgAttrs) {
462 return mlir::DictionaryAttr::get(getContext(), singleArgAttrs);
465 op.setArgAttrsAttr(mlir::ArrayAttr::get(getContext(), argDictAttrs));
468 if (!resAttrs.empty()) {
469 auto resultDictAttr = mlir::DictionaryAttr::get(getContext(), resAttrs);
470 op.setResAttrsAttr(mlir::ArrayAttr::get(getContext(), resultDictAttr));
476 mlir::ValueRange operands,
480 return createCallOp(loc, mlir::SymbolRefAttr::get(callee),
481 callee.getFunctionType().getReturnType(), operands,
482 attrs, argAttrs, resAttrs);
487 cir::FuncType funcType, mlir::ValueRange operands,
491 llvm::SmallVector<mlir::Value> resOperands{indirectTarget};
492 resOperands.append(operands.begin(), operands.end());
494 return createCallOp(loc, mlir::SymbolRefAttr(), funcType.getReturnType(),
495 resOperands, attrs, argAttrs, resAttrs);
498 cir::CallOp
createCallOp(mlir::Location loc, mlir::SymbolRefAttr callee,
499 mlir::ValueRange operands = mlir::ValueRange(),
503 return createCallOp(loc, callee, cir::VoidType(), operands, attrs, argAttrs,
512 mlir::Value src, mlir::Type newTy) {
513 if (newTy == src.getType())
515 return cir::CastOp::create(*
this, loc, newTy,
kind, src);
520 if (newTy == src.getType())
527 if (newTy == src.getType())
535 return createCast(cir::CastKind::integral, src, newTy);
540 return cir::BuiltinIntCastOp::create(*
this, loc, newTy, src);
548 return createCast(cir::CastKind::int_to_ptr, src, newTy);
552 return createCast(cir::CastKind::ptr_to_int, src, newTy);
560 return createCast(cir::CastKind::bool_to_int, src, newTy);
564 return createCast(cir::CastKind::bitcast, src, newTy);
569 return createCast(loc, cir::CastKind::bitcast, src, newTy);
573 assert(mlir::isa<cir::PointerType>(src.getType()) &&
"expected ptr src");
574 cir::PointerType srcPtrTy = mlir::cast<cir::PointerType>(src.getType());
580 mlir::Value nullPtr =
getNullPtr(ptr.getType(), ptr.getLoc());
581 return createCompare(ptr.getLoc(), cir::CmpOpKind::eq, ptr, nullPtr);
585 mlir::Value nullPtr =
getNullPtr(ptr.getType(), ptr.getLoc());
586 return createCompare(ptr.getLoc(), cir::CmpOpKind::ne, ptr, nullPtr);
591 return createCast(loc, cir::CastKind::address_space, src, newTy);
606 return cir::VecExtractOp::create(*
this, loc, vec, idxVal);
610 mlir::Value newElt, uint64_t idx) {
613 return cir::VecInsertOp::create(*
this, loc, vec, newElt, idxVal);
617 auto resTy = cir::BoolType::get(getContext());
618 return cir::SignBitOp::create(*
this, loc, resTy, val);
627 llvm::APInt val = llvm::APInt::getLowBitsSet(size, bits);
628 auto type = cir::IntType::get(getContext(), size,
false);
632 mlir::Value
createAnd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
633 return cir::AndOp::create(*
this, loc, lhs, rhs);
636 mlir::Value
createOr(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
637 return cir::OrOp::create(*
this, loc, lhs, rhs);
641 mlir::Value trueValue, mlir::Value falseValue) {
642 assert(trueValue.getType() == falseValue.getType() &&
643 "trueValue and falseValue should have the same type");
644 return cir::SelectOp::create(*
this, loc, trueValue.getType(),
condition,
645 trueValue, falseValue);
658 mlir::Value
createMul(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
660 auto op = cir::MulOp::create(*
this, loc, lhs, rhs);
674 mlir::Value
createSub(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
676 auto op = cir::SubOp::create(*
this, loc, lhs, rhs);
693 mlir::Value
createAdd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
695 auto op = cir::AddOp::create(*
this, loc, lhs, rhs);
712 mlir::Value
createDiv(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
713 return cir::DivOp::create(*
this, loc, lhs, rhs);
716 mlir::Value
createRem(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
717 return cir::RemOp::create(*
this, loc, lhs, rhs);
720 mlir::Value
createFAdd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
724 return cir::FAddOp::create(*
this, loc, lhs, rhs);
727 mlir::Value
createFSub(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
731 return cir::FSubOp::create(*
this, loc, lhs, rhs);
734 mlir::Value
createFMul(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
738 return cir::FMulOp::create(*
this, loc, lhs, rhs);
741 mlir::Value
createFDiv(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
745 return cir::FDivOp::create(*
this, loc, lhs, rhs);
748 mlir::Value
createFRem(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
752 return cir::FRemOp::create(*
this, loc, lhs, rhs);
755 mlir::Value
createFNeg(mlir::Location loc, mlir::Value operand) {
756 assert(cir::isFPOrVectorOfFPType(operand.getType()) &&
757 "expected floating-point or vector-of-float type");
761 return cir::FNegOp::create(*
this, loc, operand);
764 mlir::Value
createXor(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
765 return cir::XorOp::create(*
this, loc, lhs, rhs);
768 mlir::Value
createMax(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
769 return cir::MaxOp::create(*
this, loc, lhs, rhs);
773 mlir::Value lhs, mlir::Value rhs) {
774 return cir::CmpOp::create(*
this, loc,
kind, lhs, rhs);
778 mlir::Value lhs, mlir::Value rhs) {
779 VectorType vecCast = mlir::cast<VectorType>(lhs.getType());
782 VectorType integralVecTy =
783 cir::VectorType::get(integralTy, vecCast.getSize());
784 return cir::VecCmpOp::create(*
this, loc, integralVecTy,
kind, lhs, rhs);
787 mlir::Value
createIsNaN(mlir::Location loc, mlir::Value operand) {
788 return createCompare(loc, cir::CmpOpKind::ne, operand, operand);
791 mlir::Value
createShift(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
793 return cir::ShiftOp::create(*
this, loc, lhs.getType(), lhs, rhs,
798 const llvm::APInt &rhs,
bool isShiftLeft) {
803 mlir::Value
createShift(mlir::Location loc, mlir::Value lhs,
unsigned bits,
805 auto width = mlir::dyn_cast<cir::IntType>(lhs.getType()).getWidth();
806 auto shift = llvm::APInt(width, bits);
832 return cir::FuncType::get(llvm::to_vector(argTypes),
getVoidTy());
846 std::find_if(block->rbegin(), block->rend(), [](mlir::Operation &op) {
847 return mlir::isa<cir::AllocaOp, cir::LabelOp>(&op);
850 if (last != block->rend())
851 return OpBuilder::InsertPoint(block, ++mlir::Block::iterator(&*last));
852 return OpBuilder::InsertPoint(block, block->begin());
873 return alignment ? getI64IntegerAttr(alignment) : mlir::IntegerAttr();
888 cir::ConstantOp
getNullPtr(mlir::Type ty, mlir::Location loc) {
899 cir::YieldOp
createYield(mlir::Location loc, mlir::ValueRange value = {}) {
900 return cir::YieldOp::create(*
this, loc, value);
909 mlir::Value objectPtr) {
912 mlir::cast<cir::MethodType>(method.getType()).getMemberFuncTy();
913 auto methodFuncInputTypes = methodFuncTy.getInputs();
915 auto objectPtrTy = mlir::cast<cir::PointerType>(objectPtr.getType());
916 mlir::Type adjustedThisTy =
getVoidPtrTy(objectPtrTy.getAddrSpace());
921 if (methodFuncInputTypes.size() > 1)
922 calleeFuncInputTypes.insert(calleeFuncInputTypes.end(),
923 methodFuncInputTypes.begin() + 1,
924 methodFuncInputTypes.end());
925 cir::FuncType calleeFuncTy =
926 methodFuncTy.clone(calleeFuncInputTypes, methodFuncTy.getReturnType());
931 auto op = cir::GetMethodOp::create(*
this, loc, calleeTy, adjustedThisTy,
933 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.
mlir::Value createDiv(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
mlir::Value createAlloca(mlir::Location loc, cir::PointerType addrType, llvm::StringRef name, mlir::IntegerAttr alignment)
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 createDec(mlir::Location loc, mlir::Value input, bool nsw=false)
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)
mlir::Value createBuiltinIntCast(mlir::Value src, mlir::Type newTy)
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 createInc(mlir::Location loc, mlir::Value input, bool nsw=false)
cir::CopyOp createCopy(mlir::Value dst, mlir::Value src, bool isVolatile=false, bool skipTailPadding=false)
Create a copy with inferred length.
mlir::Value createNSWAdd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
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)
cir::SignBitOp createSignBit(mlir::Location loc, mlir::Value val)
mlir::Value createCast(mlir::Location loc, cir::CastKind kind, mlir::Value src, mlir::Type newTy)
mlir::IntegerAttr getSizeFromCharUnits(clang::CharUnits size)
cir::PointerType getVoidFnPtrTy(mlir::TypeRange argTypes={})
Returns void (*)(T...) as a cir::PointerType.
cir::PtrStrideOp createPtrStride(mlir::Location loc, mlir::Value base, mlir::Value stride)
mlir::Value createIntToPtr(mlir::Value src, mlir::Type newTy)
mlir::Value createRem(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
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 createFDiv(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
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 createFNeg(mlir::Location loc, mlir::Value operand)
mlir::Value createAlloca(mlir::Location loc, cir::PointerType addrType, llvm::StringRef name, clang::CharUnits alignment)
mlir::Value createNot(mlir::Value value)
mlir::Value createFAdd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
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::GetGlobalOp createGetGlobal(cir::GlobalOp global, bool threadLocal=false)
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)
mlir::Value createPtrBitcast(mlir::Value src, mlir::Type newPointeeTy)
cir::GetGlobalOp createGetGlobal(mlir::Location loc, cir::GlobalOp global, bool threadLocal=false)
mlir::Value createShiftLeft(mlir::Location loc, mlir::Value lhs, unsigned bits)
mlir::Value createAlloca(mlir::Location loc, cir::PointerType addrType, llvm::StringRef name, mlir::IntegerAttr alignment, mlir::Value dynAllocSize)
cir::LoadOp createLoad(mlir::Location loc, mlir::Value ptr, bool isVolatile=false, uint64_t alignment=0, bool isNontemporal=false)
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 createMax(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
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)
mlir::Value createFMul(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
CIRBaseBuilderTy(mlir::MLIRContext &mlirContext)
mlir::Value createBitcast(mlir::Location loc, mlir::Value src, mlir::Type newTy)
cir::FuncType getVoidFnTy(mlir::TypeRange argTypes={})
Returns void (T...) as a cir::FuncType.
mlir::TypedAttr getNullDataMemberAttr(cir::DataMemberType ty)
mlir::Value createBuiltinIntCast(mlir::Location loc, mlir::Value src, mlir::Type newTy)
cir::CmpOp createCompare(mlir::Location loc, cir::CmpOpKind kind, mlir::Value lhs, mlir::Value rhs)
mlir::IntegerAttr getAlignmentAttr(clang::CharUnits alignment)
mlir::Value createNot(mlir::Location loc, mlir::Value value)
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)
mlir::Value createMinus(mlir::Location loc, mlir::Value input, bool nsw=false)
CIRBaseBuilderTy(mlir::OpBuilder &builder)
mlir::Value createPtrIsNotNull(mlir::Value ptr)
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 createBoolIntToIntCast(mlir::Value src, mlir::Type newTy)
mlir::Value createAddrSpaceCast(mlir::Value src, mlir::Type newTy)
mlir::Value createComplexConj(mlir::Location loc, mlir::Value operand)
mlir::Value createPtrToBoolCast(mlir::Value v)
cir::BoolAttr getTrueAttr()
cir::PointerType getVoidPtrTy(clang::LangAS langAS=clang::LangAS::Default)
cir::GlobalViewAttr getGlobalViewAttr(cir::PointerType type, cir::GlobalOp globalOp, llvm::ArrayRef< int64_t > indices)
Get constant address of a global variable as an MLIR attribute.
mlir::Value createFRem(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
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)
mlir::Value createXor(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
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.
cir::ConstantOp getAlignment(mlir::Location loc, mlir::Type t, clang::CharUnits alignment)
mlir::Value createLogicalAnd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
cir::GlobalOp createGlobal(mlir::ModuleOp mlirModule, mlir::Location loc, mlir::StringRef name, mlir::Type type, bool isConstant, cir::GlobalLinkageKind linkage, mlir::ptr::MemorySpaceAttrInterface addrSpace)
mlir::IntegerAttr getAlignmentAttr(llvm::Align alignment)
mlir::Value createFSub(mlir::Location loc, mlir::Value lhs, mlir::Value rhs)
cir::StoreOp createStore(mlir::Location loc, mlir::Value val, mlir::Value dst, bool isVolatile=false, bool isNontemporal=false, mlir::IntegerAttr align={}, cir::SyncScopeKindAttr scope={}, cir::MemOrderAttr order={})
cir::LoadOp createFlagLoad(mlir::Location loc, mlir::Value addr)
Emit a load from an boolean flag variable.
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.
constexpr bool testFlag(OverflowBehavior ob, OverflowBehavior flag)
LangAS
Defines the address space values used by the address space qualifier of QualType.
static bool metaDataNode()
static bool addressSpace()
static bool targetCodeGenInfoGetNullPointer()
static bool fpConstraints()
static bool fastMathFlags()