9#ifndef LLVM_CLANG_CIR_DIALECT_BUILDER_CIRBASEBUILDER_H
10#define LLVM_CLANG_CIR_DIALECT_BUILDER_CIRBASEBUILDER_H
19#include "llvm/ADT/STLForwardCompat.h"
20#include "llvm/IR/FPEnv.h"
21#include "llvm/Support/ErrorHandling.h"
23#include "mlir/Dialect/Ptr/IR/MemorySpaceInterfaces.h"
24#include "mlir/IR/Builders.h"
25#include "mlir/IR/BuiltinAttributes.h"
26#include "mlir/IR/Location.h"
27#include "mlir/IR/OperationSupport.h"
28#include "mlir/IR/Types.h"
41 llvm::to_underlying(b));
46 llvm::to_underlying(b));
69 :
mlir::OpBuilder(&mlirContext) {}
76 llvm::RoundingMode::NearestTiesToEven;
79 const llvm::APInt &val) {
80 return cir::ConstantOp::create(*
this, loc, cir::IntAttr::get(typ, val));
83 cir::ConstantOp
getConstant(mlir::Location loc, mlir::TypedAttr attr) {
84 return cir::ConstantOp::create(*
this, loc, attr);
89 return getConstant(loc, cir::IntAttr::get(ty, value));
92 mlir::Value
getSignedInt(mlir::Location loc, int64_t val,
unsigned numBits) {
93 auto type = cir::IntType::get(getContext(), numBits,
true);
95 llvm::APInt(numBits, val,
true));
100 auto type = cir::IntType::get(getContext(), numBits,
false);
110 assert(mlir::isa<cir::PointerType>(t) &&
"expected cir.ptr");
115 return cir::DataMemberAttr::get(ty);
119 if (
auto bitFieldTy = mlir::dyn_cast<cir::BitFieldType>(ty)) {
120 assert(bitFieldTy.ownsBytes() &&
121 "a zero-width bit-field takes no initializer");
124 if (mlir::isa<cir::IntType>(ty))
125 return cir::IntAttr::get(ty, 0);
126 if (cir::isAnyFloatingPointType(ty))
127 return cir::FPAttr::getZero(ty);
128 if (
auto complexType = mlir::dyn_cast<cir::ComplexType>(ty))
129 return cir::ZeroAttr::get(complexType);
130 if (
auto arrTy = mlir::dyn_cast<cir::ArrayType>(ty))
131 return cir::ZeroAttr::get(arrTy);
132 if (
auto vecTy = mlir::dyn_cast<cir::VectorType>(ty))
133 return cir::ZeroAttr::get(vecTy);
134 if (
auto ptrTy = mlir::dyn_cast<cir::PointerType>(ty))
136 if (
auto recordTy = mlir::dyn_cast<cir::RecordType>(ty))
137 return cir::ZeroAttr::get(recordTy);
138 if (
auto dataMemberTy = mlir::dyn_cast<cir::DataMemberType>(ty))
140 if (
auto methodTy = mlir::dyn_cast<cir::MethodType>(ty))
142 if (
auto vptrTy = mlir::dyn_cast<cir::VPtrType>(ty))
143 return cir::ZeroAttr::get(vptrTy);
144 if (mlir::isa<cir::BoolType>(ty)) {
148 llvm_unreachable(
"Zero initializer for given type is NYI");
151 cir::ConstantOp
getBool(
bool state, mlir::Location loc) {
152 return cir::ConstantOp::create(*
this, loc,
getCIRBoolAttr(state));
157 cir::BoolType
getBoolTy() {
return cir::BoolType::get(getContext()); }
158 cir::VoidType
getVoidTy() {
return cir::VoidType::get(getContext()); }
161 return cir::IntType::get(getContext(), n,
false);
165 if (
auto intType = mlir::dyn_cast<cir::IntTypeInterface>(eltTy))
166 return intType.getWidth();
167 if (
auto floatType = mlir::dyn_cast<cir::FPTypeInterface>(eltTy))
168 return floatType.getWidth();
170 llvm_unreachable(
"Unsupported type in getCIRIntOrFloatBitWidth");
173 return cir::IntType::get(getContext(), n,
true);
177 return cir::PointerType::get(ty);
181 mlir::ptr::MemorySpaceAttrInterface as) {
182 return cir::PointerType::get(ty, as);
189 mlir::ptr::MemorySpaceAttrInterface addrSpaceAttr =
195 return getPointerTo(cir::VoidType::get(getContext()), langAS);
198 cir::PointerType
getVoidPtrTy(mlir::ptr::MemorySpaceAttrInterface as) {
199 return getPointerTo(cir::VoidType::get(getContext()), as);
202 cir::MethodAttr
getMethodAttr(cir::MethodType ty, cir::FuncOp methodFuncOp) {
203 auto methodFuncSymbolRef = mlir::FlatSymbolRefAttr::get(methodFuncOp);
204 return cir::MethodAttr::get(ty, methodFuncSymbolRef);
208 return cir::MethodAttr::get(ty);
212 return cir::BoolAttr::get(getContext(), state);
261 cir::FPDynamicRoundingMode roundingMode;
263 case llvm::RoundingMode::NearestTiesToEven:
264 roundingMode = cir::FPDynamicRoundingMode::ToNearest;
266 case llvm::RoundingMode::TowardNegative:
267 roundingMode = cir::FPDynamicRoundingMode::Downward;
269 case llvm::RoundingMode::TowardPositive:
270 roundingMode = cir::FPDynamicRoundingMode::Upward;
272 case llvm::RoundingMode::TowardZero:
273 roundingMode = cir::FPDynamicRoundingMode::UpwardZero;
275 case llvm::RoundingMode::NearestTiesToAway:
276 roundingMode = cir::FPDynamicRoundingMode::ToNearestAway;
278 case llvm::RoundingMode::Dynamic:
279 roundingMode = cir::FPDynamicRoundingMode::Unknown;
282 llvm_unreachable(
"unexpected constrained rounding mode");
285 cir::FPExceptionMode exceptMode;
289 exceptMode = cir::FPExceptionMode::Masked;
290 strictExcept =
false;
293 exceptMode = cir::FPExceptionMode::Unknown;
294 strictExcept =
false;
297 exceptMode = cir::FPExceptionMode::Unknown;
301 llvm_unreachable(
"unexpected constrained exception mode");
304 return cir::FenvAttr::get(getContext(), roundingMode, exceptMode,
305 mlir::BoolAttr::get(getContext(), strictExcept));
310 auto resultComplexTy = cir::ComplexType::get(real.getType());
311 return cir::ComplexCreateOp::create(*
this, loc, resultComplexTy, real,
316 auto resultType = operand.getType();
317 if (
auto complexResultType = mlir::dyn_cast<cir::ComplexType>(resultType))
318 resultType = complexResultType.getElementType();
319 return cir::ComplexRealOp::create(*
this, loc, resultType, operand);
323 auto resultType = operand.getType();
324 if (
auto complexResultType = mlir::dyn_cast<cir::ComplexType>(resultType))
325 resultType = complexResultType.getElementType();
326 return cir::ComplexImagOp::create(*
this, loc, resultType, operand);
330 return cir::ComplexConjOp::create(*
this, loc, operand.getType(), operand);
334 bool isVolatile =
false, uint64_t alignment = 0,
335 bool isNontemporal =
false) {
337 return cir::LoadOp::create(*
this, loc, ptr,
false, isVolatile,
338 isNontemporal, alignmentAttr,
339 cir::SyncScopeKindAttr{}, cir::MemOrderAttr{},
344 uint64_t alignment) {
345 return createLoad(loc, ptr,
false, alignment);
348 mlir::Value
createNot(mlir::Location loc, mlir::Value value) {
349 return cir::NotOp::create(*
this, loc, value);
359 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> condBuilder,
360 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> bodyBuilder) {
361 return cir::DoWhileOp::create(*
this, loc, condBuilder, bodyBuilder);
367 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> condBuilder,
368 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> bodyBuilder) {
369 return cir::WhileOp::create(*
this, loc, condBuilder, bodyBuilder);
375 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> condBuilder,
376 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> bodyBuilder,
377 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)>
379 cir::CleanupKind cleanupKind) {
380 return cir::WhileOp::create(*
this, loc, condBuilder, bodyBuilder,
381 cleanupBuilder, cleanupKind);
387 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> condBuilder,
388 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> bodyBuilder,
389 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> stepBuilder) {
390 return cir::ForOp::create(*
this, loc, condBuilder, bodyBuilder,
397 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> condBuilder,
398 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> bodyBuilder,
399 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> stepBuilder,
400 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)>
402 cir::CleanupKind cleanupKind) {
403 return cir::ForOp::create(*
this, loc, condBuilder, bodyBuilder, stepBuilder,
404 cleanupBuilder, cleanupKind);
409 return cir::BreakOp::create(*
this, loc);
414 return cir::ContinueOp::create(*
this, loc);
417 mlir::Value
createInc(mlir::Location loc, mlir::Value input,
419 return cir::IncOp::create(*
this, loc, input, nsw);
422 mlir::Value
createDec(mlir::Location loc, mlir::Value input,
424 return cir::DecOp::create(*
this, loc, input, nsw);
429 return cir::MinusOp::create(*
this, loc, input, nsw);
433 return cir::ConstPtrAttr::get(type, getI64IntegerAttr(value));
436 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
437 llvm::StringRef name, mlir::IntegerAttr alignment,
438 mlir::Value dynAllocSize) {
439 return cir::AllocaOp::create(*
this, loc, addrType, name, alignment,
443 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
444 mlir::Type type, llvm::StringRef name,
446 mlir::Value dynAllocSize) {
448 return createAlloca(loc, addrType, name, alignmentAttr, dynAllocSize);
451 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
452 llvm::StringRef name, mlir::IntegerAttr alignment) {
453 return cir::AllocaOp::create(*
this, loc, addrType, name, alignment);
456 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
459 return createAlloca(loc, addrType, name, alignmentAttr);
465 mlir::ArrayAttr indices = {}) {
466 cir::PointerType type =
getPointerTo(globalOp.getSymType());
472 cir::GlobalOp globalOp,
473 mlir::ArrayAttr indices = {}) {
474 auto symbol = mlir::FlatSymbolRefAttr::get(globalOp.getSymNameAttr());
475 return cir::GlobalViewAttr::get(type, symbol, indices);
481 cir::GlobalOp globalOp,
484 for (int64_t ind : indices)
485 attrs.push_back(getI64IntegerAttr(ind));
486 mlir::ArrayAttr arAttr = mlir::ArrayAttr::get(getContext(), attrs);
491 bool threadLocal =
false) {
493 return cir::GetGlobalOp::create(*
this, loc,
495 global.getSymNameAttr(), threadLocal);
499 bool threadLocal =
false) {
505 bool isVolatile =
false,
506 bool skipTailPadding =
false) {
507 return cir::CopyOp::create(*
this, dst.getLoc(), dst, src,
509 isVolatile, skipTailPadding);
512 cir::StoreOp
createStore(mlir::Location loc, mlir::Value val, mlir::Value dst,
513 bool isVolatile =
false,
bool isNontemporal =
false,
514 mlir::IntegerAttr align = {},
515 cir::SyncScopeKindAttr scope = {},
516 cir::MemOrderAttr order = {}) {
517 if (mlir::cast<cir::PointerType>(dst.getType()).getPointee() !=
520 return cir::StoreOp::create(*
this, loc, val, dst, isVolatile, isNontemporal,
521 align, scope, order);
527 if (boolTy != mlir::cast<cir::PointerType>(addr.getType()).getPointee())
533 mlir::Value flag =
getBool(val, loc);
537 [[nodiscard]] cir::GlobalOp
539 mlir::StringRef name, mlir::Type type,
bool isConstant,
540 cir::GlobalLinkageKind linkage,
541 mlir::ptr::MemorySpaceAttrInterface addrSpace) {
542 mlir::OpBuilder::InsertionGuard guard(*
this);
543 setInsertionPointToStart(mlirModule.getBody());
544 return cir::GlobalOp::create(*
this, loc, name, type, isConstant, addrSpace,
549 mlir::Value base, llvm::StringRef name,
551 return cir::GetMemberOp::create(*
this, loc, resultTy, base, name, index);
558 return cir::LoadOp::create(*
this, loc, addr,
false,
566 mlir::Value stride) {
567 return cir::PtrStrideOp::create(*
this, loc, base.getType(), base, stride);
574 cir::CallOp
createCallOp(mlir::Location loc, mlir::SymbolRefAttr callee,
575 mlir::Type returnType, mlir::ValueRange operands,
579 auto op = cir::CallOp::create(*
this, loc, callee, returnType, operands);
582 if (!argAttrs.empty()) {
583 llvm::SmallVector<mlir::Attribute> argDictAttrs;
584 argDictAttrs.reserve(argAttrs.size());
587 argAttrs, std::back_inserter(argDictAttrs),
588 [
this](llvm::ArrayRef<mlir::NamedAttribute> singleArgAttrs) {
589 return mlir::DictionaryAttr::get(getContext(), singleArgAttrs);
592 op.setArgAttrsAttr(mlir::ArrayAttr::get(getContext(), argDictAttrs));
595 if (!resAttrs.empty()) {
596 auto resultDictAttr = mlir::DictionaryAttr::get(getContext(), resAttrs);
597 op.setResAttrsAttr(mlir::ArrayAttr::get(getContext(), resultDictAttr));
603 mlir::ValueRange operands,
607 return createCallOp(loc, mlir::SymbolRefAttr::get(callee),
608 callee.getFunctionType().getReturnType(), operands,
609 attrs, argAttrs, resAttrs);
614 cir::FuncType funcType, mlir::ValueRange operands,
618 llvm::SmallVector<mlir::Value> resOperands{indirectTarget};
619 resOperands.append(operands.begin(), operands.end());
621 return createCallOp(loc, mlir::SymbolRefAttr(), funcType.getReturnType(),
622 resOperands, attrs, argAttrs, resAttrs);
625 cir::CallOp
createCallOp(mlir::Location loc, mlir::SymbolRefAttr callee,
626 mlir::ValueRange operands = mlir::ValueRange(),
630 return createCallOp(loc, callee, cir::VoidType(), operands, attrs, argAttrs,
639 mlir::Value src, mlir::Type newTy) {
640 if (newTy == src.getType())
642 return cir::CastOp::create(*
this, loc, newTy,
kind, src);
647 if (newTy == src.getType())
654 if (newTy == src.getType())
662 return createCast(cir::CastKind::integral, src, newTy);
667 return cir::BuiltinIntCastOp::create(*
this, loc, newTy, src);
675 return createCast(cir::CastKind::int_to_ptr, src, newTy);
679 return createCast(cir::CastKind::ptr_to_int, src, newTy);
687 return createCast(cir::CastKind::bool_to_int, src, newTy);
691 return createCast(cir::CastKind::bitcast, src, newTy);
696 return createCast(loc, cir::CastKind::bitcast, src, newTy);
700 assert(mlir::isa<cir::PointerType>(src.getType()) &&
"expected ptr src");
701 cir::PointerType srcPtrTy = mlir::cast<cir::PointerType>(src.getType());
707 mlir::Value nullPtr =
getNullPtr(ptr.getType(), ptr.getLoc());
708 return createCompare(ptr.getLoc(), cir::CmpOpKind::eq, ptr, nullPtr);
712 mlir::Value nullPtr =
getNullPtr(ptr.getType(), ptr.getLoc());
713 return createCompare(ptr.getLoc(), cir::CmpOpKind::ne, ptr, nullPtr);
718 return createCast(loc, cir::CastKind::address_space, src, newTy);
733 return cir::VecExtractOp::create(*
this, loc, vec, idxVal);
737 mlir::Value newElt, uint64_t idx) {
740 return cir::VecInsertOp::create(*
this, loc, vec, newElt, idxVal);
744 auto resTy = cir::BoolType::get(getContext());
745 return cir::SignBitOp::create(*
this, loc, resTy, val);
754 llvm::APInt val = llvm::APInt::getLowBitsSet(size, bits);
755 auto type = cir::IntType::get(getContext(), size,
false);
759 mlir::Value
createAnd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
760 return cir::AndOp::create(*
this, loc, lhs, rhs);
763 mlir::Value
createOr(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
764 return cir::OrOp::create(*
this, loc, lhs, rhs);
768 mlir::Value trueValue, mlir::Value falseValue) {
769 assert(trueValue.getType() == falseValue.getType() &&
770 "trueValue and falseValue should have the same type");
771 return cir::SelectOp::create(*
this, loc, trueValue.getType(),
condition,
772 trueValue, falseValue);
785 mlir::Value
createMul(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
787 auto op = cir::MulOp::create(*
this, loc, lhs, rhs);
801 mlir::Value
createSub(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
803 auto op = cir::SubOp::create(*
this, loc, lhs, rhs);
820 mlir::Value
createAdd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
822 auto op = cir::AddOp::create(*
this, loc, lhs, rhs);
839 mlir::Value
createDiv(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
840 return cir::DivOp::create(*
this, loc, lhs, rhs);
843 mlir::Value
createRem(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
844 return cir::RemOp::create(*
this, loc, lhs, rhs);
847 mlir::Value
createFAdd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
853 mlir::Value
createFSub(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
859 mlir::Value
createFMul(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
865 mlir::Value
createFDiv(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
871 mlir::Value
createFRem(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
877 mlir::Value
createFNeg(mlir::Location loc, mlir::Value operand) {
878 assert(cir::isFPOrVectorOfFPType(operand.getType()) &&
879 "expected floating-point or vector-of-float type");
884 return cir::FNegOp::create(*
this, loc, operand);
887 mlir::Value
createXor(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
888 return cir::XorOp::create(*
this, loc, lhs, rhs);
891 mlir::Value
createMax(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
892 return cir::MaxOp::create(*
this, loc, lhs, rhs);
896 mlir::Value lhs, mlir::Value rhs) {
898 if (cir::isAnyFloatingPointType(lhs.getType()))
900 return cir::CmpOp::create(*
this, loc,
kind, lhs, rhs, fenv);
904 mlir::Value lhs, mlir::Value rhs) {
905 VectorType vecCast = mlir::cast<VectorType>(lhs.getType());
908 VectorType integralVecTy =
909 cir::VectorType::get(integralTy, vecCast.getSize());
911 if (cir::isFPOrVectorOfFPType(lhs.getType()))
913 return cir::VecCmpOp::create(*
this, loc, integralVecTy,
kind, lhs, rhs,
917 mlir::Value
createIsNaN(mlir::Location loc, mlir::Value operand) {
918 return createCompare(loc, cir::CmpOpKind::ne, operand, operand);
921 mlir::Value
createShift(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
923 return cir::ShiftOp::create(*
this, loc, lhs.getType(), lhs, rhs,
928 const llvm::APInt &rhs,
bool isShiftLeft) {
933 mlir::Value
createShift(mlir::Location loc, mlir::Value lhs,
unsigned bits,
935 auto width = mlir::dyn_cast<cir::IntType>(lhs.getType()).getWidth();
936 auto shift = llvm::APInt(width, bits);
962 return cir::FuncType::get(llvm::to_vector(argTypes),
getVoidTy());
976 std::find_if(block->rbegin(), block->rend(), [](mlir::Operation &op) {
977 return mlir::isa<cir::AllocaOp, cir::LabelOp>(&op);
980 if (last != block->rend())
981 return OpBuilder::InsertPoint(block, ++mlir::Block::iterator(&*last));
982 return OpBuilder::InsertPoint(block, block->begin());
1003 return alignment ? getI64IntegerAttr(alignment) : mlir::IntegerAttr();
1029 cir::YieldOp
createYield(mlir::Location loc, mlir::ValueRange value = {}) {
1030 return cir::YieldOp::create(*
this, loc, value);
1039 mlir::Value objectPtr) {
1042 mlir::cast<cir::MethodType>(method.getType()).getMemberFuncTy();
1043 auto methodFuncInputTypes = methodFuncTy.getInputs();
1045 auto objectPtrTy = mlir::cast<cir::PointerType>(objectPtr.getType());
1046 mlir::Type adjustedThisTy =
getVoidPtrTy(objectPtrTy.getAddrSpace());
1051 if (methodFuncInputTypes.size() > 1)
1052 calleeFuncInputTypes.insert(calleeFuncInputTypes.end(),
1053 methodFuncInputTypes.begin() + 1,
1054 methodFuncInputTypes.end());
1055 cir::FuncType calleeFuncTy =
1056 methodFuncTy.clone(calleeFuncInputTypes, methodFuncTy.getReturnType());
1059 cir::PointerType calleeTy =
getPointerTo(calleeFuncTy);
1061 auto op = cir::GetMethodOp::create(*
this, loc, calleeTy, adjustedThisTy,
1063 return {op.getCallee(), op.getAdjustedThis()};
Provides definitions for the various language-specific address spaces.
Defines the clang::LangOptions interface.
*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::FenvAttr getConstrainedFPAttr()
Build the #cir.fenv attribute describing the constrained floating-point environment currently in effe...
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.
clang::LangOptions::FPExceptionModeKind getDefaultConstrainedExcept() const
Get the exception handling used with constrained floating point.
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::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, llvm::function_ref< void(mlir::OpBuilder &, mlir::Location)> cleanupBuilder, cir::CleanupKind cleanupKind)
Create a for operation with a per-iteration cleanup region.
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)
cir::WhileOp createWhile(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)> cleanupBuilder, cir::CleanupKind cleanupKind)
Create a while operation with a per-iteration cleanup region.
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)
llvm::RoundingMode defaultConstrainedRounding
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)
clang::LangOptions::FPExceptionModeKind defaultConstrainedExcept
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)
void setIsFPConstrained(bool isCon)
Enable/Disable use of constrained floating point math.
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.
llvm::RoundingMode getDefaultConstrainedRounding() const
Get the rounding mode handling used with constrained floating point.
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)
void setDefaultConstrainedExcept(clang::LangOptions::FPExceptionModeKind newExcept)
Set the exception handling to be used with constrained floating point.
mlir::Value createAlignedLoad(mlir::Location loc, mlir::Value ptr, uint64_t alignment)
bool getIsFPConstrained() const
Query for the use of constrained floating point math.
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()
void setDefaultConstrainedRounding(llvm::RoundingMode newRounding)
Set the rounding mode handling to be used with constrained floating point.
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.
FPExceptionModeKind
Possible floating point exception behavior.
@ FPE_Strict
Strictly preserve the floating-point exception semantics.
@ FPE_MayTrap
Transformations do not cause new exceptions but may hide some.
@ FPE_Ignore
Assume that floating-point exceptions are masked.
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 fastMathFlags()