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 (mlir::isa<cir::BoolType>(ty)) {
133 llvm_unreachable(
"Zero initializer for given type is NYI");
136 cir::ConstantOp
getBool(
bool state, mlir::Location loc) {
137 return cir::ConstantOp::create(*
this, loc,
getCIRBoolAttr(state));
142 cir::BoolType
getBoolTy() {
return cir::BoolType::get(getContext()); }
143 cir::VoidType
getVoidTy() {
return cir::VoidType::get(getContext()); }
146 return cir::IntType::get(getContext(), n,
false);
150 if (
auto intType = mlir::dyn_cast<cir::IntTypeInterface>(eltTy))
151 return intType.getWidth();
152 if (
auto floatType = mlir::dyn_cast<cir::FPTypeInterface>(eltTy))
153 return floatType.getWidth();
155 llvm_unreachable(
"Unsupported type in getCIRIntOrFloatBitWidth");
158 return cir::IntType::get(getContext(), n,
true);
162 return cir::PointerType::get(ty);
166 mlir::ptr::MemorySpaceAttrInterface as) {
167 return cir::PointerType::get(ty, as);
174 mlir::ptr::MemorySpaceAttrInterface addrSpaceAttr =
180 return getPointerTo(cir::VoidType::get(getContext()), langAS);
183 cir::PointerType
getVoidPtrTy(mlir::ptr::MemorySpaceAttrInterface as) {
184 return getPointerTo(cir::VoidType::get(getContext()), as);
187 cir::MethodAttr
getMethodAttr(cir::MethodType ty, cir::FuncOp methodFuncOp) {
188 auto methodFuncSymbolRef = mlir::FlatSymbolRefAttr::get(methodFuncOp);
189 return cir::MethodAttr::get(ty, methodFuncSymbolRef);
193 return cir::MethodAttr::get(ty);
197 return cir::BoolAttr::get(getContext(), state);
205 auto resultComplexTy = cir::ComplexType::get(real.getType());
206 return cir::ComplexCreateOp::create(*
this, loc, resultComplexTy, real,
211 auto resultType = operand.getType();
212 if (
auto complexResultType = mlir::dyn_cast<cir::ComplexType>(resultType))
213 resultType = complexResultType.getElementType();
214 return cir::ComplexRealOp::create(*
this, loc, resultType, operand);
218 auto resultType = operand.getType();
219 if (
auto complexResultType = mlir::dyn_cast<cir::ComplexType>(resultType))
220 resultType = complexResultType.getElementType();
221 return cir::ComplexImagOp::create(*
this, loc, resultType, operand);
225 bool isVolatile =
false, uint64_t alignment = 0) {
227 return cir::LoadOp::create(*
this, loc, ptr,
false, isVolatile,
228 alignmentAttr, cir::SyncScopeKindAttr{},
229 cir::MemOrderAttr{});
233 uint64_t alignment) {
234 return createLoad(loc, ptr,
false, alignment);
237 mlir::Value
createNot(mlir::Location loc, mlir::Value value) {
238 return cir::NotOp::create(*
this, loc, value);
248 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> condBuilder,
249 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> bodyBuilder) {
250 return cir::DoWhileOp::create(*
this, loc, condBuilder, bodyBuilder);
256 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> condBuilder,
257 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> bodyBuilder) {
258 return cir::WhileOp::create(*
this, loc, condBuilder, bodyBuilder);
264 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> condBuilder,
265 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> bodyBuilder,
266 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> stepBuilder) {
267 return cir::ForOp::create(*
this, loc, condBuilder, bodyBuilder,
273 return cir::BreakOp::create(*
this, loc);
278 return cir::ContinueOp::create(*
this, loc);
281 mlir::Value
createInc(mlir::Location loc, mlir::Value input,
283 return cir::IncOp::create(*
this, loc, input, nsw);
286 mlir::Value
createDec(mlir::Location loc, mlir::Value input,
288 return cir::DecOp::create(*
this, loc, input, nsw);
293 return cir::MinusOp::create(*
this, loc, input, nsw);
297 return cir::ConstPtrAttr::get(type, getI64IntegerAttr(value));
300 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
301 mlir::Type type, llvm::StringRef name,
302 mlir::IntegerAttr alignment,
303 mlir::Value dynAllocSize) {
304 return cir::AllocaOp::create(*
this, loc, addrType, type, name, alignment,
308 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
309 mlir::Type type, llvm::StringRef name,
311 mlir::Value dynAllocSize) {
313 return createAlloca(loc, addrType, type, name, alignmentAttr, dynAllocSize);
316 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
317 mlir::Type type, llvm::StringRef name,
318 mlir::IntegerAttr alignment) {
319 return cir::AllocaOp::create(*
this, loc, addrType, type, name, alignment);
322 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
323 mlir::Type type, llvm::StringRef name,
326 return createAlloca(loc, addrType, type, name, alignmentAttr);
332 mlir::ArrayAttr indices = {}) {
333 cir::PointerType type =
getPointerTo(globalOp.getSymType());
339 cir::GlobalOp globalOp,
340 mlir::ArrayAttr indices = {}) {
341 auto symbol = mlir::FlatSymbolRefAttr::get(globalOp.getSymNameAttr());
342 return cir::GlobalViewAttr::get(type, symbol, indices);
348 cir::GlobalOp globalOp,
351 for (int64_t ind : indices)
352 attrs.push_back(getI64IntegerAttr(ind));
353 mlir::ArrayAttr arAttr = mlir::ArrayAttr::get(getContext(), attrs);
358 bool threadLocal =
false) {
360 return cir::GetGlobalOp::create(*
this, loc,
362 global.getSymNameAttr(), threadLocal);
366 bool threadLocal =
false) {
372 bool isVolatile =
false,
373 bool skipTailPadding =
false) {
374 return cir::CopyOp::create(*
this, dst.getLoc(), dst, src, isVolatile,
378 cir::StoreOp
createStore(mlir::Location loc, mlir::Value val, mlir::Value dst,
379 bool isVolatile =
false,
380 mlir::IntegerAttr align = {},
381 cir::SyncScopeKindAttr scope = {},
382 cir::MemOrderAttr order = {}) {
383 if (mlir::cast<cir::PointerType>(dst.getType()).getPointee() !=
386 return cir::StoreOp::create(*
this, loc, val, dst, isVolatile, align, scope,
393 if (boolTy != mlir::cast<cir::PointerType>(addr.getType()).getPointee())
399 mlir::Value flag =
getBool(val, loc);
403 [[nodiscard]] cir::GlobalOp
405 mlir::StringRef name, mlir::Type type,
bool isConstant,
406 cir::GlobalLinkageKind linkage,
407 mlir::ptr::MemorySpaceAttrInterface addrSpace) {
408 mlir::OpBuilder::InsertionGuard guard(*
this);
409 setInsertionPointToStart(mlirModule.getBody());
410 return cir::GlobalOp::create(*
this, loc, name, type, isConstant, addrSpace,
415 mlir::Value base, llvm::StringRef name,
417 return cir::GetMemberOp::create(*
this, loc, resultTy, base, name, index);
424 return cir::LoadOp::create(*
this, loc, addr,
false,
425 false, alignmentAttr,
430 mlir::Value stride) {
431 return cir::PtrStrideOp::create(*
this, loc, base.getType(), base, stride);
438 cir::CallOp
createCallOp(mlir::Location loc, mlir::SymbolRefAttr callee,
439 mlir::Type returnType, mlir::ValueRange operands,
443 auto op = cir::CallOp::create(*
this, loc, callee, returnType, operands);
446 if (!argAttrs.empty()) {
447 llvm::SmallVector<mlir::Attribute> argDictAttrs;
448 argDictAttrs.reserve(argAttrs.size());
451 argAttrs, std::back_inserter(argDictAttrs),
452 [
this](llvm::ArrayRef<mlir::NamedAttribute> singleArgAttrs) {
453 return mlir::DictionaryAttr::get(getContext(), singleArgAttrs);
456 op.setArgAttrsAttr(mlir::ArrayAttr::get(getContext(), argDictAttrs));
459 if (!resAttrs.empty()) {
460 auto resultDictAttr = mlir::DictionaryAttr::get(getContext(), resAttrs);
461 op.setResAttrsAttr(mlir::ArrayAttr::get(getContext(), resultDictAttr));
467 mlir::ValueRange operands,
471 return createCallOp(loc, mlir::SymbolRefAttr::get(callee),
472 callee.getFunctionType().getReturnType(), operands,
473 attrs, argAttrs, resAttrs);
478 cir::FuncType funcType, mlir::ValueRange operands,
482 llvm::SmallVector<mlir::Value> resOperands{indirectTarget};
483 resOperands.append(operands.begin(), operands.end());
485 return createCallOp(loc, mlir::SymbolRefAttr(), funcType.getReturnType(),
486 resOperands, attrs, argAttrs, resAttrs);
489 cir::CallOp
createCallOp(mlir::Location loc, mlir::SymbolRefAttr callee,
490 mlir::ValueRange operands = mlir::ValueRange(),
494 return createCallOp(loc, callee, cir::VoidType(), operands, attrs, argAttrs,
503 mlir::Value src, mlir::Type newTy) {
504 if (newTy == src.getType())
506 return cir::CastOp::create(*
this, loc, newTy,
kind, src);
511 if (newTy == src.getType())
517 return createCast(cir::CastKind::integral, src, newTy);
521 return createCast(cir::CastKind::int_to_ptr, src, newTy);
525 return createCast(cir::CastKind::ptr_to_int, src, newTy);
533 return createCast(cir::CastKind::bool_to_int, src, newTy);
537 return createCast(cir::CastKind::bitcast, src, newTy);
542 return createCast(loc, cir::CastKind::bitcast, src, newTy);
546 assert(mlir::isa<cir::PointerType>(src.getType()) &&
"expected ptr src");
551 mlir::Value nullPtr =
getNullPtr(ptr.getType(), ptr.getLoc());
552 return createCompare(ptr.getLoc(), cir::CmpOpKind::eq, ptr, nullPtr);
556 mlir::Value nullPtr =
getNullPtr(ptr.getType(), ptr.getLoc());
557 return createCompare(ptr.getLoc(), cir::CmpOpKind::ne, ptr, nullPtr);
562 return createCast(loc, cir::CastKind::address_space, src, newTy);
577 return cir::VecExtractOp::create(*
this, loc, vec, idxVal);
581 mlir::Value newElt, uint64_t idx) {
584 return cir::VecInsertOp::create(*
this, loc, vec, newElt, idxVal);
588 auto resTy = cir::BoolType::get(getContext());
589 return cir::SignBitOp::create(*
this, loc, resTy, val);
598 llvm::APInt val = llvm::APInt::getLowBitsSet(size, bits);
599 auto type = cir::IntType::get(getContext(), size,
false);
603 mlir::Value
createAnd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
604 return cir::AndOp::create(*
this, loc, lhs, rhs);
607 mlir::Value
createOr(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
608 return cir::OrOp::create(*
this, loc, lhs, rhs);
612 mlir::Value trueValue, mlir::Value falseValue) {
613 assert(trueValue.getType() == falseValue.getType() &&
614 "trueValue and falseValue should have the same type");
615 return cir::SelectOp::create(*
this, loc, trueValue.getType(),
condition,
616 trueValue, falseValue);
629 mlir::Value
createMul(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
631 auto op = cir::MulOp::create(*
this, loc, lhs, rhs);
645 mlir::Value
createSub(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
647 auto op = cir::SubOp::create(*
this, loc, lhs, rhs);
664 mlir::Value
createAdd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
666 auto op = cir::AddOp::create(*
this, loc, lhs, rhs);
683 mlir::Value
createDiv(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
684 return cir::DivOp::create(*
this, loc, lhs, rhs);
687 mlir::Value
createRem(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
688 return cir::RemOp::create(*
this, loc, lhs, rhs);
691 mlir::Value
createXor(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
692 return cir::XorOp::create(*
this, loc, lhs, rhs);
695 mlir::Value
createMax(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
696 return cir::MaxOp::create(*
this, loc, lhs, rhs);
700 mlir::Value lhs, mlir::Value rhs) {
701 return cir::CmpOp::create(*
this, loc,
kind, lhs, rhs);
705 mlir::Value lhs, mlir::Value rhs) {
706 VectorType vecCast = mlir::cast<VectorType>(lhs.getType());
709 VectorType integralVecTy =
710 cir::VectorType::get(integralTy, vecCast.getSize());
711 return cir::VecCmpOp::create(*
this, loc, integralVecTy,
kind, lhs, rhs);
714 mlir::Value
createIsNaN(mlir::Location loc, mlir::Value operand) {
715 return createCompare(loc, cir::CmpOpKind::ne, operand, operand);
718 mlir::Value
createShift(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
720 return cir::ShiftOp::create(*
this, loc, lhs.getType(), lhs, rhs,
725 const llvm::APInt &rhs,
bool isShiftLeft) {
730 mlir::Value
createShift(mlir::Location loc, mlir::Value lhs,
unsigned bits,
732 auto width = mlir::dyn_cast<cir::IntType>(lhs.getType()).getWidth();
733 auto shift = llvm::APInt(width, bits);
759 return cir::FuncType::get(llvm::to_vector(argTypes),
getVoidTy());
773 std::find_if(block->rbegin(), block->rend(), [](mlir::Operation &op) {
774 return mlir::isa<cir::AllocaOp, cir::LabelOp>(&op);
777 if (last != block->rend())
778 return OpBuilder::InsertPoint(block, ++mlir::Block::iterator(&*last));
779 return OpBuilder::InsertPoint(block, block->begin());
800 return alignment ? getI64IntegerAttr(alignment) : mlir::IntegerAttr();
808 cir::ConstantOp
getNullPtr(mlir::Type ty, mlir::Location loc) {
819 cir::YieldOp
createYield(mlir::Location loc, mlir::ValueRange value = {}) {
820 return cir::YieldOp::create(*
this, loc, value);
829 mlir::Value objectPtr) {
832 mlir::cast<cir::MethodType>(method.getType()).getMemberFuncTy();
833 auto methodFuncInputTypes = methodFuncTy.getInputs();
835 auto objectPtrTy = mlir::cast<cir::PointerType>(objectPtr.getType());
836 mlir::Type adjustedThisTy =
getVoidPtrTy(objectPtrTy.getAddrSpace());
839 calleeFuncInputTypes.insert(calleeFuncInputTypes.end(),
840 methodFuncInputTypes.begin(),
841 methodFuncInputTypes.end());
842 cir::FuncType calleeFuncTy =
843 methodFuncTy.clone(calleeFuncInputTypes, methodFuncTy.getReturnType());
848 auto op = cir::GetMethodOp::create(*
this, loc, calleeTy, adjustedThisTy,
850 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)
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)
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 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::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, 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)
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)
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 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)
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 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)
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 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={})
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.
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)
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.
constexpr bool testFlag(OverflowBehavior ob, OverflowBehavior flag)
LangAS
Defines the address space values used by the address space qualifier of QualType.
static bool addressSpace()
static bool targetCodeGenInfoGetNullPointer()