Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion compiler/codegen/cg-CForLoop.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ static llvm::MDNode* generateLoopMetadata(LoopStmt* loop,

std::vector<llvm::Metadata*> args;
// Resolve operand 0 for the loop id self reference
auto tmpNode = llvm::MDNode::getTemporary(ctx, chpl::empty);
auto tmpNode = llvm::MDNode::getTemporary(ctx, {});
args.push_back(tmpNode.get());

if(fNoVectorize == false && loop->isVectorizable()) {
Expand Down
62 changes: 36 additions & 26 deletions compiler/codegen/cg-expr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -530,11 +530,11 @@ GenRet codegenWideAddr(GenRet locale, GenRet raddr, Type* wideType = NULL)
llvm::Type* locAddrType = nullptr;

if (isOpaquePointer(addrType)) {
locAddrType = llvm::PointerType::getUnqual(gContext->llvmContext());
locAddrType = getPointerType(gContext->llvmContext());
} else {
#ifdef HAVE_LLVM_TYPED_POINTERS
locAddrType =
llvm::PointerType::getUnqual(addrType->getPointerElementType());
getPointerType(addrType->getPointerElementType());
#endif
}
INT_ASSERT(locAddrType);
Expand Down Expand Up @@ -1304,7 +1304,7 @@ GenRet doCodegenFieldPtr(
baseTy, baseValue, cBaseType->getMemberGEP("_u", unused));
trackLLVMValue(ret.val);
auto addrSpace = baseValue->getType()->getPointerAddressSpace();
llvm::PointerType* ty = llvm::PointerType::get(retType.type, addrSpace);
auto ty = getPointerType(retType.type, addrSpace);
// Now cast it to the right type.
ret.val = convertValueToType(ret.val, ty, false);
INT_ASSERT(ret.val);
Expand Down Expand Up @@ -1342,8 +1342,7 @@ GenRet doCodegenFieldPtr(
(ret.chplType == dtCFnPtr)) {
// cast the returned pointer to the right type
auto addrSpace = baseValue->getType()->getPointerAddressSpace();
llvm::PointerType* ty =
llvm::PointerType::get(retType.type, addrSpace);
auto ty = getPointerType(retType.type, addrSpace);
ret.val = convertValueToType(ret.val, ty, false);
}

Expand Down Expand Up @@ -2201,6 +2200,20 @@ GenRet codegenMod(GenRet a, GenRet b)
return ret;
}

#ifdef HAVE_LLVM
static llvm::CallInst* CreateIntrinsic(llvm::Intrinsic::ID id,
llvm::ArrayRef<llvm::Type*> tys,
llvm::ArrayRef<llvm::Value*> args) {
#if LLVM_VERSION_MAJOR >= 21
auto call = gGenInfo->irBuilder->CreateIntrinsic(id, tys, args, {});
#else
auto call = gGenInfo->irBuilder->CreateIntrinsic(id, tys, args);
#endif
trackLLVMValue(call);
return call;
}
#endif

// TODO: We could call the C 'fma' function from 'math.h' here.
static GenRet emitFmaForC(GenRet av, GenRet bv, GenRet cv) {
INT_FATAL("Should not reach here, user facing functions should call the "
Expand All @@ -2212,7 +2225,6 @@ static GenRet emitFmaForC(GenRet av, GenRet bv, GenRet cv) {
static GenRet emitFmaForLlvm(GenRet av, GenRet bv, GenRet cv) {
GenRet ret;
#ifdef HAVE_LLVM
GenInfo* info = gGenInfo;
INT_ASSERT(av.chplType == bv.chplType && bv.chplType == cv.chplType);
INT_ASSERT(av.chplType == dtReal[FLOAT_SIZE_64] ||
av.chplType == dtReal[FLOAT_SIZE_32]);
Expand All @@ -2229,7 +2241,7 @@ static GenRet emitFmaForLlvm(GenRet av, GenRet bv, GenRet cv) {
auto id = llvm::Intrinsic::fma;
std::vector<llvm::Type*> tys = { ty };
std::vector<llvm::Value*> args = { av.val, bv.val, cv.val };
ret.val = info->irBuilder->CreateIntrinsic(id, tys, args);
ret.val = CreateIntrinsic(id, tys, args);
trackLLVMValue(ret.val);
#endif

Expand Down Expand Up @@ -2276,7 +2288,6 @@ static GenRet emitSqrtCMath(GenRet av) {
static GenRet emitSqrtLLVMIntrinsic(GenRet av) {
GenRet ret;
#ifdef HAVE_LLVM
GenInfo* info = gGenInfo;
INT_ASSERT(av.chplType == dtReal[FLOAT_SIZE_64] ||
av.chplType == dtReal[FLOAT_SIZE_32]);
auto ty = av.val->getType();
Expand All @@ -2288,7 +2299,7 @@ static GenRet emitSqrtLLVMIntrinsic(GenRet av) {
auto id = llvm::Intrinsic::sqrt;
std::vector<llvm::Type*> tys = { ty };
std::vector<llvm::Value*> args = { av.val };
ret.val = info->irBuilder->CreateIntrinsic(id, tys, args);
ret.val = CreateIntrinsic(id, tys, args);
trackLLVMValue(ret.val);
#endif

Expand Down Expand Up @@ -2323,7 +2334,6 @@ static GenRet emitAbsCMath(GenRet av) {
static GenRet emitAbsLLVMIntrinsic(GenRet av) {
GenRet ret;
#ifdef HAVE_LLVM
GenInfo* info = gGenInfo;
INT_ASSERT(av.chplType == dtReal[FLOAT_SIZE_64] ||
av.chplType == dtReal[FLOAT_SIZE_32]);
auto ty = av.val->getType();
Expand All @@ -2335,7 +2345,7 @@ static GenRet emitAbsLLVMIntrinsic(GenRet av) {
auto id = llvm::Intrinsic::fabs;
std::vector<llvm::Type*> tys = { ty };
std::vector<llvm::Value*> args = { av.val };
ret.val = info->irBuilder->CreateIntrinsic(id, tys, args);
ret.val = CreateIntrinsic(id, tys, args);
trackLLVMValue(ret.val);
#endif

Expand Down Expand Up @@ -2993,8 +3003,8 @@ static GenRet codegenCallExprInner(GenRet function,
tmp = createTempVarWith(args[i]);

llvm::Value* ptr = tmp.val;
llvm::Type* sTyPtrTy = llvm::PointerType::get(sTy, stackSpace);
llvm::Type* i8PtrTy = getPointerType(irBuilder);
auto sTyPtrTy = getPointerType(sTy, stackSpace);
auto i8PtrTy = getPointerType(irBuilder);

// handle offset
if (unsigned offset = argInfo->getDirectOffset()) {
Expand Down Expand Up @@ -3040,7 +3050,7 @@ static GenRet codegenCallExprInner(GenRet function,
// Create a temp variable to load from
tmp = createTempVarWith(args[i]);

llvm::Type* sTyPtrTy = llvm::PointerType::get(sTy, stackSpace);
auto sTyPtrTy = getPointerType(sTy, stackSpace);
llvm::Value* ptr = irBuilder->CreatePointerCast(tmp.val, sTyPtrTy);
trackLLVMValue(ptr);

Expand Down Expand Up @@ -3105,7 +3115,7 @@ static GenRet codegenCallExprInner(GenRet function,
// If we are using typed pointers, the pointer type must match the
// call type or else instruction verification will fail. If using
// opaque pointers, it is fine if the call pointer type is 'void*'.
auto fnPtrType = llvm::PointerType::getUnqual(fnType);
auto fnPtrType = getPointerType(fnType);
val = info->irBuilder->CreateBitCast(val, fnPtrType);
#endif

Expand Down Expand Up @@ -3466,7 +3476,7 @@ GenRet codegenNullPointer()
ret.c = "NULL";
} else {
#ifdef HAVE_LLVM
llvm::Type* ptrType = getPointerType(info->irBuilder);
auto ptrType = getPointerType(info->irBuilder);
ret.val = llvm::Constant::getNullValue(ptrType);
#endif
}
Expand Down Expand Up @@ -3503,8 +3513,8 @@ void codegenCallMemcpy(GenRet dest, GenRet src, GenRet size,
llvm::Type *types[3];
unsigned addrSpaceDest = llvm::cast<llvm::PointerType>(dest.val->getType())->getAddressSpace();
unsigned addrSpaceSrc = llvm::cast<llvm::PointerType>(src.val->getType())->getAddressSpace();
types[0] = llvm::PointerType::get(int8Ty, addrSpaceDest);
types[1] = llvm::PointerType::get(int8Ty, addrSpaceSrc);
types[0] = getPointerType(int8Ty, addrSpaceDest);
types[1] = getPointerType(int8Ty, addrSpaceSrc);
types[2] = llvm::Type::getInt64Ty(gContext->llvmContext());
//types[3] = llvm::Type::getInt32Ty(info->llvmContext);
//types[4] = llvm::Type::getInt1Ty(info->llvmContext);
Expand Down Expand Up @@ -3796,7 +3806,7 @@ GenRet codegenCastToVoidStar(GenRet value)
ret.c += "))";
} else {
#ifdef HAVE_LLVM
llvm::Type* castType = getPointerType(info->irBuilder);
auto castType = getPointerType(info->irBuilder);
ret.val = convertValueToType(value.val, castType, !value.isUnsigned);
INT_ASSERT(ret.val);
#endif
Expand Down Expand Up @@ -5586,7 +5596,7 @@ DEFINE_PRIM(GPU_ALLOC_SHARED) {
trackLLVMValue(sharedArray);

// Get a void* pointer to the shared array.
llvm::Type* voidPtrType = getPointerType(gContext->llvmContext(), 3);
auto voidPtrType = getPointerType(gContext->llvmContext(), 3);
llvm::Value* sharedArrayPtr = gGenInfo->irBuilder->CreateBitCast(sharedArray, voidPtrType, "sharedArrayPtr");
trackLLVMValue(sharedArrayPtr);

Expand Down Expand Up @@ -6294,14 +6304,14 @@ DEFINE_PRIM(FTABLE_CALL) {
argt = call->get(2)->typeInfo()->codegen().type;

if (argMustUseCPtr(call->get(2)->typeInfo()))
argt = llvm::PointerType::getUnqual(argt);
argt = getPointerType(argt);

argumentTypes.push_back(argt);

argt = call->get(3)->typeInfo()->codegen().type;

if (argMustUseCPtr(call->get(3)->typeInfo()))
argt = llvm::PointerType::getUnqual(argt);
argt = getPointerType(argt);

argumentTypes.push_back(argt);

Expand All @@ -6311,7 +6321,7 @@ DEFINE_PRIM(FTABLE_CALL) {

// OK, now cast to the fnTy.
fngen.val = gGenInfo->irBuilder->CreateBitCast(fnPtr,
llvm::PointerType::getUnqual(fnTy));
getPointerType(fnTy));
trackLLVMValue(fngen.val);
#endif
}
Expand Down Expand Up @@ -6413,7 +6423,7 @@ llvm::MDNode* createMetadataScope(llvm::LLVMContext& ctx,
const char* name) {

auto scopeName = llvm::MDString::get(ctx, name);
auto dummy = llvm::MDNode::getTemporary(ctx, chpl::empty);
auto dummy = llvm::MDNode::getTemporary(ctx, {});
llvm::Metadata* Args[] = {dummy.get(), domain, scopeName};
auto scope = llvm::MDNode::get(ctx, Args);
// Remove the dummy and replace it with a self-reference.
Expand All @@ -6437,7 +6447,7 @@ DEFINE_PRIM(NO_ALIAS_SET) {

if (info->noAliasDomain == NULL) {
auto domainName = llvm::MDString::get(ctx, "Chapel no-alias");
auto dummy = llvm::MDNode::getTemporary(ctx, chpl::empty);
auto dummy = llvm::MDNode::getTemporary(ctx, {});
llvm::Metadata* Args[] = {dummy.get(), domainName};
info->noAliasDomain = llvm::MDNode::get(ctx, Args);
// Remove the dummy and replace it with a self-reference.
Expand Down Expand Up @@ -6509,7 +6519,7 @@ DEFINE_PRIM(DEBUG_TRAP) {
}
else {
#ifdef HAVE_LLVM
ret.val = info->irBuilder->CreateIntrinsic(llvm::Intrinsic::debugtrap, {}, {});
ret.val = CreateIntrinsic(llvm::Intrinsic::debugtrap, {}, {});
trackLLVMValue(ret.val);
#endif
}
Expand Down
30 changes: 21 additions & 9 deletions compiler/codegen/cg-symbol.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,11 @@
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Verifier.h"
#if LLVM_VERSION_MAJOR >= 21
#include "llvm/IR/Intrinsics.h"
#else
#include "llvm/Target/TargetIntrinsicInfo.h"
#endif
#include "clang/CodeGen/CGFunctionInfo.h"
#endif

Expand Down Expand Up @@ -1913,7 +1917,7 @@ llvm::Type* TypeSymbol::getLLVMType() {
if (auto* stype = llvm::dyn_cast_or_null<llvm::StructType>(llvmImplType)) {
if (auto* aggType = toAggregateType(this->type)) {
if (aggType->isClass()) {
return llvm::PointerType::getUnqual(stype);
return getPointerType(stype);
}
}
}
Expand Down Expand Up @@ -2053,7 +2057,7 @@ llvmAttachReturnInfo(llvm::LLVMContext& ctx,

case clang::CodeGen::ABIArgInfo::Kind::InAlloca: {
if (returnInfo.getInAllocaSRet()) {
returnTy = llvm::PointerType::get(returnTy, stackSpace);
returnTy = getPointerType(returnTy, stackSpace);
} else {
returnTy = llvm::Type::getVoidTy(ctx);
}
Expand All @@ -2079,7 +2083,7 @@ llvmAttachReturnInfo(llvm::LLVMContext& ctx,
}

// returnTy is void, so use chapelReturnTy
argTys.push_back(llvm::PointerType::get(chapelReturnTy, stackSpace));
argTys.push_back(getPointerType(chapelReturnTy, stackSpace));
argNames.push_back("indirect_return");

// Adjust attributes for sret argument
Expand Down Expand Up @@ -2198,7 +2202,7 @@ codegenFunctionTypeLLVMImpl(
// Add type for inalloca argument
if (CGI->usesInAlloca()) {
auto argStruct = CGI->getArgStruct();
argTys.push_back(llvm::PointerType::getUnqual(argStruct));
argTys.push_back(getPointerType(argStruct));
outArgNames.push_back("inalloca_arg");

// Adjust attributes for inalloca argument
Expand Down Expand Up @@ -2257,7 +2261,7 @@ codegenFunctionTypeLLVMImpl(

case clang::CodeGen::ABIArgInfo::Kind::Indirect: {
// Emit indirect argument
argTys.push_back(llvm::PointerType::get(argTy, stackSpace));
argTys.push_back(getPointerType(argTy, stackSpace));
outArgNames.push_back(astr(cname, ".indirect"));

// Adjust attributes for indirect argument
Expand Down Expand Up @@ -2473,7 +2477,7 @@ GenRet FnSymbol::codegenCast(GenRet fnPtr) {
#ifdef HAVE_LLVM
// now cast to correct function type
llvm::FunctionType* fnType = llvm::cast<llvm::FunctionType>(t.type);
llvm::PointerType *ptrToFnType = llvm::PointerType::getUnqual(fnType);
auto ptrToFnType = getPointerType(fnType);
fngen.val = info->irBuilder->CreateBitCast(fnPtr.val, ptrToFnType);
trackLLVMValue(fngen.val);
#endif
Expand Down Expand Up @@ -3036,9 +3040,9 @@ void FnSymbol::codegenDef() {
// Create a temp variable to store into
GenRet tmp = createTempVar(argType);
llvm::Value* ptr = tmp.val;
llvm::Type* ptrEltTy = chapelArgTy;
llvm::Type* i8PtrTy = getPointerType(irBuilder);
llvm::Type* coercePtrTy = llvm::PointerType::get(sTy, stackSpace);
auto ptrEltTy = chapelArgTy;
auto i8PtrTy = getPointerType(irBuilder);
auto coercePtrTy = getPointerType(sTy, stackSpace);

// handle offset
if (unsigned offset = argInfo->getDirectOffset()) {
Expand Down Expand Up @@ -3276,14 +3280,22 @@ GenRet FnSymbol::codegenAsCallBaseExpr() {
INT_ASSERT(ty.type);
llvm::Type* Types[] = {ty.type};

#if LLVM_VERSION_MAJOR < 21
// TargetIntrinsics where removed in LLVM 21
// we just access them like normal intrinsics
const llvm::TargetIntrinsicInfo *TII = info->targetMachine->getIntrinsicInfo();
#endif
#if LLVM_VERSION_MAJOR >= 20
llvm::Intrinsic::ID ID = llvm::Intrinsic::lookupIntrinsicID(cname);
#else
llvm::Intrinsic::ID ID = llvm::Function::lookupIntrinsicID(cname);
#endif
#if LLVM_VERSION_MAJOR < 21
if (ID == llvm::Intrinsic::not_intrinsic && TII)
ID = static_cast<llvm::Intrinsic::ID>(TII->lookupName(cname));
#endif
if (ID == llvm::Intrinsic::not_intrinsic)
USR_FATAL("Could not find LLVM intrinsic %s", cname);
#if LLVM_VERSION_MAJOR >= 20
ret.val = llvm::Intrinsic::getOrInsertDeclaration(info->module, ID, Types);
#else
Expand Down
12 changes: 6 additions & 6 deletions compiler/codegen/cg-type.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ static void codegenFunctionTypeLocal(FunctionType* ft) {
// The final type is a pointer to the underlying function type.
auto& layout = gGenInfo->module->getDataLayout();
auto addrSpace = layout.getAllocaAddrSpace();
llvm::Type* t = llvm::PointerType::get(baseType, addrSpace);
llvm::Type* t = getPointerType(baseType, addrSpace);

if (!ft->symbol->hasLLVMType()) {
gGenInfo->lvt->addGlobalType(ft->symbol->cname, t, false);
Expand Down Expand Up @@ -541,7 +541,7 @@ void AggregateType::codegenDef() {
} else {
#ifdef HAVE_LLVM
llvm::Type* llBaseType = baseForLLVMPointer(base)->getLLVMType();
type = llvm::PointerType::getUnqual(llBaseType);
type = getPointerType(llBaseType);
structAlignment = ALIGNMENT_DEFER; // or pointer alignment
#endif
}
Expand All @@ -556,7 +556,7 @@ void AggregateType::codegenDef() {
} else {
#ifdef HAVE_LLVM
llvm::Type* llBaseType = baseForLLVMPointer(base)->getLLVMType();
type = llvm::PointerType::getUnqual(llBaseType);
type = getPointerType(llBaseType);
structAlignment = ALIGNMENT_DEFER; // or pointer alignment
#endif
}
Expand Down Expand Up @@ -628,15 +628,15 @@ void AggregateType::codegenDef() {

if (isOpaquePointer(llBaseType)) {
// No need to compute the element type for an opaque pointer
globalPtrTy = llvm::PointerType::get(gContext->llvmContext(),
globalPtrTy = getPointerType(gContext->llvmContext(),
globalAddressSpace);
} else {
#ifdef HAVE_LLVM_TYPED_POINTERS
// Remove one level of indirection since the addr field
// of a wide pointer is always a local address.
llvm::Type* eltType = llBaseType->getPointerElementType();
INT_ASSERT(eltType);
globalPtrTy = llvm::PointerType::get(eltType, globalAddressSpace);
globalPtrTy = getPointerType(eltType, globalAddressSpace);
#endif
}

Expand Down Expand Up @@ -719,7 +719,7 @@ void AggregateType::codegenPrototype() {
st = llvm::StructType::create(info->module->getContext(), struct_name);
info->lvt->addGlobalType(struct_name, st, false);

llvm::PointerType* pt = llvm::PointerType::getUnqual(st);
auto pt = getPointerType(st);
info->lvt->addGlobalType(symbol->cname, pt, false);
symbol->llvmImplType = st;
#endif
Expand Down
Loading