diff options
Diffstat (limited to 'llvm/lib/IR/AutoUpgrade.cpp')
| -rw-r--r-- | llvm/lib/IR/AutoUpgrade.cpp | 106 |
1 files changed, 49 insertions, 57 deletions
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index 6271385183eb..d73d1e9c20b3 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -583,8 +583,10 @@ static bool UpgradeIntrinsicFunction1(Function *F, Function *&NewFn) { // Can't use Intrinsic::getDeclaration here as the return types might // then only be structurally equal. FunctionType* fType = FunctionType::get(F->getReturnType(), Tys, false); + StringRef Suffix = + F->getContext().supportsTypedPointers() ? "p0i8" : "p0"; NewFn = Function::Create(fType, F->getLinkage(), F->getAddressSpace(), - "llvm." + Name + ".p0i8", F->getParent()); + "llvm." + Name + "." + Suffix, F->getParent()); return true; } static const Regex vstRegex("^arm\\.neon\\.vst([1234]|[234]lane)\\.v[a-z0-9]*$"); @@ -601,7 +603,7 @@ static bool UpgradeIntrinsicFunction1(Function *F, Function *&NewFn) { auto fArgs = F->getFunctionType()->params(); Type *Tys[] = {fArgs[0], fArgs[1]}; - if (Name.find("lane") == StringRef::npos) + if (!Name.contains("lane")) NewFn = Intrinsic::getDeclaration(F->getParent(), StoreInts[fArgs.size() - 3], Tys); else @@ -1273,7 +1275,7 @@ static Value *UpgradeX86BinaryIntrinsics(IRBuilder<> &Builder, CallInst &CI, Function *Intrin = Intrinsic::getDeclaration(CI.getModule(), IID, Ty); Value *Res = Builder.CreateCall(Intrin, {Op0, Op1}); - if (CI.getNumArgOperands() == 4) { // For masked intrinsics. + if (CI.arg_size() == 4) { // For masked intrinsics. Value *VecSrc = CI.getOperand(2); Value *Mask = CI.getOperand(3); Res = EmitX86Select(Builder, Mask, Res, VecSrc); @@ -1300,7 +1302,7 @@ static Value *upgradeX86Rotate(IRBuilder<> &Builder, CallInst &CI, Function *Intrin = Intrinsic::getDeclaration(CI.getModule(), IID, Ty); Value *Res = Builder.CreateCall(Intrin, {Src, Src, Amt}); - if (CI.getNumArgOperands() == 4) { // For masked intrinsics. + if (CI.arg_size() == 4) { // For masked intrinsics. Value *VecSrc = CI.getOperand(2); Value *Mask = CI.getOperand(3); Res = EmitX86Select(Builder, Mask, Res, VecSrc); @@ -1370,7 +1372,7 @@ static Value *upgradeX86ConcatShift(IRBuilder<> &Builder, CallInst &CI, Function *Intrin = Intrinsic::getDeclaration(CI.getModule(), IID, Ty); Value *Res = Builder.CreateCall(Intrin, {Op0, Op1, Amt}); - unsigned NumArgs = CI.getNumArgOperands(); + unsigned NumArgs = CI.arg_size(); if (NumArgs >= 4) { // For masked intrinsics. Value *VecSrc = NumArgs == 5 ? CI.getArgOperand(3) : ZeroMask ? ConstantAggregateZero::get(CI.getType()) : @@ -1431,7 +1433,7 @@ static Value *upgradeAbs(IRBuilder<> &Builder, CallInst &CI) { Value *Op0 = CI.getArgOperand(0); Function *F = Intrinsic::getDeclaration(CI.getModule(), Intrinsic::abs, Ty); Value *Res = Builder.CreateCall(F, {Op0, Builder.getInt1(false)}); - if (CI.getNumArgOperands() == 3) + if (CI.arg_size() == 3) Res = EmitX86Select(Builder, CI.getArgOperand(2), Res, CI.getArgOperand(1)); return Res; } @@ -1459,7 +1461,7 @@ static Value *upgradePMULDQ(IRBuilder<> &Builder, CallInst &CI, bool IsSigned) { Value *Res = Builder.CreateMul(LHS, RHS); - if (CI.getNumArgOperands() == 4) + if (CI.arg_size() == 4) Res = EmitX86Select(Builder, CI.getArgOperand(3), Res, CI.getArgOperand(2)); return Res; @@ -1514,7 +1516,7 @@ static Value *upgradeMaskedCompare(IRBuilder<> &Builder, CallInst &CI, Cmp = Builder.CreateICmp(Pred, Op0, CI.getArgOperand(1)); } - Value *Mask = CI.getArgOperand(CI.getNumArgOperands() - 1); + Value *Mask = CI.getArgOperand(CI.arg_size() - 1); return ApplyX86MaskOn1BitsVec(Builder, Cmp, Mask); } @@ -1779,13 +1781,12 @@ static bool upgradeAVX512MaskToSelect(StringRef Name, IRBuilder<> &Builder, } else return false; - SmallVector<Value *, 4> Args(CI.arg_operands().begin(), - CI.arg_operands().end()); + SmallVector<Value *, 4> Args(CI.args()); Args.pop_back(); Args.pop_back(); Rep = Builder.CreateCall(Intrinsic::getDeclaration(CI.getModule(), IID), Args); - unsigned NumArgs = CI.getNumArgOperands(); + unsigned NumArgs = CI.arg_size(); Rep = EmitX86Select(Builder, CI.getArgOperand(NumArgs - 1), Rep, CI.getArgOperand(NumArgs - 2)); return true; @@ -1964,7 +1965,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { CI->getType()), {CI->getArgOperand(0)}); } else if (IsX86 && (Name.startswith("avx512.mask.sqrt.p"))) { - if (CI->getNumArgOperands() == 4 && + if (CI->arg_size() == 4 && (!isa<ConstantInt>(CI->getArgOperand(3)) || cast<ConstantInt>(CI->getArgOperand(3))->getZExtValue() != 4)) { Intrinsic::ID IID = Name[18] == 's' ? Intrinsic::x86_avx512_sqrt_ps_512 @@ -2124,8 +2125,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { { CI->getOperand(0), CI->getArgOperand(1) }); Rep = ApplyX86MaskOn1BitsVec(Builder, Rep, CI->getArgOperand(2)); } else if (IsX86 && Name.startswith("avx512.cmp.p")) { - SmallVector<Value *, 4> Args(CI->arg_operands().begin(), - CI->arg_operands().end()); + SmallVector<Value *, 4> Args(CI->args()); Type *OpTy = Args[0]->getType(); unsigned VecWidth = OpTy->getPrimitiveSizeInBits(); unsigned EltWidth = OpTy->getScalarSizeInBits(); @@ -2257,7 +2257,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { bool IsUnsigned = (StringRef::npos != Name.find("cvtu")); if (IsPS2PD) Rep = Builder.CreateFPExt(Rep, DstTy, "cvtps2pd"); - else if (CI->getNumArgOperands() == 4 && + else if (CI->arg_size() == 4 && (!isa<ConstantInt>(CI->getArgOperand(3)) || cast<ConstantInt>(CI->getArgOperand(3))->getZExtValue() != 4)) { Intrinsic::ID IID = IsUnsigned ? Intrinsic::x86_avx512_uitofp_round @@ -2270,7 +2270,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { : Builder.CreateSIToFP(Rep, DstTy, "cvt"); } - if (CI->getNumArgOperands() >= 3) + if (CI->arg_size() >= 3) Rep = EmitX86Select(Builder, CI->getArgOperand(2), Rep, CI->getArgOperand(1)); } else if (IsX86 && (Name.startswith("avx512.mask.vcvtph2ps.") || @@ -2286,7 +2286,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { Rep = Builder.CreateBitCast( Rep, FixedVectorType::get(Type::getHalfTy(C), NumDstElts)); Rep = Builder.CreateFPExt(Rep, DstTy, "cvtph2ps"); - if (CI->getNumArgOperands() >= 3) + if (CI->arg_size() >= 3) Rep = EmitX86Select(Builder, CI->getArgOperand(2), Rep, CI->getArgOperand(1)); } else if (IsX86 && (Name.startswith("avx512.mask.loadu."))) { @@ -2353,7 +2353,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { llvm_unreachable("Unknown suffix"); unsigned Imm; - if (CI->getNumArgOperands() == 3) { + if (CI->arg_size() == 3) { Imm = cast<ConstantInt>(CI->getArgOperand(2))->getZExtValue(); } else { Name = Name.substr(9); // strip off "xop.vpcom" @@ -2417,7 +2417,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { EltTy->getPointerTo()); Value *Load = Builder.CreateLoad(EltTy, Cast); Type *I32Ty = Type::getInt32Ty(C); - Rep = UndefValue::get(VecTy); + Rep = PoisonValue::get(VecTy); for (unsigned I = 0; I < EltNum; ++I) Rep = Builder.CreateInsertElement(Rep, Load, ConstantInt::get(I32Ty, I)); @@ -2442,7 +2442,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { Rep = DoSext ? Builder.CreateSExt(SV, DstTy) : Builder.CreateZExt(SV, DstTy); // If there are 3 arguments, it's a masked intrinsic so we need a select. - if (CI->getNumArgOperands() == 3) + if (CI->arg_size() == 3) Rep = EmitX86Select(Builder, CI->getArgOperand(2), Rep, CI->getArgOperand(1)); } else if (Name == "avx512.mask.pmov.qd.256" || @@ -2518,7 +2518,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { ShuffleVectorInst::getShuffleMask(Constant::getNullValue(MaskTy), M); Rep = Builder.CreateShuffleVector(Op, M); - if (CI->getNumArgOperands() == 3) + if (CI->arg_size() == 3) Rep = EmitX86Select(Builder, CI->getArgOperand(2), Rep, CI->getArgOperand(1)); } else if (IsX86 && (Name.startswith("sse2.padds.") || @@ -2636,7 +2636,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { Rep = Builder.CreateShuffleVector(Op0, Rep, Idxs); // If the intrinsic has a mask operand, handle that. - if (CI->getNumArgOperands() == 5) + if (CI->arg_size() == 5) Rep = EmitX86Select(Builder, CI->getArgOperand(4), Rep, CI->getArgOperand(3)); } else if (IsX86 && (Name.startswith("avx.vextractf128.") || @@ -2661,7 +2661,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { Rep = Builder.CreateShuffleVector(Op0, Op0, Idxs); // If the intrinsic has a mask operand, handle that. - if (CI->getNumArgOperands() == 4) + if (CI->arg_size() == 4) Rep = EmitX86Select(Builder, CI->getArgOperand(3), Rep, CI->getArgOperand(2)); } else if (!IsX86 && Name == "stackprotectorcheck") { @@ -2679,7 +2679,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { Rep = Builder.CreateShuffleVector(Op0, Op0, Idxs); - if (CI->getNumArgOperands() == 4) + if (CI->arg_size() == 4) Rep = EmitX86Select(Builder, CI->getArgOperand(3), Rep, CI->getArgOperand(2)); } else if (IsX86 && (Name.startswith("avx.vperm2f128.") || @@ -2739,7 +2739,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { Rep = Builder.CreateShuffleVector(Op0, Op0, Idxs); - if (CI->getNumArgOperands() == 4) + if (CI->arg_size() == 4) Rep = EmitX86Select(Builder, CI->getArgOperand(3), Rep, CI->getArgOperand(2)); } else if (IsX86 && (Name == "sse2.pshufl.w" || @@ -2758,7 +2758,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { Rep = Builder.CreateShuffleVector(Op0, Op0, Idxs); - if (CI->getNumArgOperands() == 4) + if (CI->arg_size() == 4) Rep = EmitX86Select(Builder, CI->getArgOperand(3), Rep, CI->getArgOperand(2)); } else if (IsX86 && (Name == "sse2.pshufh.w" || @@ -2777,7 +2777,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { Rep = Builder.CreateShuffleVector(Op0, Op0, Idxs); - if (CI->getNumArgOperands() == 4) + if (CI->arg_size() == 4) Rep = EmitX86Select(Builder, CI->getArgOperand(3), Rep, CI->getArgOperand(2)); } else if (IsX86 && Name.startswith("avx512.mask.shuf.p")) { @@ -3346,7 +3346,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { if (NegAcc) C = Builder.CreateFNeg(C); - if (CI->getNumArgOperands() == 5 && + if (CI->arg_size() == 5 && (!isa<ConstantInt>(CI->getArgOperand(4)) || cast<ConstantInt>(CI->getArgOperand(4))->getZExtValue() != 4)) { Intrinsic::ID IID; @@ -3399,7 +3399,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { // Drop the "avx512.mask." to make it easier. Name = Name.drop_front(IsMask3 || IsMaskZ ? 13 : 12); bool IsSubAdd = Name[3] == 's'; - if (CI->getNumArgOperands() == 5) { + if (CI->arg_size() == 5) { Intrinsic::ID IID; // Check the character before ".512" in string. if (Name[Name.size()-5] == 's') @@ -3686,8 +3686,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { case Intrinsic::arm_neon_vst2lane: case Intrinsic::arm_neon_vst3lane: case Intrinsic::arm_neon_vst4lane: { - SmallVector<Value *, 4> Args(CI->arg_operands().begin(), - CI->arg_operands().end()); + SmallVector<Value *, 4> Args(CI->args()); NewCall = Builder.CreateCall(NewFn, Args); break; } @@ -3701,14 +3700,14 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { case Intrinsic::aarch64_neon_bfmlalb: case Intrinsic::aarch64_neon_bfmlalt: { SmallVector<Value *, 3> Args; - assert(CI->getNumArgOperands() == 3 && + assert(CI->arg_size() == 3 && "Mismatch between function args and call args"); size_t OperandWidth = CI->getArgOperand(1)->getType()->getPrimitiveSizeInBits(); assert((OperandWidth == 64 || OperandWidth == 128) && "Unexpected operand width"); Type *NewTy = FixedVectorType::get(Type::getBFloatTy(C), OperandWidth / 16); - auto Iter = CI->arg_operands().begin(); + auto Iter = CI->args().begin(); Args.push_back(*Iter++); Args.push_back(Builder.CreateBitCast(*Iter++, NewTy)); Args.push_back(Builder.CreateBitCast(*Iter++, NewTy)); @@ -3722,18 +3721,17 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { case Intrinsic::ctlz: case Intrinsic::cttz: - assert(CI->getNumArgOperands() == 1 && + assert(CI->arg_size() == 1 && "Mismatch between function args and call args"); NewCall = Builder.CreateCall(NewFn, {CI->getArgOperand(0), Builder.getFalse()}); break; case Intrinsic::objectsize: { - Value *NullIsUnknownSize = CI->getNumArgOperands() == 2 - ? Builder.getFalse() - : CI->getArgOperand(2); + Value *NullIsUnknownSize = + CI->arg_size() == 2 ? Builder.getFalse() : CI->getArgOperand(2); Value *Dynamic = - CI->getNumArgOperands() < 4 ? Builder.getFalse() : CI->getArgOperand(3); + CI->arg_size() < 4 ? Builder.getFalse() : CI->getArgOperand(3); NewCall = Builder.CreateCall( NewFn, {CI->getArgOperand(0), CI->getArgOperand(1), NullIsUnknownSize, Dynamic}); break; @@ -3749,7 +3747,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { case Intrinsic::dbg_value: // Upgrade from the old version that had an extra offset argument. - assert(CI->getNumArgOperands() == 4); + assert(CI->arg_size() == 4); // Drop nonzero offsets instead of attempting to upgrade them. if (auto *Offset = dyn_cast_or_null<Constant>(CI->getArgOperand(1))) if (Offset->isZeroValue()) { @@ -3763,7 +3761,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { case Intrinsic::ptr_annotation: // Upgrade from versions that lacked the annotation attribute argument. - assert(CI->getNumArgOperands() == 4 && + assert(CI->arg_size() == 4 && "Before LLVM 12.0 this intrinsic took four arguments"); // Create a new call with an added null annotation attribute argument. NewCall = Builder.CreateCall( @@ -3777,7 +3775,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { case Intrinsic::var_annotation: // Upgrade from versions that lacked the annotation attribute argument. - assert(CI->getNumArgOperands() == 4 && + assert(CI->arg_size() == 4 && "Before LLVM 12.0 this intrinsic took four arguments"); // Create a new call with an added null annotation attribute argument. NewCall = Builder.CreateCall( @@ -3796,8 +3794,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { case Intrinsic::x86_xop_vpermil2ps: case Intrinsic::x86_xop_vpermil2pd_256: case Intrinsic::x86_xop_vpermil2ps_256: { - SmallVector<Value *, 4> Args(CI->arg_operands().begin(), - CI->arg_operands().end()); + SmallVector<Value *, 4> Args(CI->args()); VectorType *FltIdxTy = cast<VectorType>(Args[2]->getType()); VectorType *IntIdxTy = VectorType::getInteger(FltIdxTy); Args[2] = Builder.CreateBitCast(Args[2], IntIdxTy); @@ -3858,8 +3855,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { case Intrinsic::x86_avx2_mpsadbw: { // Need to truncate the last argument from i32 to i8 -- this argument models // an inherently 8-bit immediate operand to these x86 instructions. - SmallVector<Value *, 4> Args(CI->arg_operands().begin(), - CI->arg_operands().end()); + SmallVector<Value *, 4> Args(CI->args()); // Replace the last argument with a trunc. Args.back() = Builder.CreateTrunc(Args.back(), Type::getInt8Ty(C), "trunc"); @@ -3873,8 +3869,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { case Intrinsic::x86_avx512_mask_cmp_ps_128: case Intrinsic::x86_avx512_mask_cmp_ps_256: case Intrinsic::x86_avx512_mask_cmp_ps_512: { - SmallVector<Value *, 4> Args(CI->arg_operands().begin(), - CI->arg_operands().end()); + SmallVector<Value *, 4> Args(CI->args()); unsigned NumElts = cast<FixedVectorType>(Args[0]->getType())->getNumElements(); Args[3] = getX86MaskVec(Builder, Args[3], NumElts); @@ -3895,8 +3890,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { case Intrinsic::invariant_start: case Intrinsic::invariant_end: { - SmallVector<Value *, 4> Args(CI->arg_operands().begin(), - CI->arg_operands().end()); + SmallVector<Value *, 4> Args(CI->args()); NewCall = Builder.CreateCall(NewFn, Args); break; } @@ -3904,8 +3898,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { case Intrinsic::masked_store: case Intrinsic::masked_gather: case Intrinsic::masked_scatter: { - SmallVector<Value *, 4> Args(CI->arg_operands().begin(), - CI->arg_operands().end()); + SmallVector<Value *, 4> Args(CI->args()); NewCall = Builder.CreateCall(NewFn, Args); NewCall->copyMetadata(*CI); break; @@ -3921,7 +3914,7 @@ void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { // @llvm.memset...(i8*, i8, i[32|64], i32, i1) // -> @llvm.memset...(i8*, i8, i[32|64], i1) // Note: i8*'s in the above can be any pointer type - if (CI->getNumArgOperands() != 5) { + if (CI->arg_size() != 5) { DefaultCase(); return; } @@ -4111,7 +4104,7 @@ void llvm::UpgradeARCRuntime(Module &M) { bool InvalidCast = false; - for (unsigned I = 0, E = CI->getNumArgOperands(); I != E; ++I) { + for (unsigned I = 0, E = CI->arg_size(); I != E; ++I) { Value *Arg = CI->getArgOperand(I); // Bitcast argument to the parameter type of the new function if it's @@ -4361,8 +4354,8 @@ struct StrictFPUpgradeVisitor : public InstVisitor<StrictFPUpgradeVisitor> { return; // If we get here, the caller doesn't have the strictfp attribute // but this callsite does. Replace the strictfp attribute with nobuiltin. - Call.removeAttribute(AttributeList::FunctionIndex, Attribute::StrictFP); - Call.addAttribute(AttributeList::FunctionIndex, Attribute::NoBuiltin); + Call.removeFnAttr(Attribute::StrictFP); + Call.addFnAttr(Attribute::NoBuiltin); } }; } // namespace @@ -4383,8 +4376,7 @@ void llvm::UpgradeFunctionAttributes(Function &F) { } // Remove all incompatibile attributes from function. - F.removeAttributes(AttributeList::ReturnIndex, - AttributeFuncs::typeIncompatible(F.getReturnType())); + F.removeRetAttrs(AttributeFuncs::typeIncompatible(F.getReturnType())); for (auto &Arg : F.args()) Arg.removeAttrs(AttributeFuncs::typeIncompatible(Arg.getType())); } |
