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 (mlir::isa<cir::IntType>(ty))
120 return cir::IntAttr::get(ty, 0);
121 if (cir::isAnyFloatingPointType(ty))
122 return cir::FPAttr::getZero(ty);
123 if (
auto complexType = mlir::dyn_cast<cir::ComplexType>(ty))
124 return cir::ZeroAttr::get(complexType);
125 if (
auto arrTy = mlir::dyn_cast<cir::ArrayType>(ty))
126 return cir::ZeroAttr::get(arrTy);
127 if (
auto vecTy = mlir::dyn_cast<cir::VectorType>(ty))
128 return cir::ZeroAttr::get(vecTy);
129 if (
auto ptrTy = mlir::dyn_cast<cir::PointerType>(ty))
131 if (
auto recordTy = mlir::dyn_cast<cir::RecordType>(ty))
132 return cir::ZeroAttr::get(recordTy);
133 if (
auto dataMemberTy = mlir::dyn_cast<cir::DataMemberType>(ty))
135 if (
auto methodTy = mlir::dyn_cast<cir::MethodType>(ty))
137 if (
auto vptrTy = mlir::dyn_cast<cir::VPtrType>(ty))
138 return cir::ZeroAttr::get(vptrTy);
139 if (mlir::isa<cir::BoolType>(ty)) {
143 llvm_unreachable(
"Zero initializer for given type is NYI");
146 cir::ConstantOp
getBool(
bool state, mlir::Location loc) {
147 return cir::ConstantOp::create(*
this, loc,
getCIRBoolAttr(state));
152 cir::BoolType
getBoolTy() {
return cir::BoolType::get(getContext()); }
153 cir::VoidType
getVoidTy() {
return cir::VoidType::get(getContext()); }
156 return cir::IntType::get(getContext(), n,
false);
160 if (
auto intType = mlir::dyn_cast<cir::IntTypeInterface>(eltTy))
161 return intType.getWidth();
162 if (
auto floatType = mlir::dyn_cast<cir::FPTypeInterface>(eltTy))
163 return floatType.getWidth();
165 llvm_unreachable(
"Unsupported type in getCIRIntOrFloatBitWidth");
168 return cir::IntType::get(getContext(), n,
true);
172 return cir::PointerType::get(ty);
176 mlir::ptr::MemorySpaceAttrInterface as) {
177 return cir::PointerType::get(ty, as);
184 mlir::ptr::MemorySpaceAttrInterface addrSpaceAttr =
190 return getPointerTo(cir::VoidType::get(getContext()), langAS);
193 cir::PointerType
getVoidPtrTy(mlir::ptr::MemorySpaceAttrInterface as) {
194 return getPointerTo(cir::VoidType::get(getContext()), as);
197 cir::MethodAttr
getMethodAttr(cir::MethodType ty, cir::FuncOp methodFuncOp) {
198 auto methodFuncSymbolRef = mlir::FlatSymbolRefAttr::get(methodFuncOp);
199 return cir::MethodAttr::get(ty, methodFuncSymbolRef);
203 return cir::MethodAttr::get(ty);
207 return cir::BoolAttr::get(getContext(), state);
256 cir::FPDynamicRoundingMode roundingMode;
258 case llvm::RoundingMode::NearestTiesToEven:
259 roundingMode = cir::FPDynamicRoundingMode::ToNearest;
261 case llvm::RoundingMode::TowardNegative:
262 roundingMode = cir::FPDynamicRoundingMode::Downward;
264 case llvm::RoundingMode::TowardPositive:
265 roundingMode = cir::FPDynamicRoundingMode::Upward;
267 case llvm::RoundingMode::TowardZero:
268 roundingMode = cir::FPDynamicRoundingMode::UpwardZero;
270 case llvm::RoundingMode::NearestTiesToAway:
271 roundingMode = cir::FPDynamicRoundingMode::ToNearestAway;
273 case llvm::RoundingMode::Dynamic:
274 roundingMode = cir::FPDynamicRoundingMode::Unknown;
277 llvm_unreachable(
"unexpected constrained rounding mode");
280 cir::FPExceptionMode exceptMode;
284 exceptMode = cir::FPExceptionMode::Masked;
285 strictExcept =
false;
288 exceptMode = cir::FPExceptionMode::Unknown;
289 strictExcept =
false;
292 exceptMode = cir::FPExceptionMode::Unknown;
296 llvm_unreachable(
"unexpected constrained exception mode");
299 return cir::FenvAttr::get(getContext(), roundingMode, exceptMode,
300 mlir::BoolAttr::get(getContext(), strictExcept));
305 auto resultComplexTy = cir::ComplexType::get(real.getType());
306 return cir::ComplexCreateOp::create(*
this, loc, resultComplexTy, real,
311 auto resultType = operand.getType();
312 if (
auto complexResultType = mlir::dyn_cast<cir::ComplexType>(resultType))
313 resultType = complexResultType.getElementType();
314 return cir::ComplexRealOp::create(*
this, loc, resultType, operand);
318 auto resultType = operand.getType();
319 if (
auto complexResultType = mlir::dyn_cast<cir::ComplexType>(resultType))
320 resultType = complexResultType.getElementType();
321 return cir::ComplexImagOp::create(*
this, loc, resultType, operand);
325 return cir::ComplexConjOp::create(*
this, loc, operand.getType(), operand);
329 bool isVolatile =
false, uint64_t alignment = 0,
330 bool isNontemporal =
false) {
332 return cir::LoadOp::create(*
this, loc, ptr,
false, isVolatile,
333 isNontemporal, alignmentAttr,
334 cir::SyncScopeKindAttr{}, cir::MemOrderAttr{},
339 uint64_t alignment) {
340 return createLoad(loc, ptr,
false, alignment);
343 mlir::Value
createNot(mlir::Location loc, mlir::Value value) {
344 return cir::NotOp::create(*
this, loc, value);
354 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> condBuilder,
355 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> bodyBuilder) {
356 return cir::DoWhileOp::create(*
this, loc, condBuilder, bodyBuilder);
362 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> condBuilder,
363 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> bodyBuilder) {
364 return cir::WhileOp::create(*
this, loc, condBuilder, bodyBuilder);
370 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> condBuilder,
371 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> bodyBuilder,
372 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)>
374 cir::CleanupKind cleanupKind) {
375 return cir::WhileOp::create(*
this, loc, condBuilder, bodyBuilder,
376 cleanupBuilder, cleanupKind);
382 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> condBuilder,
383 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> bodyBuilder,
384 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> stepBuilder) {
385 return cir::ForOp::create(*
this, loc, condBuilder, bodyBuilder,
392 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> condBuilder,
393 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> bodyBuilder,
394 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)> stepBuilder,
395 llvm::function_ref<
void(mlir::OpBuilder &, mlir::Location)>
397 cir::CleanupKind cleanupKind) {
398 return cir::ForOp::create(*
this, loc, condBuilder, bodyBuilder, stepBuilder,
399 cleanupBuilder, cleanupKind);
404 return cir::BreakOp::create(*
this, loc);
409 return cir::ContinueOp::create(*
this, loc);
412 mlir::Value
createInc(mlir::Location loc, mlir::Value input,
414 return cir::IncOp::create(*
this, loc, input, nsw);
417 mlir::Value
createDec(mlir::Location loc, mlir::Value input,
419 return cir::DecOp::create(*
this, loc, input, nsw);
424 return cir::MinusOp::create(*
this, loc, input, nsw);
428 return cir::ConstPtrAttr::get(type, getI64IntegerAttr(value));
431 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
432 llvm::StringRef name, mlir::IntegerAttr alignment,
433 mlir::Value dynAllocSize) {
434 return cir::AllocaOp::create(*
this, loc, addrType, name, alignment,
438 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
439 mlir::Type type, llvm::StringRef name,
441 mlir::Value dynAllocSize) {
443 return createAlloca(loc, addrType, name, alignmentAttr, dynAllocSize);
446 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
447 llvm::StringRef name, mlir::IntegerAttr alignment) {
448 return cir::AllocaOp::create(*
this, loc, addrType, name, alignment);
451 mlir::Value
createAlloca(mlir::Location loc, cir::PointerType addrType,
454 return createAlloca(loc, addrType, name, alignmentAttr);
460 mlir::ArrayAttr indices = {}) {
461 cir::PointerType type =
getPointerTo(globalOp.getSymType());
467 cir::GlobalOp globalOp,
468 mlir::ArrayAttr indices = {}) {
469 auto symbol = mlir::FlatSymbolRefAttr::get(globalOp.getSymNameAttr());
470 return cir::GlobalViewAttr::get(type, symbol, indices);
476 cir::GlobalOp globalOp,
479 for (int64_t ind : indices)
480 attrs.push_back(getI64IntegerAttr(ind));
481 mlir::ArrayAttr arAttr = mlir::ArrayAttr::get(getContext(), attrs);
486 bool threadLocal =
false) {
488 return cir::GetGlobalOp::create(*
this, loc,
490 global.getSymNameAttr(), threadLocal);
494 bool threadLocal =
false) {
500 bool isVolatile =
false,
501 bool skipTailPadding =
false) {
502 return cir::CopyOp::create(*
this, dst.getLoc(), dst, src,
504 isVolatile, skipTailPadding);
507 cir::StoreOp
createStore(mlir::Location loc, mlir::Value val, mlir::Value dst,
508 bool isVolatile =
false,
bool isNontemporal =
false,
509 mlir::IntegerAttr align = {},
510 cir::SyncScopeKindAttr scope = {},
511 cir::MemOrderAttr order = {}) {
512 if (mlir::cast<cir::PointerType>(dst.getType()).getPointee() !=
515 return cir::StoreOp::create(*
this, loc, val, dst, isVolatile, isNontemporal,
516 align, scope, order);
522 if (boolTy != mlir::cast<cir::PointerType>(addr.getType()).getPointee())
528 mlir::Value flag =
getBool(val, loc);
532 [[nodiscard]] cir::GlobalOp
534 mlir::StringRef name, mlir::Type type,
bool isConstant,
535 cir::GlobalLinkageKind linkage,
536 mlir::ptr::MemorySpaceAttrInterface addrSpace) {
537 mlir::OpBuilder::InsertionGuard guard(*
this);
538 setInsertionPointToStart(mlirModule.getBody());
539 return cir::GlobalOp::create(*
this, loc, name, type, isConstant, addrSpace,
544 mlir::Value base, llvm::StringRef name,
546 return cir::GetMemberOp::create(*
this, loc, resultTy, base, name, index);
553 return cir::LoadOp::create(*
this, loc, addr,
false,
561 mlir::Value stride) {
562 return cir::PtrStrideOp::create(*
this, loc, base.getType(), base, stride);
569 cir::CallOp
createCallOp(mlir::Location loc, mlir::SymbolRefAttr callee,
570 mlir::Type returnType, mlir::ValueRange operands,
574 auto op = cir::CallOp::create(*
this, loc, callee, returnType, operands);
577 if (!argAttrs.empty()) {
578 llvm::SmallVector<mlir::Attribute> argDictAttrs;
579 argDictAttrs.reserve(argAttrs.size());
582 argAttrs, std::back_inserter(argDictAttrs),
583 [
this](llvm::ArrayRef<mlir::NamedAttribute> singleArgAttrs) {
584 return mlir::DictionaryAttr::get(getContext(), singleArgAttrs);
587 op.setArgAttrsAttr(mlir::ArrayAttr::get(getContext(), argDictAttrs));
590 if (!resAttrs.empty()) {
591 auto resultDictAttr = mlir::DictionaryAttr::get(getContext(), resAttrs);
592 op.setResAttrsAttr(mlir::ArrayAttr::get(getContext(), resultDictAttr));
598 mlir::ValueRange operands,
602 return createCallOp(loc, mlir::SymbolRefAttr::get(callee),
603 callee.getFunctionType().getReturnType(), operands,
604 attrs, argAttrs, resAttrs);
609 cir::FuncType funcType, mlir::ValueRange operands,
613 llvm::SmallVector<mlir::Value> resOperands{indirectTarget};
614 resOperands.append(operands.begin(), operands.end());
616 return createCallOp(loc, mlir::SymbolRefAttr(), funcType.getReturnType(),
617 resOperands, attrs, argAttrs, resAttrs);
620 cir::CallOp
createCallOp(mlir::Location loc, mlir::SymbolRefAttr callee,
621 mlir::ValueRange operands = mlir::ValueRange(),
625 return createCallOp(loc, callee, cir::VoidType(), operands, attrs, argAttrs,
634 mlir::Value src, mlir::Type newTy) {
635 if (newTy == src.getType())
637 return cir::CastOp::create(*
this, loc, newTy,
kind, src);
642 if (newTy == src.getType())
649 if (newTy == src.getType())
657 return createCast(cir::CastKind::integral, src, newTy);
662 return cir::BuiltinIntCastOp::create(*
this, loc, newTy, src);
670 return createCast(cir::CastKind::int_to_ptr, src, newTy);
674 return createCast(cir::CastKind::ptr_to_int, src, newTy);
682 return createCast(cir::CastKind::bool_to_int, src, newTy);
686 return createCast(cir::CastKind::bitcast, src, newTy);
691 return createCast(loc, cir::CastKind::bitcast, src, newTy);
695 assert(mlir::isa<cir::PointerType>(src.getType()) &&
"expected ptr src");
696 cir::PointerType srcPtrTy = mlir::cast<cir::PointerType>(src.getType());
702 mlir::Value nullPtr =
getNullPtr(ptr.getType(), ptr.getLoc());
703 return createCompare(ptr.getLoc(), cir::CmpOpKind::eq, ptr, nullPtr);
707 mlir::Value nullPtr =
getNullPtr(ptr.getType(), ptr.getLoc());
708 return createCompare(ptr.getLoc(), cir::CmpOpKind::ne, ptr, nullPtr);
713 return createCast(loc, cir::CastKind::address_space, src, newTy);
728 return cir::VecExtractOp::create(*
this, loc, vec, idxVal);
732 mlir::Value newElt, uint64_t idx) {
735 return cir::VecInsertOp::create(*
this, loc, vec, newElt, idxVal);
739 auto resTy = cir::BoolType::get(getContext());
740 return cir::SignBitOp::create(*
this, loc, resTy, val);
749 llvm::APInt val = llvm::APInt::getLowBitsSet(size, bits);
750 auto type = cir::IntType::get(getContext(), size,
false);
754 mlir::Value
createAnd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
755 return cir::AndOp::create(*
this, loc, lhs, rhs);
758 mlir::Value
createOr(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
759 return cir::OrOp::create(*
this, loc, lhs, rhs);
763 mlir::Value trueValue, mlir::Value falseValue) {
764 assert(trueValue.getType() == falseValue.getType() &&
765 "trueValue and falseValue should have the same type");
766 return cir::SelectOp::create(*
this, loc, trueValue.getType(),
condition,
767 trueValue, falseValue);
780 mlir::Value
createMul(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
782 auto op = cir::MulOp::create(*
this, loc, lhs, rhs);
796 mlir::Value
createSub(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
798 auto op = cir::SubOp::create(*
this, loc, lhs, rhs);
815 mlir::Value
createAdd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
817 auto op = cir::AddOp::create(*
this, loc, lhs, rhs);
834 mlir::Value
createDiv(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
835 return cir::DivOp::create(*
this, loc, lhs, rhs);
838 mlir::Value
createRem(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
839 return cir::RemOp::create(*
this, loc, lhs, rhs);
842 mlir::Value
createFAdd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
848 mlir::Value
createFSub(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
854 mlir::Value
createFMul(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
860 mlir::Value
createFDiv(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
866 mlir::Value
createFRem(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
872 mlir::Value
createFNeg(mlir::Location loc, mlir::Value operand) {
873 assert(cir::isFPOrVectorOfFPType(operand.getType()) &&
874 "expected floating-point or vector-of-float type");
879 return cir::FNegOp::create(*
this, loc, operand);
882 mlir::Value
createXor(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
883 return cir::XorOp::create(*
this, loc, lhs, rhs);
886 mlir::Value
createMax(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) {
887 return cir::MaxOp::create(*
this, loc, lhs, rhs);
891 mlir::Value lhs, mlir::Value rhs) {
893 if (cir::isAnyFloatingPointType(lhs.getType()))
895 return cir::CmpOp::create(*
this, loc,
kind, lhs, rhs, fenv);
899 mlir::Value lhs, mlir::Value rhs) {
900 VectorType vecCast = mlir::cast<VectorType>(lhs.getType());
903 VectorType integralVecTy =
904 cir::VectorType::get(integralTy, vecCast.getSize());
906 if (cir::isFPOrVectorOfFPType(lhs.getType()))
908 return cir::VecCmpOp::create(*
this, loc, integralVecTy,
kind, lhs, rhs,
912 mlir::Value
createIsNaN(mlir::Location loc, mlir::Value operand) {
913 return createCompare(loc, cir::CmpOpKind::ne, operand, operand);
916 mlir::Value
createShift(mlir::Location loc, mlir::Value lhs, mlir::Value rhs,
918 return cir::ShiftOp::create(*
this, loc, lhs.getType(), lhs, rhs,
923 const llvm::APInt &rhs,
bool isShiftLeft) {
928 mlir::Value
createShift(mlir::Location loc, mlir::Value lhs,
unsigned bits,
930 auto width = mlir::dyn_cast<cir::IntType>(lhs.getType()).getWidth();
931 auto shift = llvm::APInt(width, bits);
957 return cir::FuncType::get(llvm::to_vector(argTypes),
getVoidTy());
971 std::find_if(block->rbegin(), block->rend(), [](mlir::Operation &op) {
972 return mlir::isa<cir::AllocaOp, cir::LabelOp>(&op);
975 if (last != block->rend())
976 return OpBuilder::InsertPoint(block, ++mlir::Block::iterator(&*last));
977 return OpBuilder::InsertPoint(block, block->begin());
998 return alignment ? getI64IntegerAttr(alignment) : mlir::IntegerAttr();
1024 cir::YieldOp
createYield(mlir::Location loc, mlir::ValueRange value = {}) {
1025 return cir::YieldOp::create(*
this, loc, value);
1034 mlir::Value objectPtr) {
1037 mlir::cast<cir::MethodType>(method.getType()).getMemberFuncTy();
1038 auto methodFuncInputTypes = methodFuncTy.getInputs();
1040 auto objectPtrTy = mlir::cast<cir::PointerType>(objectPtr.getType());
1041 mlir::Type adjustedThisTy =
getVoidPtrTy(objectPtrTy.getAddrSpace());
1046 if (methodFuncInputTypes.size() > 1)
1047 calleeFuncInputTypes.insert(calleeFuncInputTypes.end(),
1048 methodFuncInputTypes.begin() + 1,
1049 methodFuncInputTypes.end());
1050 cir::FuncType calleeFuncTy =
1051 methodFuncTy.clone(calleeFuncInputTypes, methodFuncTy.getReturnType());
1054 cir::PointerType calleeTy =
getPointerTo(calleeFuncTy);
1056 auto op = cir::GetMethodOp::create(*
this, loc, calleeTy, adjustedThisTy,
1058 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()