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 (mlir::isa<cir::BoolType>(ty)) {
131 llvm_unreachable(
"Zero initializer for given type is NYI");
134 cir::ConstantOp
getBool(
bool state, mlir::Location loc) {
135 return cir::ConstantOp::create(*
this, loc,
getCIRBoolAttr(state));
140 cir::BoolType
getBoolTy() {
return cir::BoolType::get(getContext()); }
141 cir::VoidType
getVoidTy() {
return cir::VoidType::get(getContext()); }
144 return cir::IntType::get(getContext(), n,
false);
148 if (
auto intType = mlir::dyn_cast<cir::IntTypeInterface>(eltTy))
149 return intType.getWidth();
150 if (
auto floatType = mlir::dyn_cast<cir::FPTypeInterface>(eltTy))
151 return floatType.getWidth();
153 llvm_unreachable(
"Unsupported type in getCIRIntOrFloatBitWidth");
156 return cir::IntType::get(getContext(), n,
true);
160 return cir::PointerType::get(ty);
164 mlir::ptr::MemorySpaceAttrInterface as) {
165 return cir::PointerType::get(ty, as);
172 mlir::ptr::MemorySpaceAttrInterface addrSpaceAttr =
178 return getPointerTo(cir::VoidType::get(getContext()), langAS);
181 cir::PointerType
getVoidPtrTy(mlir::ptr::MemorySpaceAttrInterface as) {
182 return getPointerTo(cir::VoidType::get(getContext()), as);
185 cir::MethodAttr
getMethodAttr(cir::MethodType ty, cir::FuncOp methodFuncOp) {
186 auto methodFuncSymbolRef = mlir::FlatSymbolRefAttr::get(methodFuncOp);
187 return cir::MethodAttr::get(ty, methodFuncSymbolRef);
191 return cir::MethodAttr::get(ty);
195 return cir::BoolAttr::get(getContext(), state);
203 auto resultComplexTy = cir::ComplexType::get(real.getType());
204 return cir::ComplexCreateOp::create(*
this, loc, resultComplexTy, real,
209 auto resultType = operand.getType();
210 if (
auto complexResultType = mlir::dyn_cast<cir::ComplexType>(resultType))
211 resultType = complexResultType.getElementType();
212 return cir::ComplexRealOp::create(*
this, loc, resultType, operand);
216 auto resultType = operand.getType();
217 if (
auto complexResultType = mlir::dyn_cast<cir::ComplexType>(resultType))
218 resultType = complexResultType.getElementType();
219 return cir::ComplexImagOp::create(*
this, loc, resultType, operand);
223 bool isVolatile =
false, uint64_t alignment = 0) {
225 return cir::LoadOp::create(*
this, loc, ptr,
false, isVolatile,
226 alignmentAttr, cir::SyncScopeKindAttr{},
227 cir::MemOrderAttr{});
231 uint64_t alignment) {
232 return createLoad(loc, ptr,
false, alignment);
235 mlir::Value
createNot(mlir::Location loc, mlir::Value value) {
236 return cir::NotOp::create(*
this, loc, value);
246 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> condBuilder,
247 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> bodyBuilder) {
248 return cir::DoWhileOp::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 return cir::WhileOp::create(*
this, loc, condBuilder, bodyBuilder);
262 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> condBuilder,
263 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> bodyBuilder,
264 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> stepBuilder) {
265 return cir::ForOp::create(*
this, loc, condBuilder, bodyBuilder,
271 return cir::BreakOp::create(*
this, loc);
276 return cir::ContinueOp::create(*
this, loc);
279 mlir::Value
createInc(mlir::Location loc, mlir::Value input,
281 return cir::IncOp::create(*
this, loc, input, nsw);
284 mlir::Value
createDec(mlir::Location loc, mlir::Value input,
286 return cir::DecOp::create(*
this, loc, input, nsw);
291 return cir::MinusOp::create(*
this, loc, input, nsw);
295 return cir::ConstPtrAttr::get(type, getI64IntegerAttr(value));
298 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
299 mlir::Type type, llvm::StringRef name,
300 mlir::IntegerAttr alignment,
301 mlir::Value dynAllocSize) {
302 return cir::AllocaOp::create(*
this, loc, addrType, type, name, alignment,
306 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
307 mlir::Type type, llvm::StringRef name,
309 mlir::Value dynAllocSize) {
311 return createAlloca(loc, addrType, type, name, alignmentAttr, dynAllocSize);
314 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
315 mlir::Type type, llvm::StringRef name,
316 mlir::IntegerAttr alignment) {
317 return cir::AllocaOp::create(*
this, loc, addrType, type, name, alignment);
320 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
321 mlir::Type type, llvm::StringRef name,
324 return createAlloca(loc, addrType, type, name, alignmentAttr);
330 mlir::ArrayAttr indices = {}) {
331 cir::PointerType type =
getPointerTo(globalOp.getSymType());
337 cir::GlobalOp globalOp,
338 mlir::ArrayAttr indices = {}) {
339 auto symbol = mlir::FlatSymbolRefAttr::get(globalOp.getSymNameAttr());
340 return cir::GlobalViewAttr::get(type, symbol, indices);
346 cir::GlobalOp globalOp,
349 for (int64_t ind : indices)
350 attrs.push_back(getI64IntegerAttr(ind));
351 mlir::ArrayAttr arAttr = mlir::ArrayAttr::get(getContext(), attrs);
356 bool threadLocal =
false) {
358 return cir::GetGlobalOp::create(*
this, loc,
360 global.getSymNameAttr(), threadLocal);
369 bool isVolatile =
false) {
370 return cir::CopyOp::create(*
this, dst.getLoc(), dst, src, isVolatile);
373 cir::StoreOp
createStore(mlir::Location loc, mlir::Value val, mlir::Value dst,
374 bool isVolatile =
false,
375 mlir::IntegerAttr align = {},
376 cir::SyncScopeKindAttr scope = {},
377 cir::MemOrderAttr order = {}) {
378 if (mlir::cast<cir::PointerType>(
dst.getType()).getPointee() !=
381 return cir::StoreOp::create(*
this, loc, val, dst, isVolatile, align, scope,
388 if (boolTy != mlir::cast<cir::PointerType>(addr.getType()).getPointee())
394 mlir::Value flag =
getBool(val, loc);
398 [[nodiscard]] cir::GlobalOp
400 mlir::StringRef name, mlir::Type type,
bool isConstant,
401 cir::GlobalLinkageKind linkage,
402 mlir::ptr::MemorySpaceAttrInterface addrSpace) {
403 mlir::OpBuilder::InsertionGuard guard(*
this);
404 setInsertionPointToStart(mlirModule.getBody());
405 return cir::GlobalOp::create(*
this, loc, name, type, isConstant, addrSpace,
410 mlir::Value base, llvm::StringRef name,
412 return cir::GetMemberOp::create(*
this, loc, resultTy, base, name, index);
419 return cir::LoadOp::create(*
this, loc, addr,
false,
420 false, alignmentAttr,
425 mlir::Value stride) {
426 return cir::PtrStrideOp::create(*
this, loc, base.getType(), base, stride);
433 cir::CallOp
createCallOp(mlir::Location loc, mlir::SymbolRefAttr callee,
434 mlir::Type returnType, mlir::ValueRange operands,
438 auto op = cir::CallOp::create(*
this, loc, callee, returnType, operands);
441 if (!argAttrs.empty()) {
442 llvm::SmallVector<mlir::Attribute> argDictAttrs;
443 argDictAttrs.reserve(argAttrs.size());
446 argAttrs, std::back_inserter(argDictAttrs),
447 [
this](llvm::ArrayRef<mlir::NamedAttribute> singleArgAttrs) {
448 return mlir::DictionaryAttr::get(getContext(), singleArgAttrs);
451 op.setArgAttrsAttr(mlir::ArrayAttr::get(getContext(), argDictAttrs));
454 if (!resAttrs.empty()) {
455 auto resultDictAttr = mlir::DictionaryAttr::get(getContext(), resAttrs);
456 op.setResAttrsAttr(mlir::ArrayAttr::get(getContext(), resultDictAttr));
462 mlir::ValueRange operands,
466 return createCallOp(loc, mlir::SymbolRefAttr::get(callee),
467 callee.getFunctionType().getReturnType(), operands,
468 attrs, argAttrs, resAttrs);
473 cir::FuncType funcType, mlir::ValueRange operands,
477 llvm::SmallVector<mlir::Value> resOperands{indirectTarget};
478 resOperands.append(operands.begin(), operands.end());
480 return createCallOp(loc, mlir::SymbolRefAttr(), funcType.getReturnType(),
481 resOperands, attrs, argAttrs, resAttrs);
484 cir::CallOp
createCallOp(mlir::Location loc, mlir::SymbolRefAttr callee,
485 mlir::ValueRange operands = mlir::ValueRange(),
489 return createCallOp(loc, callee, cir::VoidType(), operands, attrs, argAttrs,
498 mlir::Value src, mlir::Type newTy) {
499 if (newTy == src.getType())
501 return cir::CastOp::create(*
this, loc, newTy,
kind, src);
506 if (newTy == src.getType())
512 return createCast(cir::CastKind::integral, src, newTy);
516 return createCast(cir::CastKind::int_to_ptr, src, newTy);
520 return createCast(cir::CastKind::ptr_to_int, src, newTy);
528 return createCast(cir::CastKind::bool_to_int, src, newTy);
532 return createCast(cir::CastKind::bitcast, src, newTy);
537 return createCast(loc, cir::CastKind::bitcast, src, newTy);
541 assert(mlir::isa<cir::PointerType>(src.getType()) &&
"expected ptr src");
546 mlir::Value nullPtr =
getNullPtr(ptr.getType(), ptr.getLoc());
547 return createCompare(ptr.getLoc(), cir::CmpOpKind::eq, ptr, nullPtr);
551 mlir::Value nullPtr =
getNullPtr(ptr.getType(), ptr.getLoc());
552 return createCompare(ptr.getLoc(), cir::CmpOpKind::ne, ptr, nullPtr);
557 return createCast(loc, cir::CastKind::address_space, src, newTy);
572 return cir::VecExtractOp::create(*
this, loc, vec, idxVal);
576 mlir::Value newElt, uint64_t idx) {
579 return cir::VecInsertOp::create(*
this, loc, vec, newElt, idxVal);
583 auto resTy = cir::BoolType::get(getContext());
584 return cir::SignBitOp::create(*
this, loc, resTy, val);
593 llvm::APInt val = llvm::APInt::getLowBitsSet(size, bits);
594 auto type = cir::IntType::get(getContext(), size,
false);
598 mlir::Value
createAnd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
599 return cir::AndOp::create(*
this, loc, lhs, rhs);
602 mlir::Value
createOr(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
603 return cir::OrOp::create(*
this, loc, lhs, rhs);
607 mlir::Value trueValue, mlir::Value falseValue) {
608 assert(trueValue.getType() == falseValue.getType() &&
609 "trueValue and falseValue should have the same type");
610 return cir::SelectOp::create(*
this, loc, trueValue.getType(),
condition,
611 trueValue, falseValue);
624 mlir::Value
createMul(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
626 auto op = cir::MulOp::create(*
this, loc, lhs, rhs);
640 mlir::Value
createSub(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
642 auto op = cir::SubOp::create(*
this, loc, lhs, rhs);
659 mlir::Value
createAdd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
661 auto op = cir::AddOp::create(*
this, loc, lhs, rhs);
678 mlir::Value
createDiv(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
679 return cir::DivOp::create(*
this, loc, lhs, rhs);
682 mlir::Value
createRem(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
683 return cir::RemOp::create(*
this, loc, lhs, rhs);
686 mlir::Value
createXor(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
687 return cir::XorOp::create(*
this, loc, lhs, rhs);
690 mlir::Value
createMax(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
691 return cir::MaxOp::create(*
this, loc, lhs, rhs);
695 mlir::Value lhs, mlir::Value rhs) {
696 return cir::CmpOp::create(*
this, loc,
kind, lhs, rhs);
700 mlir::Value lhs, mlir::Value rhs) {
701 VectorType vecCast = mlir::cast<VectorType>(lhs.getType());
704 VectorType integralVecTy =
705 cir::VectorType::get(integralTy, vecCast.getSize());
706 return cir::VecCmpOp::create(*
this, loc, integralVecTy,
kind, lhs, rhs);
709 mlir::Value
createIsNaN(mlir::Location loc, mlir::Value operand) {
710 return createCompare(loc, cir::CmpOpKind::ne, operand, operand);
713 mlir::Value
createShift(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
715 return cir::ShiftOp::create(*
this, loc, lhs.getType(), lhs, rhs,
720 const llvm::APInt &rhs,
bool isShiftLeft) {
725 mlir::Value
createShift(mlir::Location loc, mlir::Value lhs,
unsigned bits,
727 auto width = mlir::dyn_cast<cir::IntType>(lhs.getType()).getWidth();
728 auto shift = llvm::APInt(width, bits);
758 std::find_if(block->rbegin(), block->rend(), [](mlir::Operation &op) {
759 return mlir::isa<cir::AllocaOp, cir::LabelOp>(&op);
762 if (last != block->rend())
763 return OpBuilder::InsertPoint(block, ++mlir::Block::iterator(&*last));
764 return OpBuilder::InsertPoint(block, block->begin());
785 return alignment ? getI64IntegerAttr(alignment) : mlir::IntegerAttr();
793 cir::ConstantOp
getNullPtr(mlir::Type ty, mlir::Location loc) {
804 cir::YieldOp
createYield(mlir::Location loc, mlir::ValueRange value = {}) {
805 return cir::YieldOp::create(*
this, loc, value);
814 mlir::Value objectPtr) {
817 mlir::cast<cir::MethodType>(method.getType()).getMemberFuncTy();
818 auto methodFuncInputTypes = methodFuncTy.getInputs();
820 auto objectPtrTy = mlir::cast<cir::PointerType>(objectPtr.getType());
821 mlir::Type adjustedThisTy =
getVoidPtrTy(objectPtrTy.getAddrSpace());
824 calleeFuncInputTypes.insert(calleeFuncInputTypes.end(),
825 methodFuncInputTypes.begin(),
826 methodFuncInputTypes.end());
827 cir::FuncType calleeFuncTy =
828 methodFuncTy.clone(calleeFuncInputTypes, methodFuncTy.getReturnType());
833 auto op = cir::GetMethodOp::create(*
this, loc, calleeTy, adjustedThisTy,
835 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)
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)
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 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.
const half4 dst(half4 Src0, half4 Src1)
static bool addressSpace()
static bool targetCodeGenInfoGetNullPointer()