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);
371 bool isVolatile =
false,
372 bool skipTailPadding =
false) {
373 return cir::CopyOp::create(*
this, dst.getLoc(), dst, src, isVolatile,
377 cir::StoreOp
createStore(mlir::Location loc, mlir::Value val, mlir::Value dst,
378 bool isVolatile =
false,
379 mlir::IntegerAttr align = {},
380 cir::SyncScopeKindAttr scope = {},
381 cir::MemOrderAttr order = {}) {
382 if (mlir::cast<cir::PointerType>(dst.getType()).getPointee() !=
385 return cir::StoreOp::create(*
this, loc, val, dst, isVolatile, align, scope,
392 if (boolTy != mlir::cast<cir::PointerType>(addr.getType()).getPointee())
398 mlir::Value flag =
getBool(val, loc);
402 [[nodiscard]] cir::GlobalOp
404 mlir::StringRef name, mlir::Type type,
bool isConstant,
405 cir::GlobalLinkageKind linkage,
406 mlir::ptr::MemorySpaceAttrInterface addrSpace) {
407 mlir::OpBuilder::InsertionGuard guard(*
this);
408 setInsertionPointToStart(mlirModule.getBody());
409 return cir::GlobalOp::create(*
this, loc, name, type, isConstant, addrSpace,
414 mlir::Value base, llvm::StringRef name,
416 return cir::GetMemberOp::create(*
this, loc, resultTy, base, name, index);
423 return cir::LoadOp::create(*
this, loc, addr,
false,
424 false, alignmentAttr,
429 mlir::Value stride) {
430 return cir::PtrStrideOp::create(*
this, loc, base.getType(), base, stride);
437 cir::CallOp
createCallOp(mlir::Location loc, mlir::SymbolRefAttr callee,
438 mlir::Type returnType, mlir::ValueRange operands,
442 auto op = cir::CallOp::create(*
this, loc, callee, returnType, operands);
445 if (!argAttrs.empty()) {
446 llvm::SmallVector<mlir::Attribute> argDictAttrs;
447 argDictAttrs.reserve(argAttrs.size());
450 argAttrs, std::back_inserter(argDictAttrs),
451 [
this](llvm::ArrayRef<mlir::NamedAttribute> singleArgAttrs) {
452 return mlir::DictionaryAttr::get(getContext(), singleArgAttrs);
455 op.setArgAttrsAttr(mlir::ArrayAttr::get(getContext(), argDictAttrs));
458 if (!resAttrs.empty()) {
459 auto resultDictAttr = mlir::DictionaryAttr::get(getContext(), resAttrs);
460 op.setResAttrsAttr(mlir::ArrayAttr::get(getContext(), resultDictAttr));
466 mlir::ValueRange operands,
470 return createCallOp(loc, mlir::SymbolRefAttr::get(callee),
471 callee.getFunctionType().getReturnType(), operands,
472 attrs, argAttrs, resAttrs);
477 cir::FuncType funcType, mlir::ValueRange operands,
481 llvm::SmallVector<mlir::Value> resOperands{indirectTarget};
482 resOperands.append(operands.begin(), operands.end());
484 return createCallOp(loc, mlir::SymbolRefAttr(), funcType.getReturnType(),
485 resOperands, attrs, argAttrs, resAttrs);
488 cir::CallOp
createCallOp(mlir::Location loc, mlir::SymbolRefAttr callee,
489 mlir::ValueRange operands = mlir::ValueRange(),
493 return createCallOp(loc, callee, cir::VoidType(), operands, attrs, argAttrs,
502 mlir::Value src, mlir::Type newTy) {
503 if (newTy == src.getType())
505 return cir::CastOp::create(*
this, loc, newTy,
kind, src);
510 if (newTy == src.getType())
516 return createCast(cir::CastKind::integral, src, newTy);
520 return createCast(cir::CastKind::int_to_ptr, src, newTy);
524 return createCast(cir::CastKind::ptr_to_int, src, newTy);
532 return createCast(cir::CastKind::bool_to_int, src, newTy);
536 return createCast(cir::CastKind::bitcast, src, newTy);
541 return createCast(loc, cir::CastKind::bitcast, src, newTy);
545 assert(mlir::isa<cir::PointerType>(src.getType()) &&
"expected ptr src");
550 mlir::Value nullPtr =
getNullPtr(ptr.getType(), ptr.getLoc());
551 return createCompare(ptr.getLoc(), cir::CmpOpKind::eq, ptr, nullPtr);
555 mlir::Value nullPtr =
getNullPtr(ptr.getType(), ptr.getLoc());
556 return createCompare(ptr.getLoc(), cir::CmpOpKind::ne, ptr, nullPtr);
561 return createCast(loc, cir::CastKind::address_space, src, newTy);
576 return cir::VecExtractOp::create(*
this, loc, vec, idxVal);
580 mlir::Value newElt, uint64_t idx) {
583 return cir::VecInsertOp::create(*
this, loc, vec, newElt, idxVal);
587 auto resTy = cir::BoolType::get(getContext());
588 return cir::SignBitOp::create(*
this, loc, resTy, val);
597 llvm::APInt val = llvm::APInt::getLowBitsSet(size, bits);
598 auto type = cir::IntType::get(getContext(), size,
false);
602 mlir::Value
createAnd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
603 return cir::AndOp::create(*
this, loc, lhs, rhs);
606 mlir::Value
createOr(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
607 return cir::OrOp::create(*
this, loc, lhs, rhs);
611 mlir::Value trueValue, mlir::Value falseValue) {
612 assert(trueValue.getType() == falseValue.getType() &&
613 "trueValue and falseValue should have the same type");
614 return cir::SelectOp::create(*
this, loc, trueValue.getType(),
condition,
615 trueValue, falseValue);
628 mlir::Value
createMul(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
630 auto op = cir::MulOp::create(*
this, loc, lhs, rhs);
644 mlir::Value
createSub(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
646 auto op = cir::SubOp::create(*
this, loc, lhs, rhs);
663 mlir::Value
createAdd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
665 auto op = cir::AddOp::create(*
this, loc, lhs, rhs);
682 mlir::Value
createDiv(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
683 return cir::DivOp::create(*
this, loc, lhs, rhs);
686 mlir::Value
createRem(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
687 return cir::RemOp::create(*
this, loc, lhs, rhs);
690 mlir::Value
createXor(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
691 return cir::XorOp::create(*
this, loc, lhs, rhs);
694 mlir::Value
createMax(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
695 return cir::MaxOp::create(*
this, loc, lhs, rhs);
699 mlir::Value lhs, mlir::Value rhs) {
700 return cir::CmpOp::create(*
this, loc,
kind, lhs, rhs);
704 mlir::Value lhs, mlir::Value rhs) {
705 VectorType vecCast = mlir::cast<VectorType>(lhs.getType());
708 VectorType integralVecTy =
709 cir::VectorType::get(integralTy, vecCast.getSize());
710 return cir::VecCmpOp::create(*
this, loc, integralVecTy,
kind, lhs, rhs);
713 mlir::Value
createIsNaN(mlir::Location loc, mlir::Value operand) {
714 return createCompare(loc, cir::CmpOpKind::ne, operand, operand);
717 mlir::Value
createShift(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
719 return cir::ShiftOp::create(*
this, loc, lhs.getType(), lhs, rhs,
724 const llvm::APInt &rhs,
bool isShiftLeft) {
729 mlir::Value
createShift(mlir::Location loc, mlir::Value lhs,
unsigned bits,
731 auto width = mlir::dyn_cast<cir::IntType>(lhs.getType()).getWidth();
732 auto shift = llvm::APInt(width, bits);
762 std::find_if(block->rbegin(), block->rend(), [](mlir::Operation &op) {
763 return mlir::isa<cir::AllocaOp, cir::LabelOp>(&op);
766 if (last != block->rend())
767 return OpBuilder::InsertPoint(block, ++mlir::Block::iterator(&*last));
768 return OpBuilder::InsertPoint(block, block->begin());
789 return alignment ? getI64IntegerAttr(alignment) : mlir::IntegerAttr();
797 cir::ConstantOp
getNullPtr(mlir::Type ty, mlir::Location loc) {
808 cir::YieldOp
createYield(mlir::Location loc, mlir::ValueRange value = {}) {
809 return cir::YieldOp::create(*
this, loc, value);
818 mlir::Value objectPtr) {
821 mlir::cast<cir::MethodType>(method.getType()).getMemberFuncTy();
822 auto methodFuncInputTypes = methodFuncTy.getInputs();
824 auto objectPtrTy = mlir::cast<cir::PointerType>(objectPtr.getType());
825 mlir::Type adjustedThisTy =
getVoidPtrTy(objectPtrTy.getAddrSpace());
828 calleeFuncInputTypes.insert(calleeFuncInputTypes.end(),
829 methodFuncInputTypes.begin(),
830 methodFuncInputTypes.end());
831 cir::FuncType calleeFuncTy =
832 methodFuncTy.clone(calleeFuncInputTypes, methodFuncTy.getReturnType());
837 auto op = cir::GetMethodOp::create(*
this, loc, calleeTy, adjustedThisTy,
839 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)
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)
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::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::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)
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)
mlir::TypedAttr getNullDataMemberAttr(cir::DataMemberType ty)
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 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()