diff options
author | Rahul Joshi <rjoshi@nvidia.com> | 2024-10-11 05:26:03 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-11 05:26:03 -0700 |
commit | fa789dffb1e12c2aece0187aeacc48dfb1768340 (patch) | |
tree | cebfdc0d8b0111115cbefeb8d2927fe8c2cfbdfb /llvm/lib/IR | |
parent | 900ea21ffb38ba5b783b20f394c43c6c89d58086 (diff) | |
download | llvm-fa789dffb1e12c2aece0187aeacc48dfb1768340.zip llvm-fa789dffb1e12c2aece0187aeacc48dfb1768340.tar.gz llvm-fa789dffb1e12c2aece0187aeacc48dfb1768340.tar.bz2 |
[NFC] Rename `Intrinsic::getDeclaration` to `getOrInsertDeclaration` (#111752)
Rename the function to reflect its correct behavior and to be consistent
with `Module::getOrInsertFunction`. This is also in preparation of
adding a new `Intrinsic::getDeclaration` that will have behavior similar
to `Module::getFunction` (i.e, just lookup, no creation).
Diffstat (limited to 'llvm/lib/IR')
-rw-r--r-- | llvm/lib/IR/AutoUpgrade.cpp | 318 | ||||
-rw-r--r-- | llvm/lib/IR/Core.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/IR/DIBuilder.cpp | 8 | ||||
-rw-r--r-- | llvm/lib/IR/DebugProgramInstruction.cpp | 8 | ||||
-rw-r--r-- | llvm/lib/IR/IRBuilder.cpp | 96 | ||||
-rw-r--r-- | llvm/lib/IR/IntrinsicInst.cpp | 29 | ||||
-rw-r--r-- | llvm/lib/IR/Intrinsics.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/IR/Module.cpp | 9 | ||||
-rw-r--r-- | llvm/lib/IR/VectorBuilder.cpp | 4 |
9 files changed, 248 insertions, 231 deletions
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index 215bfc8..477b77a 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -65,7 +65,7 @@ static bool upgradePTESTIntrinsic(Function *F, Intrinsic::ID IID, // Yes, it's old, replace it with new version. rename(F); - NewFn = Intrinsic::getDeclaration(F->getParent(), IID); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), IID); return true; } @@ -81,7 +81,7 @@ static bool upgradeX86IntrinsicsWith8BitMask(Function *F, Intrinsic::ID IID, // Move this function aside and map down. rename(F); - NewFn = Intrinsic::getDeclaration(F->getParent(), IID); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), IID); return true; } @@ -94,7 +94,7 @@ static bool upgradeX86MaskedFPCompare(Function *F, Intrinsic::ID IID, return false; rename(F); - NewFn = Intrinsic::getDeclaration(F->getParent(), IID); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), IID); return true; } @@ -104,7 +104,7 @@ static bool upgradeX86BF16Intrinsic(Function *F, Intrinsic::ID IID, return false; rename(F); - NewFn = Intrinsic::getDeclaration(F->getParent(), IID); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), IID); return true; } @@ -114,7 +114,7 @@ static bool upgradeX86BF16DPIntrinsic(Function *F, Intrinsic::ID IID, return false; rename(F); - NewFn = Intrinsic::getDeclaration(F->getParent(), IID); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), IID); return true; } @@ -502,8 +502,8 @@ static bool upgradeX86IntrinsicFunction(Function *F, StringRef Name, return false; rename(F); - NewFn = Intrinsic::getDeclaration(F->getParent(), - Intrinsic::x86_rdtscp); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), + Intrinsic::x86_rdtscp); return true; } @@ -609,14 +609,15 @@ static bool upgradeX86IntrinsicFunction(Function *F, StringRef Name, if (ID != Intrinsic::not_intrinsic) { rename(F); - NewFn = Intrinsic::getDeclaration(F->getParent(), ID); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), ID); return true; } return false; // No other 'x86.xop.*' } if (Name == "seh.recoverfp") { - NewFn = Intrinsic::getDeclaration(F->getParent(), Intrinsic::eh_recoverfp); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), + Intrinsic::eh_recoverfp); return true; } @@ -630,15 +631,15 @@ static bool upgradeArmOrAarch64IntrinsicFunction(bool IsArm, Function *F, Function *&NewFn) { if (Name.starts_with("rbit")) { // '(arm|aarch64).rbit'. - NewFn = Intrinsic::getDeclaration(F->getParent(), Intrinsic::bitreverse, - F->arg_begin()->getType()); + NewFn = Intrinsic::getOrInsertDeclaration( + F->getParent(), Intrinsic::bitreverse, F->arg_begin()->getType()); return true; } if (Name == "thread.pointer") { // '(arm|aarch64).thread.pointer'. - NewFn = - Intrinsic::getDeclaration(F->getParent(), Intrinsic::thread_pointer); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), + Intrinsic::thread_pointer); return true; } @@ -663,7 +664,7 @@ static bool upgradeArmOrAarch64IntrinsicFunction(bool IsArm, Function *F, std::array<Type *, 2> Tys{ {F->getReturnType(), FixedVectorType::get(Type::getBFloatTy(Ctx), OperandWidth / 16)}}; - NewFn = Intrinsic::getDeclaration(F->getParent(), ID, Tys); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), ID, Tys); return true; } return false; // No other '(arm|aarch64).neon.bfdot.*'. @@ -688,7 +689,7 @@ static bool upgradeArmOrAarch64IntrinsicFunction(bool IsArm, Function *F, : (Intrinsic::ID)Intrinsic::aarch64_neon_bfmlalt) .Default(Intrinsic::not_intrinsic); if (ID != Intrinsic::not_intrinsic) { - NewFn = Intrinsic::getDeclaration(F->getParent(), ID); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), ID); return true; } return false; // No other '(arm|aarch64).neon.bfm*.v16i8'. @@ -712,8 +713,8 @@ static bool upgradeArmOrAarch64IntrinsicFunction(bool IsArm, Function *F, .StartsWith("vqsubu.", Intrinsic::usub_sat) .Default(Intrinsic::not_intrinsic); if (ID != Intrinsic::not_intrinsic) { - NewFn = Intrinsic::getDeclaration(F->getParent(), ID, - F->arg_begin()->getType()); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), ID, + F->arg_begin()->getType()); return true; } @@ -733,10 +734,10 @@ static bool upgradeArmOrAarch64IntrinsicFunction(bool IsArm, Function *F, auto fArgs = F->getFunctionType()->params(); Type *Tys[] = {fArgs[0], fArgs[1]}; if (Groups[1].size() == 1) - NewFn = Intrinsic::getDeclaration(F->getParent(), - StoreInts[fArgs.size() - 3], Tys); + NewFn = Intrinsic::getOrInsertDeclaration( + F->getParent(), StoreInts[fArgs.size() - 3], Tys); else - NewFn = Intrinsic::getDeclaration( + NewFn = Intrinsic::getOrInsertDeclaration( F->getParent(), StoreLaneInts[fArgs.size() - 5], Tys); return true; } @@ -810,8 +811,8 @@ static bool upgradeArmOrAarch64IntrinsicFunction(bool IsArm, Function *F, .StartsWith("rbit", Intrinsic::bitreverse) .Default(Intrinsic::not_intrinsic); if (ID != Intrinsic::not_intrinsic) { - NewFn = Intrinsic::getDeclaration(F->getParent(), ID, - F->arg_begin()->getType()); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), ID, + F->arg_begin()->getType()); return true; } @@ -821,8 +822,8 @@ static bool upgradeArmOrAarch64IntrinsicFunction(bool IsArm, Function *F, return false; // Invalid IR. VectorType *Ty = dyn_cast<VectorType>(F->getReturnType()); if (Ty && Ty->getElementType()->isFloatingPointTy()) { - NewFn = Intrinsic::getDeclaration(F->getParent(), - Intrinsic::aarch64_neon_faddp, Ty); + NewFn = Intrinsic::getOrInsertDeclaration( + F->getParent(), Intrinsic::aarch64_neon_faddp, Ty); return true; } } @@ -840,7 +841,7 @@ static bool upgradeArmOrAarch64IntrinsicFunction(bool IsArm, Function *F, .Case("mlalt", Intrinsic::aarch64_sve_bfmlalt_lane_v2) .Default(Intrinsic::not_intrinsic); if (ID != Intrinsic::not_intrinsic) { - NewFn = Intrinsic::getDeclaration(F->getParent(), ID); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), ID); return true; } return false; // No other 'aarch64.sve.bf*.lane'. @@ -861,8 +862,8 @@ static bool upgradeArmOrAarch64IntrinsicFunction(bool IsArm, Function *F, auto Args = F->getFunctionType()->params(); Type *Tys[] = {F->getReturnType(), Args[1]}; - NewFn = Intrinsic::getDeclaration(F->getParent(), - Intrinsic::aarch64_sve_faddqv, Tys); + NewFn = Intrinsic::getOrInsertDeclaration( + F->getParent(), Intrinsic::aarch64_sve_faddqv, Tys); return true; } @@ -880,8 +881,8 @@ static bool upgradeArmOrAarch64IntrinsicFunction(bool IsArm, Function *F, Intrinsic::aarch64_sve_ld3_sret, Intrinsic::aarch64_sve_ld4_sret, }; - NewFn = Intrinsic::getDeclaration(F->getParent(), - LoadIDs[Name[0] - '2'], Ty); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), + LoadIDs[Name[0] - '2'], Ty); return true; } return false; // No other 'aarch64.sve.ld*'. @@ -892,8 +893,8 @@ static bool upgradeArmOrAarch64IntrinsicFunction(bool IsArm, Function *F, if (Name.starts_with("get")) { // 'aarch64.sve.tuple.get*'. Type *Tys[] = {F->getReturnType(), F->arg_begin()->getType()}; - NewFn = Intrinsic::getDeclaration(F->getParent(), - Intrinsic::vector_extract, Tys); + NewFn = Intrinsic::getOrInsertDeclaration( + F->getParent(), Intrinsic::vector_extract, Tys); return true; } @@ -901,8 +902,8 @@ static bool upgradeArmOrAarch64IntrinsicFunction(bool IsArm, Function *F, // 'aarch64.sve.tuple.set*'. auto Args = F->getFunctionType()->params(); Type *Tys[] = {Args[0], Args[2], Args[1]}; - NewFn = Intrinsic::getDeclaration(F->getParent(), - Intrinsic::vector_insert, Tys); + NewFn = Intrinsic::getOrInsertDeclaration( + F->getParent(), Intrinsic::vector_insert, Tys); return true; } @@ -911,8 +912,8 @@ static bool upgradeArmOrAarch64IntrinsicFunction(bool IsArm, Function *F, // 'aarch64.sve.tuple.create*'. auto Args = F->getFunctionType()->params(); Type *Tys[] = {F->getReturnType(), Args[1]}; - NewFn = Intrinsic::getDeclaration(F->getParent(), - Intrinsic::vector_insert, Tys); + NewFn = Intrinsic::getOrInsertDeclaration( + F->getParent(), Intrinsic::vector_insert, Tys); return true; } return false; // No other 'aarch64.sve.tuple.*'. @@ -1026,8 +1027,8 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, if (Name.consume_front("amdgcn.")) { if (Name == "alignbit") { // Target specific intrinsic became redundant - NewFn = Intrinsic::getDeclaration(F->getParent(), Intrinsic::fshr, - {F->getReturnType()}); + NewFn = Intrinsic::getOrInsertDeclaration( + F->getParent(), Intrinsic::fshr, {F->getReturnType()}); return true; } @@ -1056,9 +1057,9 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, if (Name.starts_with("ldexp.")) { // Target specific intrinsic became redundant - NewFn = Intrinsic::getDeclaration( - F->getParent(), Intrinsic::ldexp, - {F->getReturnType(), F->getArg(1)->getType()}); + NewFn = Intrinsic::getOrInsertDeclaration( + F->getParent(), Intrinsic::ldexp, + {F->getReturnType(), F->getArg(1)->getType()}); return true; } break; // No other 'amdgcn.*' @@ -1074,15 +1075,16 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, .Default(Intrinsic::not_intrinsic); if (ID != Intrinsic::not_intrinsic) { rename(F); - NewFn = Intrinsic::getDeclaration(F->getParent(), ID, - F->arg_begin()->getType()); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), ID, + F->arg_begin()->getType()); return true; } } if (F->arg_size() == 2 && Name == "coro.end") { rename(F); - NewFn = Intrinsic::getDeclaration(F->getParent(), Intrinsic::coro_end); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), + Intrinsic::coro_end); return true; } @@ -1105,7 +1107,8 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, // converted to DbgVariableRecords later. if (Name == "addr" || (Name == "value" && F->arg_size() == 4)) { rename(F); - NewFn = Intrinsic::getDeclaration(F->getParent(), Intrinsic::dbg_value); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), + Intrinsic::dbg_value); return true; } break; // No other 'dbg.*'. @@ -1135,7 +1138,7 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, // Inserting overloads the inserted type. Tys.push_back(FT->getParamType(1)); rename(F); - NewFn = Intrinsic::getDeclaration(F->getParent(), ID, Tys); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), ID, Tys); return true; } @@ -1171,8 +1174,8 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, if (ID != Intrinsic::not_intrinsic) { rename(F); auto Args = F->getFunctionType()->params(); - NewFn = - Intrinsic::getDeclaration(F->getParent(), ID, {Args[V2 ? 1 : 0]}); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), ID, + {Args[V2 ? 1 : 0]}); return true; } break; // No other 'expermental.vector.reduce.*'. @@ -1182,15 +1185,16 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, if (Name.consume_front("experimental.stepvector.")) { Intrinsic::ID ID = Intrinsic::stepvector; rename(F); - NewFn = Intrinsic::getDeclaration(F->getParent(), ID, - F->getFunctionType()->getReturnType()); + NewFn = Intrinsic::getOrInsertDeclaration( + F->getParent(), ID, F->getFunctionType()->getReturnType()); return true; } break; // No other 'e*'. case 'f': if (Name.starts_with("flt.rounds")) { rename(F); - NewFn = Intrinsic::getDeclaration(F->getParent(), Intrinsic::get_rounding); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), + Intrinsic::get_rounding); return true; } break; @@ -1200,8 +1204,8 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, auto Args = F->getFunctionType()->params(); Type* ObjectPtr[1] = {Args[0]}; rename(F); - NewFn = Intrinsic::getDeclaration(F->getParent(), - Intrinsic::launder_invariant_group, ObjectPtr); + NewFn = Intrinsic::getOrInsertDeclaration( + F->getParent(), Intrinsic::launder_invariant_group, ObjectPtr); return true; } break; @@ -1218,7 +1222,8 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, // Get the types of dest, src, and len ArrayRef<Type *> ParamTypes = F->getFunctionType()->params().slice(0, 3); - NewFn = Intrinsic::getDeclaration(F->getParent(), ID, ParamTypes); + NewFn = + Intrinsic::getOrInsertDeclaration(F->getParent(), ID, ParamTypes); return true; } } @@ -1230,8 +1235,8 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, FT->getParamType(0), // Dest FT->getParamType(2) // len }; - NewFn = Intrinsic::getDeclaration(F->getParent(), Intrinsic::memset, - ParamTypes); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), + Intrinsic::memset, ParamTypes); return true; } break; @@ -1247,8 +1252,8 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, .Case("popc.i", Intrinsic::ctpop) .Default(Intrinsic::not_intrinsic); if (IID != Intrinsic::not_intrinsic) { - NewFn = Intrinsic::getDeclaration(F->getParent(), IID, - {F->getReturnType()}); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), IID, + {F->getReturnType()}); return true; } } @@ -1316,8 +1321,8 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, F->getName() != Intrinsic::getName(Intrinsic::objectsize, Tys, F->getParent())) { rename(F); - NewFn = Intrinsic::getDeclaration(F->getParent(), Intrinsic::objectsize, - Tys); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), + Intrinsic::objectsize, Tys); return true; } } @@ -1326,7 +1331,7 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, case 'p': if (Name.starts_with("ptr.annotation.") && F->arg_size() == 4) { rename(F); - NewFn = Intrinsic::getDeclaration( + NewFn = Intrinsic::getOrInsertDeclaration( F->getParent(), Intrinsic::ptr_annotation, {F->arg_begin()->getType(), F->getArg(1)->getType()}); return true; @@ -1345,7 +1350,7 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, if (ID != Intrinsic::not_intrinsic) { if (!F->getFunctionType()->getParamType(2)->isIntegerTy(32)) { rename(F); - NewFn = Intrinsic::getDeclaration(F->getParent(), ID); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), ID); return true; } break; // No other applicable upgrades. @@ -1359,7 +1364,7 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, if (!F->getFunctionType()->getParamType(2)->isIntegerTy(32) || F->getFunctionType()->getReturnType()->isIntegerTy(64)) { rename(F); - NewFn = Intrinsic::getDeclaration(F->getParent(), ID); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), ID); return true; } break; // No other applicable upgrades. @@ -1376,7 +1381,7 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, if (ID != Intrinsic::not_intrinsic) { if (F->getFunctionType()->getReturnType()->isIntegerTy(64)) { rename(F); - NewFn = Intrinsic::getDeclaration(F->getParent(), ID); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), ID); return true; } break; // No other applicable upgrades. @@ -1395,7 +1400,7 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, case 'v': { if (Name == "var.annotation" && F->arg_size() == 4) { rename(F); - NewFn = Intrinsic::getDeclaration( + NewFn = Intrinsic::getOrInsertDeclaration( F->getParent(), Intrinsic::var_annotation, {{F->arg_begin()->getType(), F->getArg(1)->getType()}}); return true; @@ -1413,8 +1418,8 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, .Default(Intrinsic::not_intrinsic); if (ID != Intrinsic::not_intrinsic) { rename(F); - NewFn = - Intrinsic::getDeclaration(F->getParent(), ID, F->getReturnType()); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), ID, + F->getReturnType()); return true; } @@ -1426,7 +1431,7 @@ static bool upgradeIntrinsicFunction1(Function *F, Function *&NewFn, .Default(Intrinsic::not_intrinsic); if (ID != Intrinsic::not_intrinsic) { rename(F); - NewFn = Intrinsic::getDeclaration(F->getParent(), ID); + NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), ID); return true; } break; // No other 'wasm.dot.i8x16.i7x16.*'. @@ -1740,8 +1745,8 @@ static Value *upgradeX86VPERMT2Intrinsics(IRBuilder<> &Builder, CallBase &CI, if (!IndexForm) std::swap(Args[0], Args[1]); - Value *V = Builder.CreateCall(Intrinsic::getDeclaration(CI.getModule(), IID), - Args); + Value *V = Builder.CreateCall( + Intrinsic::getOrInsertDeclaration(CI.getModule(), IID), Args); Value *PassThru = ZeroMask ? ConstantAggregateZero::get(Ty) : Builder.CreateBitCast(CI.getArgOperand(1), Ty); @@ -1753,7 +1758,7 @@ static Value *upgradeX86BinaryIntrinsics(IRBuilder<> &Builder, CallBase &CI, Type *Ty = CI.getType(); Value *Op0 = CI.getOperand(0); Value *Op1 = CI.getOperand(1); - Function *Intrin = Intrinsic::getDeclaration(CI.getModule(), IID, Ty); + Function *Intrin = Intrinsic::getOrInsertDeclaration(CI.getModule(), IID, Ty); Value *Res = Builder.CreateCall(Intrin, {Op0, Op1}); if (CI.arg_size() == 4) { // For masked intrinsics. @@ -1780,7 +1785,7 @@ static Value *upgradeX86Rotate(IRBuilder<> &Builder, CallBase &CI, } Intrinsic::ID IID = IsRotateRight ? Intrinsic::fshr : Intrinsic::fshl; - Function *Intrin = Intrinsic::getDeclaration(CI.getModule(), IID, Ty); + Function *Intrin = Intrinsic::getOrInsertDeclaration(CI.getModule(), IID, Ty); Value *Res = Builder.CreateCall(Intrin, {Src, Src, Amt}); if (CI.arg_size() == 4) { // For masked intrinsics. @@ -1850,7 +1855,7 @@ static Value *upgradeX86ConcatShift(IRBuilder<> &Builder, CallBase &CI, } Intrinsic::ID IID = IsShiftRight ? Intrinsic::fshr : Intrinsic::fshl; - Function *Intrin = Intrinsic::getDeclaration(CI.getModule(), IID, Ty); + Function *Intrin = Intrinsic::getOrInsertDeclaration(CI.getModule(), IID, Ty); Value *Res = Builder.CreateCall(Intrin, {Op0, Op1, Amt}); unsigned NumArgs = CI.arg_size(); @@ -1911,7 +1916,8 @@ static Value *upgradeMaskedLoad(IRBuilder<> &Builder, Value *Ptr, static Value *upgradeAbs(IRBuilder<> &Builder, CallBase &CI) { Type *Ty = CI.getType(); Value *Op0 = CI.getArgOperand(0); - Function *F = Intrinsic::getDeclaration(CI.getModule(), Intrinsic::abs, Ty); + Function *F = + Intrinsic::getOrInsertDeclaration(CI.getModule(), Intrinsic::abs, Ty); Value *Res = Builder.CreateCall(F, {Op0, Builder.getInt1(false)}); if (CI.arg_size() == 3) Res = emitX86Select(Builder, CI.getArgOperand(2), Res, CI.getArgOperand(1)); @@ -2004,7 +2010,7 @@ static Value *upgradeMaskedCompare(IRBuilder<> &Builder, CallBase &CI, // Replace a masked intrinsic with an older unmasked intrinsic. static Value *upgradeX86MaskedShift(IRBuilder<> &Builder, CallBase &CI, Intrinsic::ID IID) { - Function *Intrin = Intrinsic::getDeclaration(CI.getModule(), IID); + Function *Intrin = Intrinsic::getOrInsertDeclaration(CI.getModule(), IID); Value *Rep = Builder.CreateCall(Intrin, { CI.getArgOperand(0), CI.getArgOperand(1) }); return emitX86Select(Builder, CI.getArgOperand(3), Rep, CI.getArgOperand(2)); @@ -2263,8 +2269,8 @@ static bool upgradeAVX512MaskToSelect(StringRef Name, IRBuilder<> &Builder, SmallVector<Value *, 4> Args(CI.args()); Args.pop_back(); Args.pop_back(); - Rep = Builder.CreateCall(Intrinsic::getDeclaration(CI.getModule(), IID), - Args); + Rep = Builder.CreateCall( + Intrinsic::getOrInsertDeclaration(CI.getModule(), IID), Args); unsigned NumArgs = CI.arg_size(); Rep = emitX86Select(Builder, CI.getArgOperand(NumArgs - 1), Rep, CI.getArgOperand(NumArgs - 2)); @@ -2320,8 +2326,8 @@ static Value *upgradeNVVMIntrinsicCall(StringRef Name, CallBase *CI, // llvm.nvvm.clz.ll returns an i32, but llvm.ctlz.i64 returns an i64. Value *Arg = CI->getArgOperand(0); Value *Ctlz = Builder.CreateCall( - Intrinsic::getDeclaration(F->getParent(), Intrinsic::ctlz, - {Arg->getType()}), + Intrinsic::getOrInsertDeclaration(F->getParent(), Intrinsic::ctlz, + {Arg->getType()}), {Arg, Builder.getFalse()}, "ctlz"); Rep = Builder.CreateTrunc(Ctlz, Builder.getInt32Ty(), "ctlz.trunc"); } else if (Name == "popc.ll") { @@ -2329,15 +2335,15 @@ static Value *upgradeNVVMIntrinsicCall(StringRef Name, CallBase *CI, // i64. Value *Arg = CI->getArgOperand(0); Value *Popc = Builder.CreateCall( - Intrinsic::getDeclaration(F->getParent(), Intrinsic::ctpop, - {Arg->getType()}), + Intrinsic::getOrInsertDeclaration(F->getParent(), Intrinsic::ctpop, + {Arg->getType()}), Arg, "ctpop"); Rep = Builder.CreateTrunc(Popc, Builder.getInt32Ty(), "ctpop.trunc"); } else if (Name == "h2f") { - Rep = Builder.CreateCall( - Intrinsic::getDeclaration(F->getParent(), Intrinsic::convert_from_fp16, - {Builder.getFloatTy()}), - CI->getArgOperand(0), "h2f"); + Rep = Builder.CreateCall(Intrinsic::getOrInsertDeclaration( + F->getParent(), Intrinsic::convert_from_fp16, + {Builder.getFloatTy()}), + CI->getArgOperand(0), "h2f"); } else if (Name.consume_front("bitcast.") && (Name == "f2i" || Name == "i2f" || Name == "ll2d" || Name == "d2ll")) { @@ -2373,7 +2379,7 @@ static Value *upgradeNVVMIntrinsicCall(StringRef Name, CallBase *CI, if (IID != Intrinsic::not_intrinsic && !F->getReturnType()->getScalarType()->isBFloatTy()) { rename(F); - Function *NewFn = Intrinsic::getDeclaration(F->getParent(), IID); + Function *NewFn = Intrinsic::getOrInsertDeclaration(F->getParent(), IID); SmallVector<Value *, 2> Args; for (size_t I = 0; I < NewFn->arg_size(); ++I) { Value *Arg = CI->getArgOperand(I); @@ -2480,15 +2486,15 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, } else if (Name == "sse.sqrt.ss" || Name == "sse2.sqrt.sd") { Value *Vec = CI->getArgOperand(0); Value *Elt0 = Builder.CreateExtractElement(Vec, (uint64_t)0); - Function *Intr = Intrinsic::getDeclaration(F->getParent(), Intrinsic::sqrt, - Elt0->getType()); + Function *Intr = Intrinsic::getOrInsertDeclaration( + F->getParent(), Intrinsic::sqrt, Elt0->getType()); Elt0 = Builder.CreateCall(Intr, Elt0); Rep = Builder.CreateInsertElement(Vec, Elt0, (uint64_t)0); } else if (Name.starts_with("avx.sqrt.p") || Name.starts_with("sse2.sqrt.p") || Name.starts_with("sse.sqrt.p")) { Rep = - Builder.CreateCall(Intrinsic::getDeclaration( + Builder.CreateCall(Intrinsic::getOrInsertDeclaration( F->getParent(), Intrinsic::sqrt, CI->getType()), {CI->getArgOperand(0)}); } else if (Name.starts_with("avx512.mask.sqrt.p")) { @@ -2499,13 +2505,13 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, : Intrinsic::x86_avx512_sqrt_pd_512; Value *Args[] = {CI->getArgOperand(0), CI->getArgOperand(3)}; - Rep = Builder.CreateCall(Intrinsic::getDeclaration(CI->getModule(), IID), - Args); + Rep = Builder.CreateCall( + Intrinsic::getOrInsertDeclaration(CI->getModule(), IID), Args); } else { - Rep = Builder.CreateCall(Intrinsic::getDeclaration(F->getParent(), - Intrinsic::sqrt, - CI->getType()), - {CI->getArgOperand(0)}); + Rep = Builder.CreateCall( + Intrinsic::getOrInsertDeclaration(F->getParent(), Intrinsic::sqrt, + CI->getType()), + {CI->getArgOperand(0)}); } Rep = emitX86Select(Builder, CI->getArgOperand(2), Rep, CI->getArgOperand(1)); @@ -2629,8 +2635,9 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, break; } - Rep = Builder.CreateCall(Intrinsic::getDeclaration(F->getParent(), IID), - {CI->getOperand(0), CI->getArgOperand(1)}); + Rep = Builder.CreateCall( + Intrinsic::getOrInsertDeclaration(F->getParent(), IID), + {CI->getOperand(0), CI->getArgOperand(1)}); Rep = applyX86MaskOn1BitsVec(Builder, Rep, CI->getArgOperand(2)); } else if (Name.starts_with("avx512.mask.fpclass.p")) { Type *OpTy = CI->getArgOperand(0)->getType(); @@ -2652,8 +2659,9 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, else llvm_unreachable("Unexpected intrinsic"); - Rep = Builder.CreateCall(Intrinsic::getDeclaration(F->getParent(), IID), - {CI->getOperand(0), CI->getArgOperand(1)}); + Rep = Builder.CreateCall( + Intrinsic::getOrInsertDeclaration(F->getParent(), IID), + {CI->getOperand(0), CI->getArgOperand(1)}); Rep = applyX86MaskOn1BitsVec(Builder, Rep, CI->getArgOperand(2)); } else if (Name.starts_with("avx512.cmp.p")) { SmallVector<Value *, 4> Args(CI->args()); @@ -2681,8 +2689,8 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, std::swap(Mask, Args.back()); Args.push_back(Mask); - Rep = Builder.CreateCall(Intrinsic::getDeclaration(F->getParent(), IID), - Args); + Rep = Builder.CreateCall( + Intrinsic::getOrInsertDeclaration(F->getParent(), IID), Args); } else if (Name.starts_with("avx512.mask.cmp.")) { // Integer compare intrinsics. unsigned Imm = cast<ConstantInt>(CI->getArgOperand(2))->getZExtValue(); @@ -2776,8 +2784,8 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, cast<ConstantInt>(CI->getArgOperand(3))->getZExtValue() != 4)) { Intrinsic::ID IID = IsUnsigned ? Intrinsic::x86_avx512_uitofp_round : Intrinsic::x86_avx512_sitofp_round; - Function *F = - Intrinsic::getDeclaration(CI->getModule(), IID, {DstTy, SrcTy}); + Function *F = Intrinsic::getOrInsertDeclaration(CI->getModule(), IID, + {DstTy, SrcTy}); Rep = Builder.CreateCall(F, {Rep, CI->getArgOperand(3)}); } else { Rep = IsUnsigned ? Builder.CreateUIToFP(Rep, DstTy, "cvt") @@ -2819,7 +2827,7 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, Value *MaskVec = getX86MaskVec(Builder, CI->getArgOperand(2), ResultTy->getNumElements()); - Function *ELd = Intrinsic::getDeclaration( + Function *ELd = Intrinsic::getOrInsertDeclaration( F->getParent(), Intrinsic::masked_expandload, ResultTy); Rep = Builder.CreateCall(ELd, {Ptr, MaskVec, CI->getOperand(1)}); } else if (Name.starts_with("avx512.mask.compress.store.")) { @@ -2834,7 +2842,7 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, getX86MaskVec(Builder, CI->getArgOperand(2), cast<FixedVectorType>(ResultTy)->getNumElements()); - Function *CSt = Intrinsic::getDeclaration( + Function *CSt = Intrinsic::getOrInsertDeclaration( F->getParent(), Intrinsic::masked_compressstore, ResultTy); Rep = Builder.CreateCall(CSt, {CI->getArgOperand(1), Ptr, MaskVec}); } else if (Name.starts_with("avx512.mask.compress.") || @@ -2847,7 +2855,8 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, bool IsCompress = Name[12] == 'c'; Intrinsic::ID IID = IsCompress ? Intrinsic::x86_avx512_mask_compress : Intrinsic::x86_avx512_mask_expand; - Function *Intr = Intrinsic::getDeclaration(F->getParent(), IID, ResultTy); + Function *Intr = + Intrinsic::getOrInsertDeclaration(F->getParent(), IID, ResultTy); Rep = Builder.CreateCall(Intr, {CI->getOperand(0), CI->getOperand(1), MaskVec}); } else if (Name.starts_with("xop.vpcom")) { @@ -2910,7 +2919,7 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, bool ZeroMask = Name[11] == 'z'; Rep = upgradeX86ConcatShift(Builder, *CI, true, ZeroMask); } else if (Name == "sse42.crc32.64.8") { - Function *CRC32 = Intrinsic::getDeclaration( + Function *CRC32 = Intrinsic::getOrInsertDeclaration( F->getParent(), Intrinsic::x86_sse42_crc32_32_8); Value *Trunc0 = Builder.CreateTrunc(CI->getArgOperand(0), Type::getInt32Ty(C)); @@ -3405,7 +3414,7 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, IID = Intrinsic::x86_avx512_add_pd_512; Rep = Builder.CreateCall( - Intrinsic::getDeclaration(F->getParent(), IID), + Intrinsic::getOrInsertDeclaration(F->getParent(), IID), {CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(4)}); } else { Rep = Builder.CreateFAdd(CI->getArgOperand(0), CI->getArgOperand(1)); @@ -3421,7 +3430,7 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, IID = Intrinsic::x86_avx512_div_pd_512; Rep = Builder.CreateCall( - Intrinsic::getDeclaration(F->getParent(), IID), + Intrinsic::getOrInsertDeclaration(F->getParent(), IID), {CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(4)}); } else { Rep = Builder.CreateFDiv(CI->getArgOperand(0), CI->getArgOperand(1)); @@ -3437,7 +3446,7 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, IID = Intrinsic::x86_avx512_mul_pd_512; Rep = Builder.CreateCall( - Intrinsic::getDeclaration(F->getParent(), IID), + Intrinsic::getOrInsertDeclaration(F->getParent(), IID), {CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(4)}); } else { Rep = Builder.CreateFMul(CI->getArgOperand(0), CI->getArgOperand(1)); @@ -3453,7 +3462,7 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, IID = Intrinsic::x86_avx512_sub_pd_512; Rep = Builder.CreateCall( - Intrinsic::getDeclaration(F->getParent(), IID), + Intrinsic::getOrInsertDeclaration(F->getParent(), IID), {CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(4)}); } else { Rep = Builder.CreateFSub(CI->getArgOperand(0), CI->getArgOperand(1)); @@ -3471,13 +3480,13 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, Intrinsic::ID IID = MinMaxTbl[IsMin][IsDouble]; Rep = Builder.CreateCall( - Intrinsic::getDeclaration(F->getParent(), IID), + Intrinsic::getOrInsertDeclaration(F->getParent(), IID), {CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(4)}); Rep = emitX86Select(Builder, CI->getArgOperand(3), Rep, CI->getArgOperand(2)); } else if (Name.starts_with("avx512.mask.lzcnt.")) { Rep = - Builder.CreateCall(Intrinsic::getDeclaration( + Builder.CreateCall(Intrinsic::getOrInsertDeclaration( F->getParent(), Intrinsic::ctlz, CI->getType()), {CI->getArgOperand(0), Builder.getInt1(false)}); Rep = @@ -3723,10 +3732,10 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, if (NegAcc) Ops[2] = Builder.CreateFNeg(Ops[2]); - Rep = Builder.CreateCall(Intrinsic::getDeclaration(CI->getModule(), - Intrinsic::fma, - Ops[0]->getType()), - Ops); + Rep = Builder.CreateCall( + Intrinsic::getOrInsertDeclaration(CI->getModule(), Intrinsic::fma, + Ops[0]->getType()), + Ops); if (IsScalar) Rep = Builder.CreateInsertElement(CI->getArgOperand(0), Rep, (uint64_t)0); @@ -3738,10 +3747,10 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, Ops[1] = Builder.CreateExtractElement(Ops[1], (uint64_t)0); Ops[2] = Builder.CreateExtractElement(Ops[2], (uint64_t)0); - Rep = Builder.CreateCall(Intrinsic::getDeclaration(CI->getModule(), - Intrinsic::fma, - Ops[0]->getType()), - Ops); + Rep = Builder.CreateCall( + Intrinsic::getOrInsertDeclaration(CI->getModule(), Intrinsic::fma, + Ops[0]->getType()), + Ops); Rep = Builder.CreateInsertElement(Constant::getNullValue(CI->getType()), Rep, (uint64_t)0); @@ -3781,11 +3790,11 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, IID = Intrinsic::x86_avx512_vfmadd_f64; else IID = Intrinsic::x86_avx512_vfmadd_f32; - Function *FMA = Intrinsic::getDeclaration(CI->getModule(), IID); + Function *FMA = Intrinsic::getOrInsertDeclaration(CI->getModule(), IID); Rep = Builder.CreateCall(FMA, Ops); } else { - Function *FMA = Intrinsic::getDeclaration(CI->getModule(), Intrinsic::fma, - A->getType()); + Function *FMA = Intrinsic::getOrInsertDeclaration( + CI->getModule(), Intrinsic::fma, A->getType()); Rep = Builder.CreateCall(FMA, {A, B, C}); } @@ -3837,11 +3846,12 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, else IID = Intrinsic::x86_avx512_vfmadd_pd_512; - Rep = Builder.CreateCall(Intrinsic::getDeclaration(F->getParent(), IID), - {A, B, C, CI->getArgOperand(4)}); + Rep = Builder.CreateCall( + Intrinsic::getOrInsertDeclaration(F->getParent(), IID), + {A, B, C, CI->getArgOperand(4)}); } else { - Function *FMA = Intrinsic::getDeclaration(CI->getModule(), Intrinsic::fma, - A->getType()); + Function *FMA = Intrinsic::getOrInsertDeclaration( + CI->getModule(), Intrinsic::fma, A->getType()); Rep = Builder.CreateCall(FMA, {A, B, C}); } @@ -3868,8 +3878,8 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, Value *Ops[] = {CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(2)}; Ops[2] = Builder.CreateFNeg(Ops[2]); - Rep = - Builder.CreateCall(Intrinsic::getDeclaration(F->getParent(), IID), Ops); + Rep = Builder.CreateCall( + Intrinsic::getOrInsertDeclaration(F->getParent(), IID), Ops); } else if (Name.starts_with("avx512.mask.vfmaddsub.p") || Name.starts_with("avx512.mask3.vfmaddsub.p") || Name.starts_with("avx512.maskz.vfmaddsub.p") || @@ -3892,16 +3902,16 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, if (IsSubAdd) Ops[2] = Builder.CreateFNeg(Ops[2]); - Rep = Builder.CreateCall(Intrinsic::getDeclaration(F->getParent(), IID), - Ops); + Rep = Builder.CreateCall( + Intrinsic::getOrInsertDeclaration(F->getParent(), IID), Ops); } else { int NumElts = cast<FixedVectorType>(CI->getType())->getNumElements(); Value *Ops[] = {CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(2)}; - Function *FMA = Intrinsic::getDeclaration(CI->getModule(), Intrinsic::fma, - Ops[0]->getType()); + Function *FMA = Intrinsic::getOrInsertDeclaration( + CI->getModule(), Intrinsic::fma, Ops[0]->getType()); Value *Odd = Builder.CreateCall(FMA, Ops); Ops[2] = Builder.CreateFNeg(Ops[2]); Value *Even = Builder.CreateCall(FMA, Ops); @@ -3944,8 +3954,8 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, Value *Args[] = {CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(2), CI->getArgOperand(3)}; - Rep = Builder.CreateCall(Intrinsic::getDeclaration(CI->getModule(), IID), - Args); + Rep = Builder.CreateCall( + Intrinsic::getOrInsertDeclaration(CI->getModule(), IID), Args); Value *PassThru = ZeroMask ? ConstantAggregateZero::get(CI->getType()) : CI->getArgOperand(0); Rep = emitX86Select(Builder, CI->getArgOperand(4), Rep, PassThru); @@ -3972,8 +3982,8 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, Value *Args[] = {CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(2)}; - Rep = Builder.CreateCall(Intrinsic::getDeclaration(CI->getModule(), IID), - Args); + Rep = Builder.CreateCall( + Intrinsic::getOrInsertDeclaration(CI->getModule(), IID), Args); Value *PassThru = ZeroMask ? ConstantAggregateZero::get(CI->getType()) : CI->getArgOperand(0); Rep = emitX86Select(Builder, CI->getArgOperand(3), Rep, PassThru); @@ -4008,8 +4018,8 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, Value *Args[] = {CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(2)}; - Rep = Builder.CreateCall(Intrinsic::getDeclaration(CI->getModule(), IID), - Args); + Rep = Builder.CreateCall( + Intrinsic::getOrInsertDeclaration(CI->getModule(), IID), Args); Value *PassThru = ZeroMask ? ConstantAggregateZero::get(CI->getType()) : CI->getArgOperand(0); Rep = emitX86Select(Builder, CI->getArgOperand(3), Rep, PassThru); @@ -4038,8 +4048,8 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, Value *Args[] = {CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(2)}; - Rep = Builder.CreateCall(Intrinsic::getDeclaration(CI->getModule(), IID), - Args); + Rep = Builder.CreateCall( + Intrinsic::getOrInsertDeclaration(CI->getModule(), IID), Args); Value *PassThru = ZeroMask ? ConstantAggregateZero::get(CI->getType()) : CI->getArgOperand(0); Rep = emitX86Select(Builder, CI->getArgOperand(3), Rep, PassThru); @@ -4062,7 +4072,7 @@ static Value *upgradeX86IntrinsicCall(StringRef Name, CallBase *CI, Function *F, Value *Args[] = {CI->getArgOperand(0), CI->getArgOperand(1), CI->getArgOperand(2)}; Value *NewCall = Builder.CreateCall( - Intrinsic::getDeclaration(CI->getModule(), IID), Args); + Intrinsic::getOrInsertDeclaration(CI->getModule(), IID), Args); // Extract the second result and store it. Value *Data = Builder.CreateExtractValue(NewCall, 1); @@ -4108,7 +4118,7 @@ static Value *upgradeAArch64IntrinsicCall(StringRef Name, CallBase *CI, Args[1] = Builder.CreateIntrinsic(Intrinsic::aarch64_sve_convert_from_svbool, GoodPredTy, Args[1]); - Function *NewF = Intrinsic::getDeclaration(CI->getModule(), NewID); + Function *NewF = Intrinsic::getOrInsertDeclaration(CI->getModule(), NewID); return Builder.CreateCall(NewF, Args, CI->getName()); } @@ -4117,16 +4127,17 @@ static Value *upgradeARMIntrinsicCall(StringRef Name, CallBase *CI, Function *F, if (Name == "mve.vctp64.old") { // Replace the old v4i1 vctp64 with a v2i1 vctp and predicate-casts to the // correct type. - Value *VCTP = Builder.CreateCall( - Intrinsic::getDeclaration(F->getParent(), Intrinsic::arm_mve_vctp64), - CI->getArgOperand(0), CI->getName()); + Value *VCTP = + Builder.CreateCall(Intrinsic::getOrInsertDeclaration( + F->getParent(), Intrinsic::arm_mve_vctp64), + CI->getArgOperand(0), CI->getName()); Value *C1 = Builder.CreateCall( - Intrinsic::getDeclaration( + Intrinsic::getOrInsertDeclaration( F->getParent(), Intrinsic::arm_mve_pred_v2i, {VectorType::get(Builder.getInt1Ty(), 2, false)}), VCTP); return Builder.CreateCall( - Intrinsic::getDeclaration( + Intrinsic::getOrInsertDeclaration( F->getParent(), Intrinsic::arm_mve_pred_i2v, {VectorType::get(Builder.getInt1Ty(), 4, false)}), C1); @@ -4188,19 +4199,19 @@ static Value *upgradeARMIntrinsicCall(StringRef Name, CallBase *CI, Function *F, Type *Ty = Op->getType(); if (Ty->getScalarSizeInBits() == 1) { Value *C1 = Builder.CreateCall( - Intrinsic::getDeclaration( + Intrinsic::getOrInsertDeclaration( F->getParent(), Intrinsic::arm_mve_pred_v2i, {VectorType::get(Builder.getInt1Ty(), 4, false)}), Op); Op = Builder.CreateCall( - Intrinsic::getDeclaration(F->getParent(), - Intrinsic::arm_mve_pred_i2v, {V2I1Ty}), + Intrinsic::getOrInsertDeclaration( + F->getParent(), Intrinsic::arm_mve_pred_i2v, {V2I1Ty}), C1); } Ops.push_back(Op); } - Function *Fn = Intrinsic::getDeclaration(F->getParent(), ID, Tys); + Function *Fn = Intrinsic::getOrInsertDeclaration(F->getParent(), ID, Tys); return Builder.CreateCall(Fn, Ops, CI->getName()); } llvm_unreachable("Unknown function for ARM CallBase upgrade."); @@ -5088,7 +5099,8 @@ void llvm::UpgradeARCRuntime(Module &M) { if (!Fn) return; - Function *NewFn = llvm::Intrinsic::getDeclaration(&M, IntrinsicFunc); + Function *NewFn = + llvm::Intrinsic::getOrInsertDeclaration(&M, IntrinsicFunc); for (User *U : make_early_inc_range(Fn->users())) { CallInst *CI = dyn_cast<CallInst>(U); diff --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp index ee084e8..1cf998c 100644 --- a/llvm/lib/IR/Core.cpp +++ b/llvm/lib/IR/Core.cpp @@ -2468,7 +2468,7 @@ LLVMValueRef LLVMGetIntrinsicDeclaration(LLVMModuleRef Mod, size_t ParamCount) { ArrayRef<Type*> Tys(unwrap(ParamTypes), ParamCount); auto IID = llvm_map_to_intrinsic_id(ID); - return wrap(llvm::Intrinsic::getDeclaration(unwrap(Mod), IID, Tys)); + return wrap(llvm::Intrinsic::getOrInsertDeclaration(unwrap(Mod), IID, Tys)); } const char *LLVMIntrinsicGetName(unsigned ID, size_t *NameLength) { diff --git a/llvm/lib/IR/DIBuilder.cpp b/llvm/lib/IR/DIBuilder.cpp index 0db82cd..447a9d6 100644 --- a/llvm/lib/IR/DIBuilder.cpp +++ b/llvm/lib/IR/DIBuilder.cpp @@ -991,7 +991,7 @@ DbgInstPtr DIBuilder::insertDbgAssign(Instruction *LinkedInstr, Value *Val, LLVMContext &Ctx = LinkedInstr->getContext(); Module *M = LinkedInstr->getModule(); if (!AssignFn) - AssignFn = Intrinsic::getDeclaration(M, Intrinsic::dbg_assign); + AssignFn = Intrinsic::getOrInsertDeclaration(M, Intrinsic::dbg_assign); std::array<Value *, 6> Args = { MetadataAsValue::get(Ctx, ValueAsMetadata::get(Val)), @@ -1060,7 +1060,7 @@ static Value *getDbgIntrinsicValueImpl(LLVMContext &VMContext, Value *V) { } static Function *getDeclareIntrin(Module &M) { - return Intrinsic::getDeclaration(&M, Intrinsic::dbg_declare); + return Intrinsic::getOrInsertDeclaration(&M, Intrinsic::dbg_declare); } DbgInstPtr DIBuilder::insertDbgValueIntrinsic( @@ -1074,7 +1074,7 @@ DbgInstPtr DIBuilder::insertDbgValueIntrinsic( } if (!ValueFn) - ValueFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_value); + ValueFn = Intrinsic::getOrInsertDeclaration(&M, Intrinsic::dbg_value); return insertDbgIntrinsic(ValueFn, Val, VarInfo, Expr, DL, InsertBB, InsertBefore); } @@ -1175,7 +1175,7 @@ DbgInstPtr DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL, } if (!LabelFn) - LabelFn = Intrinsic::getDeclaration(&M, Intrinsic::dbg_label); + LabelFn = Intrinsic::getOrInsertDeclaration(&M, Intrinsic::dbg_label); Value *Args[] = {MetadataAsValue::get(VMContext, LabelInfo)}; diff --git a/llvm/lib/IR/DebugProgramInstruction.cpp b/llvm/lib/IR/DebugProgramInstruction.cpp index 0db9082..b37dbd5 100644 --- a/llvm/lib/IR/DebugProgramInstruction.cpp +++ b/llvm/lib/IR/DebugProgramInstruction.cpp @@ -413,13 +413,13 @@ DbgVariableRecord::createDebugIntrinsic(Module *M, // Work out what sort of intrinsic we're going to produce. switch (getType()) { case DbgVariableRecord::LocationType::Declare: - IntrinsicFn = Intrinsic::getDeclaration(M, Intrinsic::dbg_declare); + IntrinsicFn = Intrinsic::getOrInsertDeclaration(M, Intrinsic::dbg_declare); break; case DbgVariableRecord::LocationType::Value: - IntrinsicFn = Intrinsic::getDeclaration(M, Intrinsic::dbg_value); + IntrinsicFn = Intrinsic::getOrInsertDeclaration(M, Intrinsic::dbg_value); break; case DbgVariableRecord::LocationType::Assign: - IntrinsicFn = Intrinsic::getDeclaration(M, Intrinsic::dbg_assign); + IntrinsicFn = Intrinsic::getOrInsertDeclaration(M, Intrinsic::dbg_assign); break; case DbgVariableRecord::LocationType::End: case DbgVariableRecord::LocationType::Any: @@ -459,7 +459,7 @@ DbgVariableRecord::createDebugIntrinsic(Module *M, DbgLabelInst * DbgLabelRecord::createDebugIntrinsic(Module *M, Instruction *InsertBefore) const { - auto *LabelFn = Intrinsic::getDeclaration(M, Intrinsic::dbg_label); + auto *LabelFn = Intrinsic::getOrInsertDeclaration(M, Intrinsic::dbg_label); Value *Args[] = { MetadataAsValue::get(getDebugLoc()->getContext(), getLabel())}; DbgLabelInst *DbgLabel = cast<DbgLabelInst>( diff --git a/llvm/lib/IR/IRBuilder.cpp b/llvm/lib/IR/IRBuilder.cpp index 8bf695e..3654bf9 100644 --- a/llvm/lib/IR/IRBuilder.cpp +++ b/llvm/lib/IR/IRBuilder.cpp @@ -91,8 +91,8 @@ Value *IRBuilderBase::CreateVScale(Constant *Scaling, const Twine &Name) { if (cast<ConstantInt>(Scaling)->isZero()) return Scaling; Module *M = GetInsertBlock()->getParent()->getParent(); - Function *TheFn = - Intrinsic::getDeclaration(M, Intrinsic::vscale, {Scaling->getType()}); + Function *TheFn = Intrinsic::getOrInsertDeclaration(M, Intrinsic::vscale, + {Scaling->getType()}); CallInst *CI = CreateCall(TheFn, {}, {}, Name); return cast<ConstantInt>(Scaling)->isOne() ? CI : CreateMul(CI, Scaling); } @@ -142,7 +142,8 @@ CallInst *IRBuilderBase::CreateMemSet(Value *Ptr, Value *Val, Value *Size, Value *Ops[] = {Ptr, Val, Size, getInt1(isVolatile)}; Type *Tys[] = { Ptr->getType(), Size->getType() }; Module *M = BB->getParent()->getParent(); - Function *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memset, Tys); + Function *TheFn = + Intrinsic::getOrInsertDeclaration(M, Intrinsic::memset, Tys); CallInst *CI = CreateCall(TheFn, Ops); @@ -170,7 +171,8 @@ CallInst *IRBuilderBase::CreateMemSetInline(Value *Dst, MaybeAlign DstAlign, Value *Ops[] = {Dst, Val, Size, getInt1(IsVolatile)}; Type *Tys[] = {Dst->getType(), Size->getType()}; Module *M = BB->getParent()->getParent(); - Function *TheFn = Intrinsic::getDeclaration(M, Intrinsic::memset_inline, Tys); + Function *TheFn = + Intrinsic::getOrInsertDeclaration(M, Intrinsic::memset_inline, Tys); CallInst *CI = CreateCall(TheFn, Ops); @@ -197,7 +199,7 @@ CallInst *IRBuilderBase::CreateElementUnorderedAtomicMemSet( Value *Ops[] = {Ptr, Val, Size, getInt32(ElementSize)}; Type *Tys[] = {Ptr->getType(), Size->getType()}; Module *M = BB->getParent()->getParent(); - Function *TheFn = Intrinsic::getDeclaration( + Function *TheFn = Intrinsic::getOrInsertDeclaration( M, Intrinsic::memset_element_unordered_atomic, Tys); CallInst *CI = CreateCall(TheFn, Ops); @@ -227,7 +229,7 @@ CallInst *IRBuilderBase::CreateMemTransferInst( Value *Ops[] = {Dst, Src, Size, getInt1(isVolatile)}; Type *Tys[] = { Dst->getType(), Src->getType(), Size->getType() }; Module *M = BB->getParent()->getParent(); - Function *TheFn = Intrinsic::getDeclaration(M, IntrID, Tys); + Function *TheFn = Intrinsic::getOrInsertDeclaration(M, IntrID, Tys); CallInst *CI = CreateCall(TheFn, Ops); @@ -265,7 +267,7 @@ CallInst *IRBuilderBase::CreateElementUnorderedAtomicMemCpy( Value *Ops[] = {Dst, Src, Size, getInt32(ElementSize)}; Type *Tys[] = {Dst->getType(), Src->getType(), Size->getType()}; Module *M = BB->getParent()->getParent(); - Function *TheFn = Intrinsic::getDeclaration( + Function *TheFn = Intrinsic::getOrInsertDeclaration( M, Intrinsic::memcpy_element_unordered_atomic, Tys); CallInst *CI = CreateCall(TheFn, Ops); @@ -381,7 +383,7 @@ CallInst *IRBuilderBase::CreateElementUnorderedAtomicMemMove( Value *Ops[] = {Dst, Src, Size, getInt32(ElementSize)}; Type *Tys[] = {Dst->getType(), Src->getType(), Size->getType()}; Module *M = BB->getParent()->getParent(); - Function *TheFn = Intrinsic::getDeclaration( + Function *TheFn = Intrinsic::getOrInsertDeclaration( M, Intrinsic::memmove_element_unordered_atomic, Tys); CallInst *CI = CreateCall(TheFn, Ops); @@ -411,23 +413,23 @@ CallInst *IRBuilderBase::getReductionIntrinsic(Intrinsic::ID ID, Value *Src) { Module *M = GetInsertBlock()->getParent()->getParent(); Value *Ops[] = {Src}; Type *Tys[] = { Src->getType() }; - auto Decl = Intrinsic::getDeclaration(M, ID, Tys); + auto Decl = Intrinsic::getOrInsertDeclaration(M, ID, Tys); return CreateCall(Decl, Ops); } CallInst *IRBuilderBase::CreateFAddReduce(Value *Acc, Value *Src) { Module *M = GetInsertBlock()->getParent()->getParent(); Value *Ops[] = {Acc, Src}; - auto Decl = Intrinsic::getDeclaration(M, Intrinsic::vector_reduce_fadd, - {Src->getType()}); + auto Decl = Intrinsic::getOrInsertDeclaration( + M, Intrinsic::vector_reduce_fadd, {Src->getType()}); return CreateCall(Decl, Ops); } CallInst *IRBuilderBase::CreateFMulReduce(Value *Acc, Value *Src) { Module *M = GetInsertBlock()->getParent()->getParent(); Value *Ops[] = {Acc, Src}; - auto Decl = Intrinsic::getDeclaration(M, Intrinsic::vector_reduce_fmul, - {Src->getType()}); + auto Decl = Intrinsic::getOrInsertDeclaration( + M, Intrinsic::vector_reduce_fmul, {Src->getType()}); return CreateCall(Decl, Ops); } @@ -489,8 +491,8 @@ CallInst *IRBuilderBase::CreateLifetimeStart(Value *Ptr, ConstantInt *Size) { "lifetime.start requires the size to be an i64"); Value *Ops[] = { Size, Ptr }; Module *M = BB->getParent()->getParent(); - Function *TheFn = - Intrinsic::getDeclaration(M, Intrinsic::lifetime_start, {Ptr->getType()}); + Function *TheFn = Intrinsic::getOrInsertDeclaration( + M, Intrinsic::lifetime_start, {Ptr->getType()}); return CreateCall(TheFn, Ops); } @@ -504,8 +506,8 @@ CallInst *IRBuilderBase::CreateLifetimeEnd(Value *Ptr, ConstantInt *Size) { "lifetime.end requires the size to be an i64"); Value *Ops[] = { Size, Ptr }; Module *M = BB->getParent()->getParent(); - Function *TheFn = - Intrinsic::getDeclaration(M, Intrinsic::lifetime_end, {Ptr->getType()}); + Function *TheFn = Intrinsic::getOrInsertDeclaration( + M, Intrinsic::lifetime_end, {Ptr->getType()}); return CreateCall(TheFn, Ops); } @@ -523,8 +525,8 @@ CallInst *IRBuilderBase::CreateInvariantStart(Value *Ptr, ConstantInt *Size) { // Fill in the single overloaded type: memory object type. Type *ObjectPtr[1] = {Ptr->getType()}; Module *M = BB->getParent()->getParent(); - Function *TheFn = - Intrinsic::getDeclaration(M, Intrinsic::invariant_start, ObjectPtr); + Function *TheFn = Intrinsic::getOrInsertDeclaration( + M, Intrinsic::invariant_start, ObjectPtr); return CreateCall(TheFn, Ops); } @@ -556,13 +558,13 @@ IRBuilderBase::CreateAssumption(Value *Cond, Value *Ops[] = { Cond }; Module *M = BB->getParent()->getParent(); - Function *FnAssume = Intrinsic::getDeclaration(M, Intrinsic::assume); + Function *FnAssume = Intrinsic::getOrInsertDeclaration(M, Intrinsic::assume); return CreateCall(FnAssume, Ops, OpBundles); } Instruction *IRBuilderBase::CreateNoAliasScopeDeclaration(Value *Scope) { Module *M = BB->getModule(); - auto *FnIntrinsic = Intrinsic::getDeclaration( + auto *FnIntrinsic = Intrinsic::getOrInsertDeclaration( M, Intrinsic::experimental_noalias_scope_decl, {}); return CreateCall(FnIntrinsic, {Scope}); } @@ -615,7 +617,7 @@ CallInst *IRBuilderBase::CreateMaskedIntrinsic(Intrinsic::ID Id, ArrayRef<Type *> OverloadedTypes, const Twine &Name) { Module *M = BB->getParent()->getParent(); - Function *TheFn = Intrinsic::getDeclaration(M, Id, OverloadedTypes); + Function *TheFn = Intrinsic::getOrInsertDeclaration(M, Id, OverloadedTypes); return CreateCall(TheFn, Ops, {}, Name); } @@ -765,9 +767,9 @@ static CallInst *CreateGCStatepointCallCommon( const Twine &Name) { Module *M = Builder->GetInsertBlock()->getParent()->getParent(); // Fill in the one generic type'd argument (the function is also vararg) - Function *FnStatepoint = - Intrinsic::getDeclaration(M, Intrinsic::experimental_gc_statepoint, - {ActualCallee.getCallee()->getType()}); + Function *FnStatepoint = Intrinsic::getOrInsertDeclaration( + M, Intrinsic::experimental_gc_statepoint, + {ActualCallee.getCallee()->getType()}); std::vector<Value *> Args = getStatepointArgs( *Builder, ID, NumPatchBytes, ActualCallee.getCallee(), Flags, CallArgs); @@ -820,9 +822,9 @@ static InvokeInst *CreateGCStatepointInvokeCommon( const Twine &Name) { Module *M = Builder->GetInsertBlock()->getParent()->getParent(); // Fill in the one generic type'd argument (the function is also vararg) - Function *FnStatepoint = - Intrinsic::getDeclaration(M, Intrinsic::experimental_gc_statepoint, - {ActualInvokee.getCallee()->getType()}); + Function *FnStatepoint = Intrinsic::getOrInsertDeclaration( + M, Intrinsic::experimental_gc_statepoint, + {ActualInvokee.getCallee()->getType()}); std::vector<Value *> Args = getStatepointArgs(*Builder, ID, NumPatchBytes, ActualInvokee.getCallee(), @@ -875,7 +877,7 @@ CallInst *IRBuilderBase::CreateGCResult(Instruction *Statepoint, Intrinsic::ID ID = Intrinsic::experimental_gc_result; Module *M = BB->getParent()->getParent(); Type *Types[] = {ResultType}; - Function *FnGCResult = Intrinsic::getDeclaration(M, ID, Types); + Function *FnGCResult = Intrinsic::getOrInsertDeclaration(M, ID, Types); Value *Args[] = {Statepoint}; return CreateCall(FnGCResult, Args, {}, Name); @@ -886,8 +888,8 @@ CallInst *IRBuilderBase::CreateGCRelocate(Instruction *Statepoint, Type *ResultType, const Twine &Name) { Module *M = BB->getParent()->getParent(); Type *Types[] = {ResultType}; - Function *FnGCRelocate = - Intrinsic::getDeclaration(M, Intrinsic::experimental_gc_relocate, Types); + Function *FnGCRelocate = Intrinsic::getOrInsertDeclaration( + M, Intrinsic::experimental_gc_relocate, Types); Value *Args[] = {Statepoint, getInt32(BaseOffset), getInt32(DerivedOffset)}; return CreateCall(FnGCRelocate, Args, {}, Name); @@ -897,7 +899,7 @@ CallInst *IRBuilderBase::CreateGCGetPointerBase(Value *DerivedPtr, const Twine &Name) { Module *M = BB->getParent()->getParent(); Type *PtrTy = DerivedPtr->getType(); - Function *FnGCFindBase = Intrinsic::getDeclaration( + Function *FnGCFindBase = Intrinsic::getOrInsertDeclaration( M, Intrinsic::experimental_gc_get_pointer_base, {PtrTy, PtrTy}); return CreateCall(FnGCFindBase, {DerivedPtr}, {}, Name); } @@ -906,7 +908,7 @@ CallInst *IRBuilderBase::CreateGCGetPointerOffset(Value *DerivedPtr, const Twine &Name) { Module *M = BB->getParent()->getParent(); Type *PtrTy = DerivedPtr->getType(); - Function *FnGCGetOffset = Intrinsic::getDeclaration( + Function *FnGCGetOffset = Intrinsic::getOrInsertDeclaration( M, Intrinsic::experimental_gc_get_pointer_offset, {PtrTy}); return CreateCall(FnGCGetOffset, {DerivedPtr}, {}, Name); } @@ -915,7 +917,7 @@ CallInst *IRBuilderBase::CreateUnaryIntrinsic(Intrinsic::ID ID, Value *V, Instruction *FMFSource, const Twine &Name) { Module *M = BB->getModule(); - Function *Fn = Intrinsic::getDeclaration(M, ID, {V->getType()}); + Function *Fn = Intrinsic::getOrInsertDeclaration(M, ID, {V->getType()}); return createCallHelper(Fn, {V}, Name, FMFSource); } @@ -923,7 +925,7 @@ Value *IRBuilderBase::CreateBinaryIntrinsic(Intrinsic::ID ID, Value *LHS, Value *RHS, Instruction *FMFSource, const Twine &Name) { Module *M = BB->getModule(); - Function *Fn = Intrinsic::getDeclaration(M, ID, { LHS->getType() }); + Function *Fn = Intrinsic::getOrInsertDeclaration(M, ID, {LHS->getType()}); if (Value *V = Folder.FoldBinaryIntrinsic(ID, LHS, RHS, Fn->getReturnType(), FMFSource)) return V; @@ -936,7 +938,7 @@ CallInst *IRBuilderBase::CreateIntrinsic(Intrinsic::ID ID, Instruction *FMFSource, const Twine &Name) { Module *M = BB->getModule(); - Function *Fn = Intrinsic::getDeclaration(M, ID, Types); + Function *Fn = Intrinsic::getOrInsertDeclaration(M, ID, Types); return createCallHelper(Fn, Args, Name, FMFSource); } @@ -963,7 +965,7 @@ CallInst *IRBuilderBase::CreateIntrinsic(Type *RetTy, Intrinsic::ID ID, "Wrong types for intrinsic!"); // TODO: Handle varargs intrinsics. - Function *Fn = Intrinsic::getDeclaration(M, ID, OverloadTys); + Function *Fn = Intrinsic::getOrInsertDeclaration(M, ID, OverloadTys); return createCallHelper(Fn, Args, Name, FMFSource); } @@ -1120,7 +1122,7 @@ Value *IRBuilderBase::CreateLaunderInvariantGroup(Value *Ptr) { "launder.invariant.group only applies to pointers."); auto *PtrType = Ptr->getType(); Module *M = BB->getParent()->getParent(); - Function *FnLaunderInvariantGroup = Intrinsic::getDeclaration( + Function *FnLaunderInvariantGroup = Intrinsic::getOrInsertDeclaration( M, Intrinsic::launder_invariant_group, {PtrType}); assert(FnLaunderInvariantGroup->getReturnType() == PtrType && @@ -1137,7 +1139,7 @@ Value *IRBuilderBase::CreateStripInvariantGroup(Value *Ptr) { auto *PtrType = Ptr->getType(); Module *M = BB->getParent()->getParent(); - Function *FnStripInvariantGroup = Intrinsic::getDeclaration( + Function *FnStripInvariantGroup = Intrinsic::getOrInsertDeclaration( M, Intrinsic::strip_invariant_group, {PtrType}); assert(FnStripInvariantGroup->getReturnType() == PtrType && @@ -1152,7 +1154,8 @@ Value *IRBuilderBase::CreateVectorReverse(Value *V, const Twine &Name) { auto *Ty = cast<VectorType>(V->getType()); if (isa<ScalableVectorType>(Ty)) { Module *M = BB->getParent()->getParent(); - Function *F = Intrinsic::getDeclaration(M, Intrinsic::vector_reverse, Ty); + Function *F = + Intrinsic::getOrInsertDeclaration(M, Intrinsic::vector_reverse, Ty); return Insert(CallInst::Create(F, V), Name); } // Keep the original behaviour for fixed vector @@ -1171,7 +1174,8 @@ Value *IRBuilderBase::CreateVectorSplice(Value *V1, Value *V2, int64_t Imm, if (auto *VTy = dyn_cast<ScalableVectorType>(V1->getType())) { Module *M = BB->getParent()->getParent(); - Function *F = Intrinsic::getDeclaration(M, Intrinsic::vector_splice, VTy); + Function *F = + Intrinsic::getOrInsertDeclaration(M, Intrinsic::vector_splice, VTy); Value *Ops[] = {V1, V2, getInt32(Imm)}; return Insert(CallInst::Create(F, Ops), Name); @@ -1225,7 +1229,7 @@ Value *IRBuilderBase::CreatePreserveArrayAccessIndex( Type *ResultType = GetElementPtrInst::getGEPReturnType(Base, IdxList); Module *M = BB->getParent()->getParent(); - Function *FnPreserveArrayAccessIndex = Intrinsic::getDeclaration( + Function *FnPreserveArrayAccessIndex = Intrinsic::getOrInsertDeclaration( M, Intrinsic::preserve_array_access_index, {ResultType, BaseType}); Value *DimV = getInt32(Dimension); @@ -1246,7 +1250,7 @@ Value *IRBuilderBase::CreatePreserveUnionAccessIndex( auto *BaseType = Base->getType(); Module *M = BB->getParent()->getParent(); - Function *FnPreserveUnionAccessIndex = Intrinsic::getDeclaration( + Function *FnPreserveUnionAccessIndex = Intrinsic::getOrInsertDeclaration( M, Intrinsic::preserve_union_access_index, {BaseType, BaseType}); Value *DIIndex = getInt32(FieldIndex); @@ -1271,7 +1275,7 @@ Value *IRBuilderBase::CreatePreserveStructAccessIndex( GetElementPtrInst::getGEPReturnType(Base, {Zero, GEPIndex}); Module *M = BB->getParent()->getParent(); - Function *FnPreserveStructAccessIndex = Intrinsic::getDeclaration( + Function *FnPreserveStructAccessIndex = Intrinsic::getOrInsertDeclaration( M, Intrinsic::preserve_struct_access_index, {ResultType, BaseType}); Value *DIIndex = getInt32(FieldIndex); @@ -1288,8 +1292,8 @@ Value *IRBuilderBase::CreatePreserveStructAccessIndex( Value *IRBuilderBase::createIsFPClass(Value *FPNum, unsigned Test) { ConstantInt *TestV = getInt32(Test); Module *M = BB->getParent()->getParent(); - Function *FnIsFPClass = - Intrinsic::getDeclaration(M, Intrinsic::is_fpclass, {FPNum->getType()}); + Function *FnIsFPClass = Intrinsic::getOrInsertDeclaration( + M, Intrinsic::is_fpclass, {FPNum->getType()}); return CreateCall(FnIsFPClass, {FPNum, TestV}); } diff --git a/llvm/lib/IR/IntrinsicInst.cpp b/llvm/lib/IR/IntrinsicInst.cpp index 0a6c93f..002bab8 100644 --- a/llvm/lib/IR/IntrinsicInst.cpp +++ b/llvm/lib/IR/IntrinsicInst.cpp @@ -629,9 +629,8 @@ bool VPIntrinsic::canIgnoreVectorLengthParam() const { return false; } -Function *VPIntrinsic::getDeclarationForParams(Module *M, Intrinsic::ID VPID, - Type *ReturnType, - ArrayRef<Value *> Params) { +Function *VPIntrinsic::getOrInsertDeclarationForParams( + Module *M, Intrinsic::ID VPID, Type *ReturnType, ArrayRef<Value *> Params) { assert(isVPIntrinsic(VPID) && "not a VP intrinsic"); Function *VPFunc; switch (VPID) { @@ -641,7 +640,7 @@ Function *VPIntrinsic::getDeclarationForParams(Module *M, Intrinsic::ID VPID, OverloadTy = Params[*VPReductionIntrinsic::getVectorParamPos(VPID)]->getType(); - VPFunc = Intrinsic::getDeclaration(M, VPID, OverloadTy); + VPFunc = Intrinsic::getOrInsertDeclaration(M, VPID, OverloadTy); break; } case Intrinsic::vp_trunc: @@ -658,43 +657,43 @@ Function *VPIntrinsic::getDeclarationForParams(Module *M, Intrinsic::ID VPID, case Intrinsic::vp_lrint: case Intrinsic::vp_llrint: case Intrinsic::vp_cttz_elts: - VPFunc = - Intrinsic::getDeclaration(M, VPID, {ReturnType, Params[0]->getType()}); + VPFunc = Intrinsic::getOrInsertDeclaration( + M, VPID, {ReturnType, Params[0]->getType()}); break; case Intrinsic::vp_is_fpclass: - VPFunc = Intrinsic::getDeclaration(M, VPID, {Params[0]->getType()}); + VPFunc = Intrinsic::getOrInsertDeclaration(M, VPID, {Params[0]->getType()}); break; case Intrinsic::vp_merge: case Intrinsic::vp_select: - VPFunc = Intrinsic::getDeclaration(M, VPID, {Params[1]->getType()}); + VPFunc = Intrinsic::getOrInsertDeclaration(M, VPID, {Params[1]->getType()}); break; case Intrinsic::vp_load: - VPFunc = Intrinsic::getDeclaration( + VPFunc = Intrinsic::getOrInsertDeclaration( M, VPID, {ReturnType, Params[0]->getType()}); break; case Intrinsic::experimental_vp_strided_load: - VPFunc = Intrinsic::getDeclaration( + VPFunc = Intrinsic::getOrInsertDeclaration( M, VPID, {ReturnType, Params[0]->getType(), Params[1]->getType()}); break; case Intrinsic::vp_gather: - VPFunc = Intrinsic::getDeclaration( + VPFunc = Intrinsic::getOrInsertDeclaration( M, VPID, {ReturnType, Params[0]->getType()}); break; case Intrinsic::vp_store: - VPFunc = Intrinsic::getDeclaration( + VPFunc = Intrinsic::getOrInsertDeclaration( M, VPID, {Params[0]->getType(), Params[1]->getType()}); break; case Intrinsic::experimental_vp_strided_store: - VPFunc = Intrinsic::getDeclaration( + VPFunc = Intrinsic::getOrInsertDeclaration( M, VPID, {Params[0]->getType(), Params[1]->getType(), Params[2]->getType()}); break; case Intrinsic::vp_scatter: - VPFunc = Intrinsic::getDeclaration( + VPFunc = Intrinsic::getOrInsertDeclaration( M, VPID, {Params[0]->getType(), Params[1]->getType()}); break; case Intrinsic::experimental_vp_splat: - VPFunc = Intrinsic::getDeclaration(M, VPID, ReturnType); + VPFunc = Intrinsic::getOrInsertDeclaration(M, VPID, ReturnType); break; } assert(VPFunc && "Could not declare VP intrinsic"); diff --git a/llvm/lib/IR/Intrinsics.cpp b/llvm/lib/IR/Intrinsics.cpp index ef26b19..ff8b4b7 100644 --- a/llvm/lib/IR/Intrinsics.cpp +++ b/llvm/lib/IR/Intrinsics.cpp @@ -713,7 +713,8 @@ Intrinsic::ID Intrinsic::lookupIntrinsicID(StringRef Name) { #include "llvm/IR/IntrinsicImpl.inc" #undef GET_INTRINSIC_ATTRIBUTES -Function *Intrinsic::getDeclaration(Module *M, ID id, ArrayRef<Type *> Tys) { +Function *Intrinsic::getOrInsertDeclaration(Module *M, ID id, + ArrayRef<Type *> Tys) { // There can never be multiple globals with the same name of different types, // because intrinsics must be a specific type. auto *FT = getType(M->getContext(), id, Tys); @@ -1078,7 +1079,7 @@ std::optional<Function *> Intrinsic::remangleIntrinsicFunction(Function *F) { // invalid and we'll get an error. ExistingGV->setName(WantedName + ".renamed"); } - return Intrinsic::getDeclaration(F->getParent(), ID, ArgTys); + return Intrinsic::getOrInsertDeclaration(F->getParent(), ID, ArgTys); }(); NewDecl->setCallingConv(F->getCallingConv()); diff --git a/llvm/lib/IR/Module.cpp b/llvm/lib/IR/Module.cpp index 704bc8d..ab48d3e 100644 --- a/llvm/lib/IR/Module.cpp +++ b/llvm/lib/IR/Module.cpp @@ -89,21 +89,22 @@ Module::~Module() { void Module::removeDebugIntrinsicDeclarations() { auto *DeclareIntrinsicFn = - Intrinsic::getDeclaration(this, Intrinsic::dbg_declare); + Intrinsic::getOrInsertDeclaration(this, Intrinsic::dbg_declare); assert((!isMaterialized() || DeclareIntrinsicFn->hasZeroLiveUses()) && "Debug declare intrinsic should have had uses removed."); DeclareIntrinsicFn->eraseFromParent(); auto *ValueIntrinsicFn = - Intrinsic::getDeclaration(this, Intrinsic::dbg_value); + Intrinsic::getOrInsertDeclaration(this, Intrinsic::dbg_value); assert((!isMaterialized() || ValueIntrinsicFn->hasZeroLiveUses()) && "Debug value intrinsic should have had uses removed."); ValueIntrinsicFn->eraseFromParent(); auto *AssignIntrinsicFn = - Intrinsic::getDeclaration(this, Intrinsic::dbg_assign); + Intrinsic::getOrInsertDeclaration(this, Intrinsic::dbg_assign); assert((!isMaterialized() || AssignIntrinsicFn->hasZeroLiveUses()) && "Debug assign intrinsic should have had uses removed."); AssignIntrinsicFn->eraseFromParent(); - auto *LabelntrinsicFn = Intrinsic::getDeclaration(this, Intrinsic::dbg_label); + auto *LabelntrinsicFn = + Intrinsic::getOrInsertDeclaration(this, Intrinsic::dbg_label); assert((!isMaterialized() || LabelntrinsicFn->hasZeroLiveUses()) && "Debug label intrinsic should have had uses removed."); LabelntrinsicFn->eraseFromParent(); diff --git a/llvm/lib/IR/VectorBuilder.cpp b/llvm/lib/IR/VectorBuilder.cpp index f42948b..737f49b 100644 --- a/llvm/lib/IR/VectorBuilder.cpp +++ b/llvm/lib/IR/VectorBuilder.cpp @@ -108,8 +108,8 @@ Value *VectorBuilder::createVectorInstructionImpl(Intrinsic::ID VPID, if (VLenPosOpt) IntrinParams[*VLenPosOpt] = &requestEVL(); - auto *VPDecl = VPIntrinsic::getDeclarationForParams(&getModule(), VPID, - ReturnTy, IntrinParams); + auto *VPDecl = VPIntrinsic::getOrInsertDeclarationForParams( + &getModule(), VPID, ReturnTy, IntrinParams); return Builder.CreateCall(VPDecl, IntrinParams, Name); } |