[llvm] Revert [IR] Do not inherit ABI attributes from the callee (PR #222384)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 9 09:52:41 PDT 2026
https://github.com/nikic created https://github.com/llvm/llvm-project/pull/222384
Reverts #207173, plus #221892 due to a merge conflict.
Apparently we have some issues with call-site zeroext/signext on libcalls, see https://github.com/llvm/llvm-project/pull/207173#issuecomment-5604972674.
>From 006e5f8d503ef7c9f52063c6eb64565d989c5a49 Mon Sep 17 00:00:00 2001
From: Nikita Popov <nikita.ppv at gmail.com>
Date: Wed, 9 Sep 2026 18:50:16 +0200
Subject: [PATCH 1/2] Revert "[GlobalISel] Avoid unnecessary call setup work
(NFC) (#221892)"
This reverts commit a6aa47a28dcffa1197fd42cd5b61cc8d5693e0f7.
---
.../llvm/CodeGen/GlobalISel/CallLowering.h | 8 ++++
llvm/lib/CodeGen/GlobalISel/CallLowering.cpp | 40 ++++++++++++-------
2 files changed, 33 insertions(+), 15 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h b/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h
index 60dc219387cbc..110f40a817770 100644
--- a/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h
+++ b/llvm/include/llvm/CodeGen/GlobalISel/CallLowering.h
@@ -364,6 +364,14 @@ class LLVM_ABI CallLowering {
return static_cast<const XXXTargetLowering *>(TLI);
}
+ /// \returns Flags corresponding to the attributes on the \p ArgIdx-th
+ /// parameter of \p Call.
+ ISD::ArgFlagsTy getAttributesForArgIdx(const CallBase &Call,
+ unsigned ArgIdx) const;
+
+ /// \returns Flags corresponding to the attributes on the return from \p Call.
+ ISD::ArgFlagsTy getAttributesForReturn(const CallBase &Call) const;
+
/// Adds flags to \p Flags based off of the attributes in \p Attrs.
/// \p OpIdx is the index in \p Attrs to add flags from.
void addArgFlagsFromAttributes(ISD::ArgFlagsTy &Flags,
diff --git a/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp b/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
index f8193fdd86a78..eedb70b6ac522 100644
--- a/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
@@ -99,6 +99,26 @@ static void addFlagsFromAttrSet(ISD::ArgFlagsTy &Flags, AttributeSet Attrs) {
}
}
+ISD::ArgFlagsTy CallLowering::getAttributesForArgIdx(const CallBase &Call,
+ unsigned ArgIdx) const {
+ ISD::ArgFlagsTy Flags;
+ const AttributeList &Attrs = Call.getAttributes();
+ addFlagsFromAttrSet(Flags, Attrs.getParamAttrs(ArgIdx));
+ if (const Function *F = Call.getCalledFunction()) {
+ // "returned" is not an ABI attribute, so we can inherit it from the callee.
+ if (F->hasParamAttribute(ArgIdx, Attribute::Returned))
+ Flags.setReturned();
+ }
+ return Flags;
+}
+
+ISD::ArgFlagsTy
+CallLowering::getAttributesForReturn(const CallBase &Call) const {
+ ISD::ArgFlagsTy Flags;
+ addFlagsFromAttrSet(Flags, Call.getAttributes().getRetAttrs());
+ return Flags;
+}
+
void CallLowering::addArgFlagsFromAttributes(ISD::ArgFlagsTy &Flags,
const AttributeList &Attrs,
unsigned OpIdx) const {
@@ -125,15 +145,10 @@ bool CallLowering::lowerCall(MachineIRBuilder &MIRBuilder, const CallBase &CB,
CallingConv::ID CallConv = CB.getCallingConv();
Type *RetTy = CB.getType();
bool IsVarArg = CB.getFunctionType()->isVarArg();
- const Function *Callee = CB.getCalledFunction();
- if (RetTy->isVoidTy()) {
- Info.CanLowerReturn = true;
- } else {
- SmallVector<BaseArgInfo, 4> SplitArgs;
- getReturnInfo(CallConv, RetTy, CB.getAttributes(), SplitArgs, DL);
- Info.CanLowerReturn = canLowerReturn(MF, CallConv, SplitArgs, IsVarArg);
- }
+ SmallVector<BaseArgInfo, 4> SplitArgs;
+ getReturnInfo(CallConv, RetTy, CB.getAttributes(), SplitArgs, DL);
+ Info.CanLowerReturn = canLowerReturn(MF, CallConv, SplitArgs, IsVarArg);
Info.IsConvergent = CB.isConvergent();
@@ -152,11 +167,7 @@ bool CallLowering::lowerCall(MachineIRBuilder &MIRBuilder, const CallBase &CB,
unsigned i = 0;
unsigned NumFixedArgs = CB.getFunctionType()->getNumParams();
for (const auto &Arg : CB.args()) {
- ISD::ArgFlagsTy Flags;
- // "returned" is not an ABI attribute, so we can inherit it from the callee.
- if (Callee && Callee->hasParamAttribute(i, Attribute::Returned))
- Flags.setReturned();
- ArgInfo OrigArg{ArgRegs[i], *Arg.get(), i, Flags};
+ ArgInfo OrigArg{ArgRegs[i], *Arg.get(), i, getAttributesForArgIdx(CB, i)};
setArgFlags(OrigArg, i + AttributeList::FirstArgIndex, DL, CB);
if (i >= NumFixedArgs)
OrigArg.Flags[0].setVarArg();
@@ -200,8 +211,7 @@ bool CallLowering::lowerCall(MachineIRBuilder &MIRBuilder, const CallBase &CB,
Register ReturnHintAlignReg;
Align ReturnHintAlign;
- ISD::ArgFlagsTy RetFlags;
- Info.OrigRet = ArgInfo{ResRegs, RetTy, 0, RetFlags};
+ Info.OrigRet = ArgInfo{ResRegs, RetTy, 0, getAttributesForReturn(CB)};
if (!Info.OrigRet.Ty->isVoidTy()) {
setArgFlags(Info.OrigRet, AttributeList::ReturnIndex, DL, CB);
>From de00b9a06e2c4201ab694a33ae57e0e830a81dbe Mon Sep 17 00:00:00 2001
From: Nikita Popov <nikita.ppv at gmail.com>
Date: Wed, 9 Sep 2026 18:50:31 +0200
Subject: [PATCH 2/2] Revert "[IR] Do not inherit ABI attributes from the
callee (#207173)"
This reverts commit cdd1900816f625eb1f38a6e755c49ccadec56209.
---
llvm/include/llvm/CodeGen/FastISel.h | 12 ++--
llvm/include/llvm/CodeGen/TargetLowering.h | 6 +-
llvm/include/llvm/IR/Attributes.h | 3 -
llvm/include/llvm/IR/Attributes.td | 37 +++++-----
llvm/include/llvm/IR/InstrTypes.h | 72 ++++++++++---------
llvm/lib/Analysis/Lint.cpp | 11 ++-
llvm/lib/CodeGen/GlobalISel/CallLowering.cpp | 9 ++-
.../SelectionDAG/FunctionLoweringInfo.cpp | 4 +-
.../CodeGen/SelectionDAG/TargetLowering.cpp | 24 +++----
llvm/lib/CodeGen/TypePromotion.cpp | 4 +-
llvm/lib/IR/Attributes.cpp | 5 --
llvm/lib/IR/Instructions.cpp | 1 -
llvm/lib/IR/Verifier.cpp | 8 +--
llvm/lib/IR/VerifierAMDGPU.cpp | 8 +--
.../Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp | 4 +-
llvm/lib/Target/ARM/ARMFastISel.cpp | 16 ++---
.../WebAssembly/WebAssemblyFastISel.cpp | 4 +-
llvm/lib/Target/X86/X86FastISel.cpp | 4 +-
llvm/lib/Target/X86/X86ISelLoweringCall.cpp | 2 +-
llvm/lib/Transforms/IPO/ExpandVariadics.cpp | 4 +-
.../Instrumentation/MemorySanitizer.cpp | 4 +-
.../Transforms/Utils/CallPromotionUtils.cpp | 2 +-
llvm/test/Analysis/BasicAA/call-attrs.ll | 4 +-
.../call-translator-tail-call-sret.ll | 12 ++--
.../AArch64/GlobalISel/call-translator.ll | 16 ++---
.../CodeGen/AArch64/GlobalISel/swifterror.ll | 4 +-
.../CodeGen/AArch64/GlobalISel/swiftself.ll | 4 +-
.../irtranslator-call-return-values.ll | 12 ++--
.../GlobalISel/irtranslator-call-sret.ll | 2 +-
.../AMDGPU/GlobalISel/irtranslator-call.ll | 2 +-
.../test/CodeGen/AMDGPU/fncall-implicitdef.ll | 2 +-
.../CodeGen/AMDGPU/swdev504645-global-fold.ll | 2 +-
.../AMDGPU/waterfall-call-inreg-agpr.ll | 2 +-
llvm/test/CodeGen/ARM/returned-ext.ll | 4 +-
llvm/test/CodeGen/ARM/struct-byval-loop.ll | 4 +-
llvm/test/CodeGen/M68k/multiple-return.ll | 2 +-
llvm/test/CodeGen/NVPTX/forward-ld-param.ll | 2 +-
llvm/test/CodeGen/RISCV/rvv/shrinkwrap.ll | 4 +-
llvm/test/CodeGen/RISCV/shrinkwrap.ll | 14 ++--
llvm/test/CodeGen/SPARC/64abi.ll | 8 +--
llvm/test/CodeGen/SystemZ/args-14.ll | 5 +-
llvm/test/CodeGen/SystemZ/call-zos-01.ll | 8 +--
llvm/test/CodeGen/VE/Scalar/call.ll | 2 +-
llvm/test/CodeGen/VE/Scalar/va_callee.ll | 24 +++----
llvm/test/CodeGen/VE/Vector/fastcc_caller.ll | 2 +-
.../WebAssembly/signext-zeroext-callsite.ll | 26 +++++--
llvm/test/CodeGen/X86/bool-zext.ll | 2 +-
llvm/test/CodeGen/X86/return-ext.ll | 6 +-
.../ThreadSanitizer/tsan_basic.ll | 2 +-
.../Transforms/DeadArgElim/deadexternal.ll | 2 +-
.../Inline/access-attributes-prop.ll | 6 +-
.../Transforms/PhaseOrdering/pr64289-tce.ll | 2 +-
.../test/Transforms/SROA/readonlynocapture.ll | 4 +-
.../hoist-sink-swifterror-store.ll | 14 ++--
llvm/unittests/IR/AttributesTest.cpp | 10 +--
55 files changed, 233 insertions(+), 226 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/FastISel.h b/llvm/include/llvm/CodeGen/FastISel.h
index 04ad564843116..02d2059d54785 100644
--- a/llvm/include/llvm/CodeGen/FastISel.h
+++ b/llvm/include/llvm/CodeGen/FastISel.h
@@ -108,12 +108,12 @@ class LLVM_ABI FastISel {
RetTy = ResultTy;
Callee = Target;
- IsInReg = Call.hasABIRetAttr(Attribute::InReg);
+ IsInReg = Call.hasRetAttr(Attribute::InReg);
DoesNotReturn = Call.doesNotReturn();
IsVarArg = FuncTy->isVarArg();
IsReturnValueUsed = !Call.use_empty();
- RetSExt = Call.hasABIRetAttr(Attribute::SExt);
- RetZExt = Call.hasABIRetAttr(Attribute::ZExt);
+ RetSExt = Call.hasRetAttr(Attribute::SExt);
+ RetZExt = Call.hasRetAttr(Attribute::ZExt);
CallConv = Call.getCallingConv();
Args = std::move(ArgsList);
@@ -132,12 +132,12 @@ class LLVM_ABI FastISel {
Callee = Call.getCalledOperand();
Symbol = Target;
- IsInReg = Call.hasABIRetAttr(Attribute::InReg);
+ IsInReg = Call.hasRetAttr(Attribute::InReg);
DoesNotReturn = Call.doesNotReturn();
IsVarArg = FuncTy->isVarArg();
IsReturnValueUsed = !Call.use_empty();
- RetSExt = Call.hasABIRetAttr(Attribute::SExt);
- RetZExt = Call.hasABIRetAttr(Attribute::ZExt);
+ RetSExt = Call.hasRetAttr(Attribute::SExt);
+ RetZExt = Call.hasRetAttr(Attribute::ZExt);
CallConv = Call.getCallingConv();
Args = std::move(ArgsList);
diff --git a/llvm/include/llvm/CodeGen/TargetLowering.h b/llvm/include/llvm/CodeGen/TargetLowering.h
index 71a8438fd4999..69f5e0e4e3011 100644
--- a/llvm/include/llvm/CodeGen/TargetLowering.h
+++ b/llvm/include/llvm/CodeGen/TargetLowering.h
@@ -5060,14 +5060,14 @@ class LLVM_ABI TargetLowering : public TargetLoweringBase {
const CallBase &Call) {
RetTy = OrigRetTy = ResultType;
- IsInReg = Call.hasABIRetAttr(Attribute::InReg);
+ IsInReg = Call.hasRetAttr(Attribute::InReg);
DoesNotReturn =
Call.doesNotReturn() ||
(!isa<InvokeInst>(Call) && isa<UnreachableInst>(Call.getNextNode()));
IsVarArg = FTy->isVarArg();
IsReturnValueUsed = !Call.use_empty();
- RetSExt = Call.hasABIRetAttr(Attribute::SExt);
- RetZExt = Call.hasABIRetAttr(Attribute::ZExt);
+ RetSExt = Call.hasRetAttr(Attribute::SExt);
+ RetZExt = Call.hasRetAttr(Attribute::ZExt);
NoMerge = Call.hasFnAttr(Attribute::NoMerge);
Callee = Target;
diff --git a/llvm/include/llvm/IR/Attributes.h b/llvm/include/llvm/IR/Attributes.h
index d9ab56cdcc1f6..f8185c76dfb5c 100644
--- a/llvm/include/llvm/IR/Attributes.h
+++ b/llvm/include/llvm/IR/Attributes.h
@@ -162,9 +162,6 @@ class Attribute {
LLVM_ABI static bool intersectWithMin(AttrKind Kind);
LLVM_ABI static bool intersectWithCustom(AttrKind Kind);
- /// Whether this is an ABI attribute (for returns or arguments).
- LLVM_ABI static bool isABIAttr(AttrKind Kind);
-
private:
AttributeImpl *pImpl = nullptr;
diff --git a/llvm/include/llvm/IR/Attributes.td b/llvm/include/llvm/IR/Attributes.td
index a649430424b9e..ea523cad69cd5 100644
--- a/llvm/include/llvm/IR/Attributes.td
+++ b/llvm/include/llvm/IR/Attributes.td
@@ -22,8 +22,7 @@ def ParamAttr : AttrProperty;
/// Can be used as return attribute.
def RetAttr : AttrProperty;
-/// This is an ABI-affecting attribute.
-def ABIAttr : AttrProperty;
+
/// Intersection rules. Used for example in sinking/hoisting two
/// callbases to find a set of attributes that apply to both.
@@ -46,6 +45,8 @@ def IntersectMin : AttrProperty;
/// When intersecting rely on some specially defined code.
def IntersectCustom : AttrProperty;
+
+
/// Attribute base class.
class Attr<string S, AttrProperty I, list<AttrProperty> P> {
// String representation of this attribute in the IR.
@@ -102,10 +103,10 @@ def AlwaysInline : EnumAttr<"alwaysinline", IntersectPreserve, [FnAttr]>;
def Builtin : EnumAttr<"builtin", IntersectPreserve, [FnAttr]>;
/// Pass structure by value.
-def ByVal : TypeAttr<"byval", IntersectPreserve, [ParamAttr, ABIAttr]>;
+def ByVal : TypeAttr<"byval", IntersectPreserve, [ParamAttr]>;
/// Mark in-memory ABI type.
-def ByRef : TypeAttr<"byref", IntersectPreserve, [ParamAttr, ABIAttr]>;
+def ByRef : TypeAttr<"byref", IntersectPreserve, [ParamAttr]>;
/// Parameter or return value may not contain uninitialized or poison bits.
def NoUndef : EnumAttr<"noundef", IntersectAnd, [ParamAttr, RetAttr]>;
@@ -144,7 +145,7 @@ def FnRetThunkExtern : EnumAttr<"fn_ret_thunk_extern", IntersectPreserve, [FnAtt
def HybridPatchable : EnumAttr<"hybrid_patchable", IntersectPreserve, [FnAttr]>;
/// Pass structure in an alloca.
-def InAlloca : TypeAttr<"inalloca", IntersectPreserve, [ParamAttr, ABIAttr]>;
+def InAlloca : TypeAttr<"inalloca", IntersectPreserve, [ParamAttr]>;
/// Pointer argument memory is initialized.
def Initializes : ConstantRangeListAttr<"initializes", IntersectPreserve, [ParamAttr]>;
@@ -153,7 +154,7 @@ def Initializes : ConstantRangeListAttr<"initializes", IntersectPreserve, [Param
def InlineHint : EnumAttr<"inlinehint", IntersectAnd, [FnAttr]>;
/// Force argument to be passed in register.
-def InReg : EnumAttr<"inreg", IntersectPreserve, [ParamAttr, RetAttr, ABIAttr]>;
+def InReg : EnumAttr<"inreg", IntersectPreserve, [ParamAttr, RetAttr]>;
/// Build jump-instruction tables and replace refs.
def JumpTable : EnumAttr<"jumptable", IntersectPreserve, [FnAttr]>;
@@ -171,7 +172,7 @@ def MinSize : EnumAttr<"minsize", IntersectPreserve, [FnAttr]>;
def Naked : EnumAttr<"naked", IntersectPreserve, [FnAttr]>;
/// Nested function static chain.
-def Nest : EnumAttr<"nest", IntersectPreserve, [ParamAttr, ABIAttr]>;
+def Nest : EnumAttr<"nest", IntersectPreserve, [ParamAttr]>;
/// Considered to not alias after call.
def NoAlias : EnumAttr<"noalias", IntersectAnd, [ParamAttr, RetAttr]>;
@@ -197,7 +198,7 @@ def NoDivergenceSource : EnumAttr<"nodivergencesource", IntersectAnd, [FnAttr]>;
def NoDuplicate : EnumAttr<"noduplicate", IntersectPreserve, [FnAttr]>;
/// No extension needed before/after call (high bits are undefined).
-def NoExt : EnumAttr<"noext", IntersectPreserve, [ParamAttr, RetAttr, ABIAttr]>;
+def NoExt : EnumAttr<"noext", IntersectPreserve, [ParamAttr, RetAttr]>;
/// Function does not deallocate memory.
/// Argument cannot be freed based on the argument pointer.
@@ -280,8 +281,7 @@ def OptimizeForSize : EnumAttr<"optsize", IntersectPreserve, [FnAttr]>;
def OptimizeNone : EnumAttr<"optnone", IntersectPreserve, [FnAttr]>;
/// Similar to byval but without a copy.
-def Preallocated : TypeAttr<"preallocated", IntersectPreserve,
- [FnAttr, ParamAttr, ABIAttr]>;
+def Preallocated : TypeAttr<"preallocated", IntersectPreserve, [FnAttr, ParamAttr]>;
/// Parameter or return value is within the specified range.
def Range : ConstantRangeAttr<"range", IntersectCustom, [ParamAttr, RetAttr]>;
@@ -308,13 +308,11 @@ def SafeStack : EnumAttr<"safestack", IntersectPreserve, [FnAttr]>;
def ShadowCallStack : EnumAttr<"shadowcallstack", IntersectPreserve, [FnAttr]>;
/// Sign extended before/after call.
-def SExt : EnumAttr<"signext", IntersectPreserve,
- [ParamAttr, RetAttr, ABIAttr]>;
+def SExt : EnumAttr<"signext", IntersectPreserve, [ParamAttr, RetAttr]>;
/// Alignment of stack for function (3 bits) stored as log2 of alignment with
/// +1 bias 0 means unaligned (different from alignstack=(1)).
-def StackAlignment : IntAttr<"alignstack", IntersectPreserve,
- [FnAttr, ParamAttr, RetAttr, ABIAttr]>;
+def StackAlignment : IntAttr<"alignstack", IntersectPreserve, [FnAttr, ParamAttr, RetAttr]>;
/// Function can be speculated.
def Speculatable : EnumAttr<"speculatable", IntersectAnd, [FnAttr]>;
@@ -332,7 +330,7 @@ def StackProtectStrong : EnumAttr<"sspstrong", IntersectPreserve, [FnAttr]>;
def StrictFP : EnumAttr<"strictfp", IntersectPreserve, [FnAttr]>;
/// Hidden pointer to structure to return.
-def StructRet : TypeAttr<"sret", IntersectPreserve, [ParamAttr, ABIAttr]>;
+def StructRet : TypeAttr<"sret", IntersectPreserve, [ParamAttr]>;
/// AddressSanitizer is on.
def SanitizeAddress : EnumAttr<"sanitize_address", IntersectPreserve, [FnAttr]>;
@@ -376,13 +374,13 @@ def SpeculativeLoadHardening : EnumAttr<"speculative_load_hardening",
[FnAttr]>;
/// Argument is swift error.
-def SwiftError : EnumAttr<"swifterror", IntersectPreserve, [ParamAttr, ABIAttr]>;
+def SwiftError : EnumAttr<"swifterror", IntersectPreserve, [ParamAttr]>;
/// Argument is swift self/context.
-def SwiftSelf : EnumAttr<"swiftself", IntersectPreserve, [ParamAttr, ABIAttr]>;
+def SwiftSelf : EnumAttr<"swiftself", IntersectPreserve, [ParamAttr]>;
/// Argument is swift async context.
-def SwiftAsync : EnumAttr<"swiftasync", IntersectPreserve, [ParamAttr, ABIAttr]>;
+def SwiftAsync : EnumAttr<"swiftasync", IntersectPreserve, [ParamAttr]>;
/// Function must be in a unwind table.
def UWTable : IntAttr<"uwtable", IntersectPreserve, [FnAttr]>;
@@ -400,8 +398,7 @@ def Writable : EnumAttr<"writable", IntersectAnd, [ParamAttr]>;
def WriteOnly : EnumAttr<"writeonly", IntersectAnd, [ParamAttr]>;
/// Zero extended before/after call.
-def ZExt : EnumAttr<"zeroext", IntersectPreserve,
- [ParamAttr, RetAttr, ABIAttr]>;
+def ZExt : EnumAttr<"zeroext", IntersectPreserve, [ParamAttr, RetAttr]>;
/// Function is required to make Forward Progress.
def MustProgress : EnumAttr<"mustprogress", IntersectAnd, [FnAttr]>;
diff --git a/llvm/include/llvm/IR/InstrTypes.h b/llvm/include/llvm/IR/InstrTypes.h
index 8d3ff9c996daa..5f7df6a4eb6f8 100644
--- a/llvm/include/llvm/IR/InstrTypes.h
+++ b/llvm/include/llvm/IR/InstrTypes.h
@@ -1658,7 +1658,6 @@ class CallBase : public Instruction {
/// Determine whether the return value has the given attribute.
bool hasRetAttr(Attribute::AttrKind Kind) const {
- assert(!Attribute::isABIAttr(Kind) && "Use hasABIRetAttr() instead");
return hasRetAttrImpl(Kind);
}
/// Determine whether the return value has the given attribute.
@@ -1688,22 +1687,6 @@ class CallBase : public Instruction {
LLVM_ABI bool paramHasNonNullAttr(unsigned ArgNo,
bool AllowUndefOrPoison) const;
- /// Determine whether the argument has the given ABI attribute. As this is
- /// an ABI attribute, only check the call-site and do not inherit from the
- /// callee.
- bool hasABIParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) const {
- assert(Attribute::isABIAttr(Kind) && "Expected ABI attribute");
- return Attrs.hasParamAttr(ArgNo, Kind);
- }
-
- /// Determine whether the return value has the given ABI attribute. As this
- /// is an ABI attribute, only check the call-site and do not inherit from the
- /// callee.
- bool hasABIRetAttr(Attribute::AttrKind Kind) const {
- assert(Attribute::isABIAttr(Kind) && "Expected ABI attribute");
- return Attrs.hasRetAttr(Kind);
- }
-
/// Get the attribute of a given kind at a position.
Attribute getAttributeAtIndex(unsigned i, Attribute::AttrKind Kind) const {
return getAttributes().getAttributeAtIndex(i, Kind);
@@ -1793,20 +1776,20 @@ class CallBase : public Instruction {
/// Determine whether this argument is passed by value.
bool isByValArgument(unsigned ArgNo) const {
- return hasABIParamAttr(ArgNo, Attribute::ByVal);
+ return paramHasAttr(ArgNo, Attribute::ByVal);
}
/// Determine whether this argument is passed in an alloca.
bool isInAllocaArgument(unsigned ArgNo) const {
- return hasABIParamAttr(ArgNo, Attribute::InAlloca);
+ return paramHasAttr(ArgNo, Attribute::InAlloca);
}
/// Determine whether this argument is passed by value, in an alloca, or is
/// preallocated.
bool isPassPointeeByValueArgument(unsigned ArgNo) const {
- return hasABIParamAttr(ArgNo, Attribute::ByVal) ||
- hasABIParamAttr(ArgNo, Attribute::InAlloca) ||
- hasABIParamAttr(ArgNo, Attribute::Preallocated);
+ return paramHasAttr(ArgNo, Attribute::ByVal) ||
+ paramHasAttr(ArgNo, Attribute::InAlloca) ||
+ paramHasAttr(ArgNo, Attribute::Preallocated);
}
/// Determine whether passing undef to this argument is undefined behavior.
@@ -1823,7 +1806,7 @@ class CallBase : public Instruction {
/// Determine if there are is an inalloca argument. Only the last argument can
/// have the inalloca attribute.
bool hasInAllocaArgument() const {
- return !arg_empty() && hasABIParamAttr(arg_size() - 1, Attribute::InAlloca);
+ return !arg_empty() && paramHasAttr(arg_size() - 1, Attribute::InAlloca);
}
// FIXME: Once this API is no longer duplicated in `CallSite`, rename this to
@@ -1869,29 +1852,49 @@ class CallBase : public Instruction {
return Attrs.getParamStackAlignment(ArgNo);
}
- /// Extract the byref type for a call argument.
+ /// Extract the byref type for a call or parameter.
Type *getParamByRefType(unsigned ArgNo) const {
- return Attrs.getParamByRefType(ArgNo);
+ if (auto *Ty = Attrs.getParamByRefType(ArgNo))
+ return Ty;
+ if (const Function *F = getCalledFunction())
+ return F->getAttributes().getParamByRefType(ArgNo);
+ return nullptr;
}
- /// Extract the byval type for a call argument.
+ /// Extract the byval type for a call or parameter.
Type *getParamByValType(unsigned ArgNo) const {
- return Attrs.getParamByValType(ArgNo);
+ if (auto *Ty = Attrs.getParamByValType(ArgNo))
+ return Ty;
+ if (const Function *F = getCalledFunction())
+ return F->getAttributes().getParamByValType(ArgNo);
+ return nullptr;
}
- /// Extract the preallocated type for a call argument.
+ /// Extract the preallocated type for a call or parameter.
Type *getParamPreallocatedType(unsigned ArgNo) const {
- return Attrs.getParamPreallocatedType(ArgNo);
+ if (auto *Ty = Attrs.getParamPreallocatedType(ArgNo))
+ return Ty;
+ if (const Function *F = getCalledFunction())
+ return F->getAttributes().getParamPreallocatedType(ArgNo);
+ return nullptr;
}
- /// Extract the inalloca type for a call argument.
+ /// Extract the inalloca type for a call or parameter.
Type *getParamInAllocaType(unsigned ArgNo) const {
- return Attrs.getParamInAllocaType(ArgNo);
+ if (auto *Ty = Attrs.getParamInAllocaType(ArgNo))
+ return Ty;
+ if (const Function *F = getCalledFunction())
+ return F->getAttributes().getParamInAllocaType(ArgNo);
+ return nullptr;
}
- /// Extract the sret type for a call argument.
+ /// Extract the sret type for a call or parameter.
Type *getParamStructRetType(unsigned ArgNo) const {
- return Attrs.getParamStructRetType(ArgNo);
+ if (auto *Ty = Attrs.getParamStructRetType(ArgNo))
+ return Ty;
+ if (const Function *F = getCalledFunction())
+ return F->getAttributes().getParamStructRetType(ArgNo);
+ return nullptr;
}
/// Extract the elementtype type for a parameter.
@@ -2040,7 +2043,8 @@ class CallBase : public Instruction {
if (arg_empty())
return false;
- return hasABIParamAttr(0, Attribute::StructRet);
+ // Be friendly and also check the callee.
+ return paramHasAttr(0, Attribute::StructRet);
}
/// Determine if any call argument is an aggregate passed by value.
diff --git a/llvm/lib/Analysis/Lint.cpp b/llvm/lib/Analysis/Lint.cpp
index 54df723c69e85..26e78826848e7 100644
--- a/llvm/lib/Analysis/Lint.cpp
+++ b/llvm/lib/Analysis/Lint.cpp
@@ -264,13 +264,12 @@ void Lint::visitCallBase(CallBase &I) {
// Check that ABI attributes for the function and call-site match.
unsigned ArgNo = AI->getOperandNo();
+ Attribute::AttrKind ABIAttributes[] = {
+ Attribute::ZExt, Attribute::SExt, Attribute::InReg,
+ Attribute::ByVal, Attribute::ByRef, Attribute::InAlloca,
+ Attribute::Preallocated, Attribute::StructRet};
AttributeList CallAttrs = I.getAttributes();
- for (Attribute::AttrKind Attr :
- drop_begin(enum_seq(Attribute::None, Attribute::EndAttrKinds,
- force_iteration_on_noniterable_enum))) {
- if (!Attribute::isABIAttr(Attr))
- continue;
-
+ for (Attribute::AttrKind Attr : ABIAttributes) {
Attribute CallAttr = CallAttrs.getParamAttr(ArgNo, Attr);
Attribute FnAttr = F->getParamAttribute(ArgNo, Attr);
Check(CallAttr.isValid() == FnAttr.isValid(),
diff --git a/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp b/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
index eedb70b6ac522..4d97001eb7420 100644
--- a/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
@@ -104,11 +104,8 @@ ISD::ArgFlagsTy CallLowering::getAttributesForArgIdx(const CallBase &Call,
ISD::ArgFlagsTy Flags;
const AttributeList &Attrs = Call.getAttributes();
addFlagsFromAttrSet(Flags, Attrs.getParamAttrs(ArgIdx));
- if (const Function *F = Call.getCalledFunction()) {
- // "returned" is not an ABI attribute, so we can inherit it from the callee.
- if (F->hasParamAttribute(ArgIdx, Attribute::Returned))
- Flags.setReturned();
- }
+ if (const Function *F = Call.getCalledFunction())
+ addFlagsFromAttrSet(Flags, F->getAttributes().getParamAttrs(ArgIdx));
return Flags;
}
@@ -116,6 +113,8 @@ ISD::ArgFlagsTy
CallLowering::getAttributesForReturn(const CallBase &Call) const {
ISD::ArgFlagsTy Flags;
addFlagsFromAttrSet(Flags, Call.getAttributes().getRetAttrs());
+ if (const Function *F = Call.getCalledFunction())
+ addFlagsFromAttrSet(Flags, F->getAttributes().getRetAttrs());
return Flags;
}
diff --git a/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp b/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp
index 7f9776fda5c0b..6ca0592644a08 100644
--- a/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp
@@ -73,8 +73,8 @@ static ISD::NodeType getPreferredExtendForValue(const Instruction *I) {
if (!CallI->isArgOperand(&U))
continue;
unsigned ArgNo = CallI->getArgOperandNo(&U);
- NumOfUnsigned += CallI->hasABIParamAttr(ArgNo, Attribute::ZExt);
- NumOfSigned += CallI->hasABIParamAttr(ArgNo, Attribute::SExt);
+ NumOfUnsigned += CallI->paramHasAttr(ArgNo, Attribute::ZExt);
+ NumOfSigned += CallI->paramHasAttr(ArgNo, Attribute::SExt);
}
}
if (NumOfSigned > NumOfUnsigned)
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index 551abd6f0c87f..b5f2cd0e61d06 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -119,19 +119,19 @@ bool TargetLowering::parametersInCSRMatch(const MachineRegisterInfo &MRI,
/// and called function attributes.
void TargetLoweringBase::ArgListEntry::setAttributes(const CallBase *Call,
unsigned ArgIdx) {
- IsSExt = Call->hasABIParamAttr(ArgIdx, Attribute::SExt);
- IsZExt = Call->hasABIParamAttr(ArgIdx, Attribute::ZExt);
- IsNoExt = Call->hasABIParamAttr(ArgIdx, Attribute::NoExt);
- IsInReg = Call->hasABIParamAttr(ArgIdx, Attribute::InReg);
- IsSRet = Call->hasABIParamAttr(ArgIdx, Attribute::StructRet);
- IsNest = Call->hasABIParamAttr(ArgIdx, Attribute::Nest);
- IsByVal = Call->hasABIParamAttr(ArgIdx, Attribute::ByVal);
- IsPreallocated = Call->hasABIParamAttr(ArgIdx, Attribute::Preallocated);
- IsInAlloca = Call->hasABIParamAttr(ArgIdx, Attribute::InAlloca);
+ IsSExt = Call->paramHasAttr(ArgIdx, Attribute::SExt);
+ IsZExt = Call->paramHasAttr(ArgIdx, Attribute::ZExt);
+ IsNoExt = Call->paramHasAttr(ArgIdx, Attribute::NoExt);
+ IsInReg = Call->paramHasAttr(ArgIdx, Attribute::InReg);
+ IsSRet = Call->paramHasAttr(ArgIdx, Attribute::StructRet);
+ IsNest = Call->paramHasAttr(ArgIdx, Attribute::Nest);
+ IsByVal = Call->paramHasAttr(ArgIdx, Attribute::ByVal);
+ IsPreallocated = Call->paramHasAttr(ArgIdx, Attribute::Preallocated);
+ IsInAlloca = Call->paramHasAttr(ArgIdx, Attribute::InAlloca);
IsReturned = Call->paramHasAttr(ArgIdx, Attribute::Returned);
- IsSwiftSelf = Call->hasABIParamAttr(ArgIdx, Attribute::SwiftSelf);
- IsSwiftAsync = Call->hasABIParamAttr(ArgIdx, Attribute::SwiftAsync);
- IsSwiftError = Call->hasABIParamAttr(ArgIdx, Attribute::SwiftError);
+ IsSwiftSelf = Call->paramHasAttr(ArgIdx, Attribute::SwiftSelf);
+ IsSwiftAsync = Call->paramHasAttr(ArgIdx, Attribute::SwiftAsync);
+ IsSwiftError = Call->paramHasAttr(ArgIdx, Attribute::SwiftError);
Alignment = Call->getParamStackAlign(ArgIdx);
IndirectType = nullptr;
assert(IsByVal + IsPreallocated + IsInAlloca + IsSRet <= 1 &&
diff --git a/llvm/lib/CodeGen/TypePromotion.cpp b/llvm/lib/CodeGen/TypePromotion.cpp
index 6df993b4420a4..59ea4281f6ee4 100644
--- a/llvm/lib/CodeGen/TypePromotion.cpp
+++ b/llvm/lib/CodeGen/TypePromotion.cpp
@@ -243,7 +243,7 @@ bool TypePromotionImpl::isSource(Value *V) {
else if (isa<LoadInst>(V))
return true;
else if (auto *Call = dyn_cast<CallInst>(V))
- return Call->hasABIRetAttr(Attribute::AttrKind::ZExt);
+ return Call->hasRetAttr(Attribute::AttrKind::ZExt);
else if (auto *Trunc = dyn_cast<TruncInst>(V))
return EqualTypeSize(Trunc);
return false;
@@ -774,7 +774,7 @@ bool TypePromotionImpl::isSupportedValue(Value *V) {
// can still be sinks.
auto *Call = cast<CallInst>(I);
return isSupportedType(Call) &&
- Call->hasABIRetAttr(Attribute::AttrKind::ZExt);
+ Call->hasRetAttr(Attribute::AttrKind::ZExt);
}
}
} else if (isa<Constant>(V) && !isa<ConstantExpr>(V)) {
diff --git a/llvm/lib/IR/Attributes.cpp b/llvm/lib/IR/Attributes.cpp
index 7f5f5f34af389..727a7bcb6a144 100644
--- a/llvm/lib/IR/Attributes.cpp
+++ b/llvm/lib/IR/Attributes.cpp
@@ -811,7 +811,6 @@ enum AttributeProperty {
IntersectMin = (2 << 3),
IntersectCustom = (3 << 3),
IntersectPropertyMask = (3 << 3),
- ABIAttr = (1 << 5),
};
#define GET_ATTR_PROP_TABLE
@@ -840,10 +839,6 @@ bool Attribute::canUseAsRetAttr(AttrKind Kind) {
return hasAttributeProperty(Kind, AttributeProperty::RetAttr);
}
-bool Attribute::isABIAttr(AttrKind Kind) {
- return hasAttributeProperty(Kind, AttributeProperty::ABIAttr);
-}
-
static bool hasIntersectProperty(Attribute::AttrKind Kind,
AttributeProperty Prop) {
assert((Prop == AttributeProperty::IntersectPreserve ||
diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp
index ec794f28fff71..325850b0a880d 100644
--- a/llvm/lib/IR/Instructions.cpp
+++ b/llvm/lib/IR/Instructions.cpp
@@ -419,7 +419,6 @@ Value *CallBase::getArgOperandWithAttribute(Attribute::AttrKind Kind) const {
/// Determine whether the argument or parameter has the given attribute.
bool CallBase::paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const {
assert(ArgNo < arg_size() && "Param index out of bounds!");
- assert(!Attribute::isABIAttr(Kind) && "Use hasABIParamAttr() instead");
if (Attrs.hasParamAttr(ArgNo, Kind))
return true;
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index 26c34b4221fde..0006682b969a0 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -4034,7 +4034,7 @@ void Verifier::visitCallBase(CallBase &Call) {
// make sure the underlying alloca/parameter it comes from has a swifterror as
// well.
for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i) {
- if (Call.hasABIParamAttr(i, Attribute::SwiftError)) {
+ if (Call.paramHasAttr(i, Attribute::SwiftError)) {
Value *SwiftErrorArg = Call.getArgOperand(i);
if (auto AI = dyn_cast<AllocaInst>(SwiftErrorArg->stripInBoundsOffsets())) {
Check(AI->isSwiftError(),
@@ -4083,7 +4083,7 @@ void Verifier::visitCallBase(CallBase &Call) {
Call);
}
- if (Call.hasABIParamAttr(i, Attribute::Preallocated)) {
+ if (Call.paramHasAttr(i, Attribute::Preallocated)) {
Value *ArgVal = Call.getArgOperand(i);
bool hasOB =
Call.countOperandBundlesOfType(LLVMContext::OB_preallocated) != 0;
@@ -4794,7 +4794,7 @@ void Verifier::verifySwiftErrorCall(CallBase &Call,
const Value *SwiftErrorVal) {
for (const auto &I : llvm::enumerate(Call.args())) {
if (I.value() == SwiftErrorVal) {
- Check(Call.hasABIParamAttr(I.index(), Attribute::SwiftError),
+ Check(Call.paramHasAttr(I.index(), Attribute::SwiftError),
"swifterror value when used in a callsite should be marked "
"with swifterror attribute",
SwiftErrorVal, Call);
@@ -6457,7 +6457,7 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
FoundCall = true;
size_t NumPreallocatedArgs = 0;
for (unsigned i = 0; i < UseCall->arg_size(); i++) {
- if (UseCall->hasABIParamAttr(i, Attribute::Preallocated)) {
+ if (UseCall->paramHasAttr(i, Attribute::Preallocated)) {
++NumPreallocatedArgs;
}
}
diff --git a/llvm/lib/IR/VerifierAMDGPU.cpp b/llvm/lib/IR/VerifierAMDGPU.cpp
index 6338bcd74f431..9f2cd159ad60f 100644
--- a/llvm/lib/IR/VerifierAMDGPU.cpp
+++ b/llvm/lib/IR/VerifierAMDGPU.cpp
@@ -192,9 +192,9 @@ void llvm::verifyAMDGPUIntrinsicCall(VerifierSupport &VS, Intrinsic::ID ID,
break;
}
- Check(Call.hasABIParamAttr(2, Attribute::InReg),
+ Check(Call.paramHasAttr(2, Attribute::InReg),
"SGPR arguments must have the `inreg` attribute", &Call);
- Check(!Call.hasABIParamAttr(3, Attribute::InReg),
+ Check(!Call.paramHasAttr(3, Attribute::InReg),
"VGPR arguments must not have the `inreg` attribute", &Call);
ConstantInt *FlagsArg = cast<ConstantInt>(Call.getArgOperand(4));
@@ -232,7 +232,7 @@ void llvm::verifyAMDGPUIntrinsicCall(VerifierSupport &VS, Intrinsic::ID ID,
}
unsigned InactiveIdx = 1;
- Check(!Call.hasABIParamAttr(InactiveIdx, Attribute::InReg),
+ Check(!Call.paramHasAttr(InactiveIdx, Attribute::InReg),
"Value for inactive lanes must not have the `inreg` attribute",
&Call);
Check(isa<Argument>(Call.getArgOperand(InactiveIdx)),
@@ -262,7 +262,7 @@ void llvm::verifyAMDGPUIntrinsicCall(VerifierSupport &VS, Intrinsic::ID ID,
Check(CallArg->getType() == FuncArg.getType(),
"Argument types must match", &Call);
- Check(Call.hasABIParamAttr(FuncArg.getArgNo(), Attribute::InReg) ==
+ Check(Call.paramHasAttr(FuncArg.getArgNo(), Attribute::InReg) ==
FuncArg.hasInRegAttr(),
"Argument inreg attributes must match", &Call);
}
diff --git a/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp b/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp
index 0a6e98777953c..3a7916b80c37f 100644
--- a/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp
+++ b/llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp
@@ -3278,10 +3278,10 @@ bool isArgPassedInSGPR(const CallBase *CB, unsigned ArgNo) {
case CallingConv::AMDGPU_CS_ChainPreserve:
// For non-compute shaders, SGPR inputs are marked with either inreg or
// byval. Everything else is in VGPRs.
- return CB->hasABIParamAttr(ArgNo, Attribute::InReg) ||
+ return CB->paramHasAttr(ArgNo, Attribute::InReg) ||
CB->isByValArgument(ArgNo);
default:
- return CB->hasABIParamAttr(ArgNo, Attribute::InReg);
+ return CB->paramHasAttr(ArgNo, Attribute::InReg);
}
}
diff --git a/llvm/lib/Target/ARM/ARMFastISel.cpp b/llvm/lib/Target/ARM/ARMFastISel.cpp
index 043533c719846..88ee3156ee339 100644
--- a/llvm/lib/Target/ARM/ARMFastISel.cpp
+++ b/llvm/lib/Target/ARM/ARMFastISel.cpp
@@ -2424,18 +2424,18 @@ bool ARMFastISel::SelectCall(const Instruction *I,
ISD::ArgFlagsTy Flags;
unsigned ArgIdx = ArgI - CI->arg_begin();
- if (CI->hasABIParamAttr(ArgIdx, Attribute::SExt))
+ if (CI->paramHasAttr(ArgIdx, Attribute::SExt))
Flags.setSExt();
- if (CI->hasABIParamAttr(ArgIdx, Attribute::ZExt))
+ if (CI->paramHasAttr(ArgIdx, Attribute::ZExt))
Flags.setZExt();
// FIXME: Only handle *easy* calls for now.
- if (CI->hasABIParamAttr(ArgIdx, Attribute::InReg) ||
- CI->hasABIParamAttr(ArgIdx, Attribute::StructRet) ||
- CI->hasABIParamAttr(ArgIdx, Attribute::SwiftSelf) ||
- CI->hasABIParamAttr(ArgIdx, Attribute::SwiftError) ||
- CI->hasABIParamAttr(ArgIdx, Attribute::Nest) ||
- CI->hasABIParamAttr(ArgIdx, Attribute::ByVal))
+ if (CI->paramHasAttr(ArgIdx, Attribute::InReg) ||
+ CI->paramHasAttr(ArgIdx, Attribute::StructRet) ||
+ CI->paramHasAttr(ArgIdx, Attribute::SwiftSelf) ||
+ CI->paramHasAttr(ArgIdx, Attribute::SwiftError) ||
+ CI->paramHasAttr(ArgIdx, Attribute::Nest) ||
+ CI->paramHasAttr(ArgIdx, Attribute::ByVal))
return false;
Type *ArgTy = (*ArgI)->getType();
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
index c9eab64788911..db03f5874234c 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
@@ -921,9 +921,9 @@ bool WebAssemblyFastISel::selectCall(const Instruction *I) {
unsigned Reg;
- if (Call->hasABIParamAttr(I, Attribute::SExt))
+ if (Call->paramHasAttr(I, Attribute::SExt))
Reg = getRegForSignedValue(V);
- else if (Call->hasABIParamAttr(I, Attribute::ZExt))
+ else if (Call->paramHasAttr(I, Attribute::ZExt))
Reg = getRegForUnsignedValue(V);
else
Reg = getRegForValue(V);
diff --git a/llvm/lib/Target/X86/X86FastISel.cpp b/llvm/lib/Target/X86/X86FastISel.cpp
index 198988d453a33..a8f228ea661ce 100644
--- a/llvm/lib/Target/X86/X86FastISel.cpp
+++ b/llvm/lib/Target/X86/X86FastISel.cpp
@@ -3177,8 +3177,8 @@ static unsigned computeBytesPoppedByCalleeForSRet(const X86Subtarget *Subtarget,
return 0;
if (CB)
- if (CB->arg_empty() || !CB->hasStructRetAttr() ||
- CB->hasABIParamAttr(0, Attribute::InReg) || Subtarget->isTargetMCU())
+ if (CB->arg_empty() || !CB->paramHasAttr(0, Attribute::StructRet) ||
+ CB->paramHasAttr(0, Attribute::InReg) || Subtarget->isTargetMCU())
return 0;
return 4;
diff --git a/llvm/lib/Target/X86/X86ISelLoweringCall.cpp b/llvm/lib/Target/X86/X86ISelLoweringCall.cpp
index c10b82b68de07..9a03da14ee10e 100644
--- a/llvm/lib/Target/X86/X86ISelLoweringCall.cpp
+++ b/llvm/lib/Target/X86/X86ISelLoweringCall.cpp
@@ -2294,7 +2294,7 @@ X86TargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
"parameter");
SmallVector<size_t, 4> PreallocatedOffsets;
for (size_t i = 0; i < CLI.OutVals.size(); ++i) {
- if (CLI.CB->hasABIParamAttr(i, Attribute::Preallocated)) {
+ if (CLI.CB->paramHasAttr(i, Attribute::Preallocated)) {
PreallocatedOffsets.push_back(ArgLocs[i].getLocMemOffset());
}
}
diff --git a/llvm/lib/Transforms/IPO/ExpandVariadics.cpp b/llvm/lib/Transforms/IPO/ExpandVariadics.cpp
index bd76b9ce5b954..44d944933cc3a 100644
--- a/llvm/lib/Transforms/IPO/ExpandVariadics.cpp
+++ b/llvm/lib/Transforms/IPO/ExpandVariadics.cpp
@@ -680,8 +680,8 @@ bool ExpandVariadics::expandCall(Module &M, IRBuilder<> &Builder, CallBase *CB,
for (unsigned I : seq(VarargFunctionType->getNumParams(), CB->arg_size())) {
Value *ArgVal = CB->getArgOperand(I);
- const bool IsByVal = CB->hasABIParamAttr(I, Attribute::ByVal);
- const bool IsByRef = CB->hasABIParamAttr(I, Attribute::ByRef);
+ const bool IsByVal = CB->paramHasAttr(I, Attribute::ByVal);
+ const bool IsByRef = CB->paramHasAttr(I, Attribute::ByRef);
// The type of the value being passed, decoded from byval/byref metadata if
// required
diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
index 0b7c452103543..4084f3d580e57 100644
--- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
@@ -9098,8 +9098,8 @@ struct VarArgSystemZHelper : public VarArgHelperBase {
// 64-bit integer representing the same number, using sign or zero
// extension". Shadow for an integer argument has the same type as the
// argument itself, so it can be sign or zero extended as well.
- bool ZExt = CB.hasABIParamAttr(ArgNo, Attribute::ZExt);
- bool SExt = CB.hasABIParamAttr(ArgNo, Attribute::SExt);
+ bool ZExt = CB.paramHasAttr(ArgNo, Attribute::ZExt);
+ bool SExt = CB.paramHasAttr(ArgNo, Attribute::SExt);
if (ZExt) {
assert(!SExt);
return ShadowExtension::Zero;
diff --git a/llvm/lib/Transforms/Utils/CallPromotionUtils.cpp b/llvm/lib/Transforms/Utils/CallPromotionUtils.cpp
index 7ae67db5f0002..a49f0c73ad3e3 100644
--- a/llvm/lib/Transforms/Utils/CallPromotionUtils.cpp
+++ b/llvm/lib/Transforms/Utils/CallPromotionUtils.cpp
@@ -476,7 +476,7 @@ bool llvm::isLegalToPromote(const CallBase &CB, Function *Callee,
for (; I < NumArgs; I++) {
// Vararg functions can have more arguments than parameters.
assert(Callee->isVarArg());
- if (CB.hasABIParamAttr(I, Attribute::StructRet)) {
+ if (CB.paramHasAttr(I, Attribute::StructRet)) {
if (FailureReason)
*FailureReason = "SRet arg to vararg function";
return false;
diff --git a/llvm/test/Analysis/BasicAA/call-attrs.ll b/llvm/test/Analysis/BasicAA/call-attrs.ll
index aa5fd471c52ba..f6e92dd34ff7f 100644
--- a/llvm/test/Analysis/BasicAA/call-attrs.ll
+++ b/llvm/test/Analysis/BasicAA/call-attrs.ll
@@ -25,7 +25,7 @@ entry:
call void @readnone_attr(ptr %p)
call void @readnone_func(ptr %p)
- call void @byval_attr(ptr byval(i32) %p)
+ call void @byval_attr(ptr %p)
call void @read_write(ptr %p, ptr %p, ptr %p)
@@ -41,7 +41,7 @@ entry:
; CHECK: Just Mod: Ptr: i8* %p <-> call void @writeonly_func(ptr %p)
; CHECK: NoModRef: Ptr: i8* %p <-> call void @readnone_attr(ptr %p)
; CHECK: NoModRef: Ptr: i8* %p <-> call void @readnone_func(ptr %p)
-; CHECK: Just Ref: Ptr: i8* %p <-> call void @byval_attr(ptr byval(i32) %p)
+; CHECK: Just Ref: Ptr: i8* %p <-> call void @byval_attr(ptr %p)
; CHECK: Both ModRef: Ptr: i8* %p <-> call void @read_write(ptr %p, ptr %p, ptr %p)
; CHECK: Just Ref: Ptr: i8* %p <-> call void @func() [ "deopt"(ptr %p) ]
; CHECK: Both ModRef: Ptr: i8* %p <-> call void @writeonly_attr(ptr %p) [ "deopt"(ptr %p) ]
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/call-translator-tail-call-sret.ll b/llvm/test/CodeGen/AArch64/GlobalISel/call-translator-tail-call-sret.ll
index c60b9e5cc840a..545d854f047ec 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/call-translator-tail-call-sret.ll
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/call-translator-tail-call-sret.ll
@@ -13,7 +13,7 @@ define void @can_tail_call_forwarded_explicit_sret_ptr(ptr sret(i64) %arg) {
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x8
; CHECK-NEXT: $x8 = COPY [[COPY]](p0)
; CHECK-NEXT: TCRETURNdi @test_explicit_sret, 0, csr_darwin_aarch64_aapcs, implicit $sp, implicit $x8
- tail call void @test_explicit_sret(ptr sret(i64) %arg)
+ tail call void @test_explicit_sret(ptr %arg)
ret void
}
@@ -29,7 +29,7 @@ define void @test_call_explicit_sret(ptr sret(i64) %arg) {
; CHECK-NEXT: BL @test_explicit_sret, csr_darwin_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $x8
; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
; CHECK-NEXT: RET_ReallyLR
- call void @test_explicit_sret(ptr sret(i64) %arg)
+ call void @test_explicit_sret(ptr %arg)
ret void
}
@@ -43,7 +43,7 @@ define void @dont_tail_call_explicit_sret_alloca_unused() {
; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
; CHECK-NEXT: RET_ReallyLR
%l = alloca i64, align 8
- tail call void @test_explicit_sret(ptr sret(i64) %l)
+ tail call void @test_explicit_sret(ptr %l)
ret void
}
@@ -64,7 +64,7 @@ define void @dont_tail_call_explicit_sret_alloca_dummyusers(ptr %ptr) {
%l = alloca i64, align 8
%r = load i64, ptr %ptr, align 8
store i64 %r, ptr %l, align 8
- tail call void @test_explicit_sret(ptr sret(i64) %l)
+ tail call void @test_explicit_sret(ptr %l)
ret void
}
@@ -82,7 +82,7 @@ define void @dont_tail_call_tailcall_explicit_sret_gep(ptr %ptr) {
; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
; CHECK-NEXT: RET_ReallyLR
%ptr2 = getelementptr i64, ptr %ptr, i32 1
- tail call void @test_explicit_sret(ptr sret(i64) %ptr2)
+ tail call void @test_explicit_sret(ptr %ptr2)
ret void
}
@@ -98,7 +98,7 @@ define i64 @dont_tail_call_sret_alloca_returned() {
; CHECK-NEXT: $x0 = COPY [[LOAD]](i64)
; CHECK-NEXT: RET_ReallyLR implicit $x0
%l = alloca i64, align 8
- tail call void @test_explicit_sret(ptr sret(i64) %l)
+ tail call void @test_explicit_sret(ptr %l)
%r = load i64, ptr %l, align 8
ret i64 %r
}
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/call-translator.ll b/llvm/test/CodeGen/AArch64/GlobalISel/call-translator.ll
index 2071f8eed9fa4..25baf6a295b14 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/call-translator.ll
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/call-translator.ll
@@ -151,14 +151,13 @@ define void @test_abi_exts_call(ptr %addr) {
ret void
}
-; zeroext on callee is not inherited.
; CHECK-LABEL: name: test_zext_in_callee
; CHECK: bb.1 (%ir-block.0):
; CHECK: liveins: $x0
; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
; CHECK: [[LOAD:%[0-9]+]]:_(i8) = G_LOAD [[COPY]](p0) :: (load (i8) from %ir.addr)
; CHECK: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
-; CHECK: [[ZEXT:%[0-9]+]]:_(i32) = G_ANYEXT [[LOAD]](i8)
+; CHECK: [[ZEXT:%[0-9]+]]:_(i32) = G_ZEXT [[LOAD]](i8)
; CHECK: $w0 = COPY [[ZEXT]](i32)
; CHECK: BL @has_zext_param, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $w0
; CHECK: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
@@ -170,14 +169,13 @@ define void @test_zext_in_callee(ptr %addr) {
ret void
}
-; signext on callee is not inherited.
; CHECK-LABEL: name: test_sext_in_callee
; CHECK: bb.1 (%ir-block.0):
; CHECK: liveins: $x0
; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
; CHECK: [[LOAD:%[0-9]+]]:_(i8) = G_LOAD [[COPY]](p0) :: (load (i8) from %ir.addr)
; CHECK: ADJCALLSTACKDOWN 0, 0, implicit-def $sp, implicit $sp
-; CHECK: [[SEXT:%[0-9]+]]:_(i32) = G_ANYEXT [[LOAD]](i8)
+; CHECK: [[SEXT:%[0-9]+]]:_(i32) = G_SEXT [[LOAD]](i8)
; CHECK: $w0 = COPY [[SEXT]](i32)
; CHECK: BL @has_sext_param, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit $w0
; CHECK: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
@@ -366,7 +364,7 @@ define void @call_returns_array_size0_struct() {
; Test extends on return values.
-; This should *not* assume that the return value from has_zext_return is zero
+; This should notice that the return value from has_zext_return is zero
; extended.
declare zeroext i16 @has_zext_return()
define i32 @test_zext_return_from_callee() {
@@ -376,7 +374,8 @@ define i32 @test_zext_return_from_callee() {
; CHECK-NEXT: BL @has_zext_return, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit-def $w0
; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(i32) = COPY $w0
- ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(i16) = G_TRUNC [[COPY]](i32)
+ ; CHECK-NEXT: [[ASSERT_ZEXT:%[0-9]+]]:_(i32) = G_ASSERT_ZEXT [[COPY]], 16
+ ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(i16) = G_TRUNC [[ASSERT_ZEXT]](i32)
; CHECK-NEXT: [[ZEXT:%[0-9]+]]:_(i32) = G_ZEXT [[TRUNC]](i16)
; CHECK-NEXT: $w0 = COPY [[ZEXT]](i32)
; CHECK-NEXT: RET_ReallyLR implicit $w0
@@ -404,7 +403,7 @@ define i32 @test_zext_return_from_callee2() {
ret i32 %ext
}
-; This should *not* assume that the return value from has_sext_return is sign
+; This should notice that the return value from has_sext_return is sign
; extended.
declare signext i16 @has_sext_return()
define i32 @test_sext_return_from_callee() {
@@ -414,7 +413,8 @@ define i32 @test_sext_return_from_callee() {
; CHECK-NEXT: BL @has_sext_return, csr_aarch64_aapcs, implicit-def $lr, implicit $sp, implicit-def $w0
; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def $sp, implicit $sp
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(i32) = COPY $w0
- ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(i16) = G_TRUNC [[COPY]](i32)
+ ; CHECK-NEXT: [[ASSERT_SEXT:%[0-9]+]]:_(i32) = G_ASSERT_SEXT [[COPY]], 16
+ ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(i16) = G_TRUNC [[ASSERT_SEXT]](i32)
; CHECK-NEXT: [[SEXT:%[0-9]+]]:_(i32) = G_SEXT [[TRUNC]](i16)
; CHECK-NEXT: $w0 = COPY [[SEXT]](i32)
; CHECK-NEXT: RET_ReallyLR implicit $w0
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/swifterror.ll b/llvm/test/CodeGen/AArch64/GlobalISel/swifterror.ll
index 26b042213972c..78fc6ccc50663 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/swifterror.ll
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/swifterror.ll
@@ -518,7 +518,7 @@ define float @swifterror_param_not_on_call(ptr %error_ref) {
entry:
%error_ptr_ref = alloca swifterror ptr
store ptr null, ptr %error_ptr_ref
- %call = call float @foo(ptr swifterror %error_ptr_ref)
+ %call = call float @foo(ptr %error_ptr_ref)
%error_from_foo = load ptr, ptr %error_ptr_ref
%had_error_from_foo = icmp ne ptr %error_from_foo, null
br i1 %had_error_from_foo, label %handler, label %cont
@@ -550,7 +550,7 @@ entry:
%s = alloca %struct.S, align 8
%error_ptr_ref = alloca swifterror ptr
store ptr null, ptr %error_ptr_ref
- call void @foo_sret(ptr %s, i32 1, ptr swifterror %error_ptr_ref)
+ call void @foo_sret(ptr %s, i32 1, ptr %error_ptr_ref)
%error_from_foo = load ptr, ptr %error_ptr_ref
%had_error_from_foo = icmp ne ptr %error_from_foo, null
br i1 %had_error_from_foo, label %handler, label %cont
diff --git a/llvm/test/CodeGen/AArch64/GlobalISel/swiftself.ll b/llvm/test/CodeGen/AArch64/GlobalISel/swiftself.ll
index 68872b18b76c0..b8c9102af3bb1 100644
--- a/llvm/test/CodeGen/AArch64/GlobalISel/swiftself.ll
+++ b/llvm/test/CodeGen/AArch64/GlobalISel/swiftself.ll
@@ -61,10 +61,10 @@ entry:
ret void
}
-; Check that x20 is NOT used to pass a swiftself argument when the attribute is
+; Check that x20 is used to pass a swiftself argument when the parameter is
; only in the declaration's arguments.
; CHECK-LABEL: _swiftself_not_on_call_params:
-; CHECK-NOT: mov{{.*}}x20
+; CHECK: mov x20, x0
; CHECK: bl {{_?}}swiftself_param
; CHECK: ret
define ptr @swiftself_not_on_call_params(ptr %arg) {
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-call-return-values.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-call-return-values.ll
index 0d52c4e3510ed..5160093a4e273 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-call-return-values.ll
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-call-return-values.ll
@@ -286,7 +286,7 @@ define amdgpu_kernel void @test_call_external_i1_zeroext_func_void() #0 {
; GCN-NEXT: [[ZEXT:%[0-9]+]]:_(i32) = G_ZEXT [[TRUNC]](i1)
; GCN-NEXT: G_STORE [[ZEXT]](i32), [[DEF]](p1) :: (volatile store (i32) into `ptr addrspace(1) poison`, addrspace 1)
; GCN-NEXT: S_ENDPGM 0
- %val = call zeroext i1 @external_i1_zeroext_func_void()
+ %val = call i1 @external_i1_zeroext_func_void()
%val.ext = zext i1 %val to i32
store volatile i32 %val.ext, ptr addrspace(1) poison
ret void
@@ -348,7 +348,7 @@ define amdgpu_kernel void @test_call_external_i1_signext_func_void() #0 {
; GCN-NEXT: [[SEXT:%[0-9]+]]:_(i32) = G_SEXT [[TRUNC]](i1)
; GCN-NEXT: G_STORE [[SEXT]](i32), [[DEF]](p1) :: (volatile store (i32) into `ptr addrspace(1) poison`, addrspace 1)
; GCN-NEXT: S_ENDPGM 0
- %val = call signext i1 @external_i1_signext_func_void()
+ %val = call i1 @external_i1_signext_func_void()
%val.ext = sext i1 %val to i32
store volatile i32 %val.ext, ptr addrspace(1) poison
ret void
@@ -490,7 +490,7 @@ define amdgpu_kernel void @test_call_external_i8_zeroext_func_void() #0 {
; GCN-NEXT: [[ZEXT:%[0-9]+]]:_(i32) = G_ZEXT [[TRUNC]](i8)
; GCN-NEXT: G_STORE [[ZEXT]](i32), [[DEF]](p1) :: (volatile store (i32) into `ptr addrspace(1) poison`, addrspace 1)
; GCN-NEXT: S_ENDPGM 0
- %val = call zeroext i8 @external_i8_zeroext_func_void()
+ %val = call i8 @external_i8_zeroext_func_void()
%val.ext = zext i8 %val to i32
store volatile i32 %val.ext, ptr addrspace(1) poison
ret void
@@ -552,7 +552,7 @@ define amdgpu_kernel void @test_call_external_i8_signext_func_void() #0 {
; GCN-NEXT: [[SEXT:%[0-9]+]]:_(i32) = G_SEXT [[TRUNC]](i8)
; GCN-NEXT: G_STORE [[SEXT]](i32), [[DEF]](p1) :: (volatile store (i32) into `ptr addrspace(1) poison`, addrspace 1)
; GCN-NEXT: S_ENDPGM 0
- %val = call signext i8 @external_i8_signext_func_void()
+ %val = call i8 @external_i8_signext_func_void()
%val.ext = sext i8 %val to i32
store volatile i32 %val.ext, ptr addrspace(1) poison
ret void
@@ -673,7 +673,7 @@ define amdgpu_kernel void @test_call_external_i16_zeroext_func_void() #0 {
; GCN-NEXT: [[ZEXT:%[0-9]+]]:_(i32) = G_ZEXT [[TRUNC]](i16)
; GCN-NEXT: G_STORE [[ZEXT]](i32), [[DEF]](p1) :: (volatile store (i32) into `ptr addrspace(1) poison`, addrspace 1)
; GCN-NEXT: S_ENDPGM 0
- %val = call zeroext i16 @external_i16_zeroext_func_void()
+ %val = call i16 @external_i16_zeroext_func_void()
%val.ext = zext i16 %val to i32
store volatile i32 %val.ext, ptr addrspace(1) poison
ret void
@@ -735,7 +735,7 @@ define amdgpu_kernel void @test_call_external_i16_signext_func_void() #0 {
; GCN-NEXT: [[SEXT:%[0-9]+]]:_(i32) = G_SEXT [[TRUNC]](i16)
; GCN-NEXT: G_STORE [[SEXT]](i32), [[DEF]](p1) :: (volatile store (i32) into `ptr addrspace(1) poison`, addrspace 1)
; GCN-NEXT: S_ENDPGM 0
- %val = call signext i16 @external_i16_signext_func_void()
+ %val = call i16 @external_i16_signext_func_void()
%val.ext = sext i16 %val to i32
store volatile i32 %val.ext, ptr addrspace(1) poison
ret void
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-call-sret.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-call-sret.ll
index 5eada470428fe..3917b06d28f0e 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-call-sret.ll
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-call-sret.ll
@@ -80,7 +80,7 @@ define amdgpu_kernel void @test_call_external_void_func_sret_struct_i8_i32_byval
%in.gep1 = getelementptr inbounds { i8, i32 }, ptr addrspace(5) %in.val, i32 0, i32 1
store i8 3, ptr addrspace(5) %in.gep0
store i32 8, ptr addrspace(5) %in.gep1
- call void @external_void_func_sret_struct_i8_i32_byval_struct_i8_i32(ptr addrspace(5) sret({ i8, i32 }) %out.val, ptr addrspace(5) byval({ i8, i32 }) %in.val)
+ call void @external_void_func_sret_struct_i8_i32_byval_struct_i8_i32(ptr addrspace(5) %out.val, ptr addrspace(5) %in.val)
%out.gep0 = getelementptr inbounds { i8, i32 }, ptr addrspace(5) %out.val, i32 0, i32 0
%out.gep1 = getelementptr inbounds { i8, i32 }, ptr addrspace(5) %out.val, i32 0, i32 1
%out.val0 = load i8, ptr addrspace(5) %out.gep0
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-call.ll b/llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-call.ll
index 05bbddf444adb..465e87d84a824 100644
--- a/llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-call.ll
+++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-call.ll
@@ -4183,7 +4183,7 @@ define void @call_byval_3ai32_byval_i8_align32(ptr addrspace(5) %incoming0, ptr
; CHECK-NEXT: $sgpr30_sgpr31 = noconvergent G_SI_CALL [[GV]](p0), @void_func_byval_a3i32_byval_i8_align32, csr_amdgpu, implicit $vgpr0, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr4_sgpr5, implicit $sgpr6_sgpr7, implicit $sgpr8_sgpr9, implicit $sgpr10_sgpr11, implicit $sgpr12, implicit $sgpr13, implicit $sgpr14, implicit $sgpr15, implicit $vgpr31
; CHECK-NEXT: ADJCALLSTACKDOWN 0, 36, implicit-def $scc
; CHECK-NEXT: SI_RETURN
- call void @void_func_byval_a3i32_byval_i8_align32(ptr addrspace(5) byval([3 x i32]) %incoming0, ptr addrspace(5) byval(i8) align 32 %incoming1, i32 999)
+ call void @void_func_byval_a3i32_byval_i8_align32(ptr addrspace(5) byval([3 x i32]) %incoming0, ptr addrspace(5) align 32 %incoming1, i32 999)
ret void
}
diff --git a/llvm/test/CodeGen/AMDGPU/fncall-implicitdef.ll b/llvm/test/CodeGen/AMDGPU/fncall-implicitdef.ll
index 654ae91286336..b43ffee6270fb 100644
--- a/llvm/test/CodeGen/AMDGPU/fncall-implicitdef.ll
+++ b/llvm/test/CodeGen/AMDGPU/fncall-implicitdef.ll
@@ -18,7 +18,7 @@ define amdgpu_ps <4 x float> @caller(ptr %ptr) {
; CHECK-NEXT: s_swappc_b64 s[30:31], s[4:5]
; CHECK-NEXT: ; return to shader part epilog
%L = load i32, ptr %ptr, align 4
- %R = call <4 x float> @fn(<4 x i32> inreg zeroinitializer, i32 0, i32 %L, i32 0)
+ %R = call <4 x float> @fn(<4 x i32> zeroinitializer, i32 0, i32 %L, i32 0)
ret <4 x float> %R
}
diff --git a/llvm/test/CodeGen/AMDGPU/swdev504645-global-fold.ll b/llvm/test/CodeGen/AMDGPU/swdev504645-global-fold.ll
index 4b2cca13e2618..da963c0ec19c2 100644
--- a/llvm/test/CodeGen/AMDGPU/swdev504645-global-fold.ll
+++ b/llvm/test/CodeGen/AMDGPU/swdev504645-global-fold.ll
@@ -34,7 +34,7 @@ define void @test_load_zext() #0 {
; CHECK-NEXT: s_setpc_b64 s[30:31]
.entry:
%reloc = call i32 @llvm.amdgcn.reloc.constant(metadata !0)
- call void @has_spgr_args(i32 inreg %reloc)
+ call void @has_spgr_args(i32 %reloc)
ret void
}
diff --git a/llvm/test/CodeGen/AMDGPU/waterfall-call-inreg-agpr.ll b/llvm/test/CodeGen/AMDGPU/waterfall-call-inreg-agpr.ll
index 87185a8f4c668..6073a337a234c 100644
--- a/llvm/test/CodeGen/AMDGPU/waterfall-call-inreg-agpr.ll
+++ b/llvm/test/CodeGen/AMDGPU/waterfall-call-inreg-agpr.ll
@@ -60,6 +60,6 @@ define amdgpu_cs_chain_preserve void @caller() {
; CHECK-NEXT: ; %bb.2:
; CHECK-NEXT: s_endpgm
%p = load ptr addrspace(3), ptr @G, align 4
- call void @callee(ptr addrspace(3) inreg %p, ptr addrspace(3) poison)
+ call void @callee(ptr addrspace(3) %p, ptr addrspace(3) poison)
ret void
}
diff --git a/llvm/test/CodeGen/ARM/returned-ext.ll b/llvm/test/CodeGen/ARM/returned-ext.ll
index e3550650058e9..b59974f6a3cfa 100644
--- a/llvm/test/CodeGen/ARM/returned-ext.ll
+++ b/llvm/test/CodeGen/ARM/returned-ext.ll
@@ -56,7 +56,7 @@ entry:
; This shouldn't be required
; CHECKT2D: mov r0, [[SAVEX]]
- %call = tail call zeroext i16 @retzext16(i16 returned %x)
+ %call = tail call i16 @retzext16(i16 returned %x)
%b = zext i16 %call to i32
%call2 = tail call i32 @identity32(i32 returned %b)
ret i16 %x
@@ -149,7 +149,7 @@ entry:
; FIXME: Tail call should be OK here
; CHECKT2D: bl _identity32
- %call = tail call zeroext i16 @bothzext16(i16 zeroext returned %x)
+ %call = tail call i16 @bothzext16(i16 zeroext returned %x)
%b = zext i16 %x to i32
%call2 = tail call i32 @identity32(i32 returned %b)
ret i16 %call
diff --git a/llvm/test/CodeGen/ARM/struct-byval-loop.ll b/llvm/test/CodeGen/ARM/struct-byval-loop.ll
index dd25df3901240..7a38dec2434f7 100644
--- a/llvm/test/CodeGen/ARM/struct-byval-loop.ll
+++ b/llvm/test/CodeGen/ARM/struct-byval-loop.ll
@@ -34,7 +34,7 @@ define void @test_80() {
; CHECK-NEXT: .LCPI0_0:
; CHECK-NEXT: .long 68 @ 0x44
%a = alloca %type_80
- call void @func_80(ptr null, ptr byval(%type_80) %a)
+ call void @func_80(ptr null, ptr %a)
ret void
}
@@ -77,6 +77,6 @@ define void @test_4000() {
; CHECK-NEXT: .LCPI1_0:
; CHECK-NEXT: .long 3988 @ 0xf94
%a = alloca %type_4000
- call void @func_4000(ptr null, ptr byval(%type_4000) %a)
+ call void @func_4000(ptr null, ptr %a)
ret void
}
diff --git a/llvm/test/CodeGen/M68k/multiple-return.ll b/llvm/test/CodeGen/M68k/multiple-return.ll
index 3abc799def295..8e97908324f05 100644
--- a/llvm/test/CodeGen/M68k/multiple-return.ll
+++ b/llvm/test/CodeGen/M68k/multiple-return.ll
@@ -61,7 +61,7 @@ define void @call_test1() {
; CHECK-NEXT: rts
start:
%ret_val = alloca { i32, i32, i32, i32 }
- call void @test1(ptr sret({ i32, i32, i32, i32 }) %ret_val)
+ call void @test1(ptr %ret_val)
ret void
}
diff --git a/llvm/test/CodeGen/NVPTX/forward-ld-param.ll b/llvm/test/CodeGen/NVPTX/forward-ld-param.ll
index 3de524de4745a..4f1454d3788a4 100644
--- a/llvm/test/CodeGen/NVPTX/forward-ld-param.ll
+++ b/llvm/test/CodeGen/NVPTX/forward-ld-param.ll
@@ -69,7 +69,7 @@ define void @test_ld_param_byval(ptr byval(i32) %a) {
; CHECK-NEXT: call.uni byval_user, (param0);
; CHECK-NEXT: } // callseq 1
; CHECK-NEXT: ret;
- call void @byval_user(ptr byval(i32) %a)
+ call void @byval_user(ptr %a)
ret void
}
diff --git a/llvm/test/CodeGen/RISCV/rvv/shrinkwrap.ll b/llvm/test/CodeGen/RISCV/rvv/shrinkwrap.ll
index da0cce53f3ab4..d12f2c889650f 100644
--- a/llvm/test/CodeGen/RISCV/rvv/shrinkwrap.ll
+++ b/llvm/test/CodeGen/RISCV/rvv/shrinkwrap.ll
@@ -71,7 +71,7 @@ define void @vecaddr_straightline(i32 zeroext %a, ptr %p) {
%cmp0 = icmp eq i32 %a, 57
br i1 %cmp0, label %exit, label %do_call
do_call:
- call zeroext i32 @foo()
+ call i32 @foo()
br label %exit
exit:
%v3 = load <4 x i32>, ptr %gep
@@ -155,7 +155,7 @@ define void @vecaddr_loop(i32 zeroext %a, ptr %p) {
%cmp0 = icmp eq i32 %a, 57
br i1 %cmp0, label %exit, label %do_call
do_call:
- %b = call zeroext i32 @foo()
+ %b = call i32 @foo()
%v3 = load <4 x i32>, ptr %gep
%v4 = add <4 x i32> %v3, splat (i32 1)
store <4 x i32> %v4, ptr %gep
diff --git a/llvm/test/CodeGen/RISCV/shrinkwrap.ll b/llvm/test/CodeGen/RISCV/shrinkwrap.ll
index a9c359b6a378c..e06673d44ea75 100644
--- a/llvm/test/CodeGen/RISCV/shrinkwrap.ll
+++ b/llvm/test/CodeGen/RISCV/shrinkwrap.ll
@@ -275,11 +275,11 @@ define void @li_straightline_a(i32 zeroext %a, i32 zeroext %b) {
%cmp0 = icmp eq i32 %a, 57
br i1 %cmp0, label %exit, label %do_call
do_call:
- call zeroext i32 @foo()
+ call i32 @foo()
%cmp1 = icmp eq i32 %b, 57
br i1 %cmp1, label %exit, label %do_call2
do_call2:
- call zeroext i32 @foo()
+ call i32 @foo()
br label %exit
exit:
ret void
@@ -392,13 +392,13 @@ define void @li_straightline_b(i32 zeroext %a, i32 zeroext %b) {
%cmp0 = icmp eq i32 %a, 57
br i1 %cmp0, label %exit, label %do_call
do_call:
- call zeroext i32 @foo()
+ call i32 @foo()
br label %next
next:
%cmp1 = icmp eq i32 %b, 57
br i1 %cmp1, label %exit, label %do_call2
do_call2:
- call zeroext i32 @foo()
+ call i32 @foo()
br label %exit
exit:
ret void
@@ -494,13 +494,13 @@ define void @li_straightline_c(i32 zeroext %a) {
%cmp0 = icmp eq i32 %a, 57
br i1 %cmp0, label %exit, label %do_call
do_call:
- %b = call zeroext i32 @foo()
+ %b = call i32 @foo()
br label %next
next:
%cmp1 = icmp eq i32 %b, 57
br i1 %cmp1, label %exit, label %do_call2
do_call2:
- call zeroext i32 @foo()
+ call i32 @foo()
br label %exit
exit:
ret void
@@ -619,7 +619,7 @@ define void @li_loop(i32 zeroext %a, i32 zeroext %b) {
%cmp0 = icmp eq i32 %a, 57
br i1 %cmp0, label %exit, label %do_call
do_call:
- call zeroext i32 @foo()
+ call i32 @foo()
%cmp1 = icmp eq i32 %b, 57
br i1 %cmp1, label %exit, label %do_call
exit:
diff --git a/llvm/test/CodeGen/SPARC/64abi.ll b/llvm/test/CodeGen/SPARC/64abi.ll
index 3152bf97e3202..dc8c9af4a5185 100644
--- a/llvm/test/CodeGen/SPARC/64abi.ll
+++ b/llvm/test/CodeGen/SPARC/64abi.ll
@@ -342,8 +342,8 @@ define inreg { i32, float } @ret_i32_float_packed(i32 %a0, i32 %a1,
; HARD: st %f1, [%i1]
; SOFT: st %o0, [%i1]
define void @call_ret_i32_float_packed(ptr %i0, ptr %i1) {
- %rv = call inreg { i32, float } @ret_i32_float_packed(i32 undef, i32 undef,
- ptr undef, ptr undef)
+ %rv = call { i32, float } @ret_i32_float_packed(i32 undef, i32 undef,
+ ptr undef, ptr undef)
%e0 = extractvalue { i32, float } %rv, 0
store i32 %e0, ptr %i0
%e1 = extractvalue { i32, float } %rv, 1
@@ -374,8 +374,8 @@ define inreg { i32, i32 } @ret_i32_packed(i32 %a0, i32 %a1,
; CHECK: st [[R]], [%i0]
; CHECK: st %o0, [%i1]
define void @call_ret_i32_packed(ptr %i0, ptr %i1) {
- %rv = call inreg { i32, i32 } @ret_i32_packed(i32 undef, i32 undef,
- ptr undef, ptr undef)
+ %rv = call { i32, i32 } @ret_i32_packed(i32 undef, i32 undef,
+ ptr undef, ptr undef)
%e0 = extractvalue { i32, i32 } %rv, 0
store i32 %e0, ptr %i0
%e1 = extractvalue { i32, i32 } %rv, 1
diff --git a/llvm/test/CodeGen/SystemZ/args-14.ll b/llvm/test/CodeGen/SystemZ/args-14.ll
index f2d836bef9cac..84e7523e788de 100644
--- a/llvm/test/CodeGen/SystemZ/args-14.ll
+++ b/llvm/test/CodeGen/SystemZ/args-14.ll
@@ -1,10 +1,11 @@
; RUN: llc < %s -mtriple=s390x-linux-gnu -argext-abi-check
; Test that it works to pass structs as outgoing call arguments when the
-; NoExt attribute is given on the call instruction.
+; NoExt attribute is given, either in the call instruction or in the
+; prototype of the called function.
define void @caller() {
call void @bar_Struct_32(i32 noext 123)
- call void @bar_Struct_16(i16 noext 123)
+ call void @bar_Struct_16(i16 123)
call void @bar_Struct_8(i8 noext 123)
ret void
}
diff --git a/llvm/test/CodeGen/SystemZ/call-zos-01.ll b/llvm/test/CodeGen/SystemZ/call-zos-01.ll
index f70a01e1a0466..a6006035dcaa1 100644
--- a/llvm/test/CodeGen/SystemZ/call-zos-01.ll
+++ b/llvm/test/CodeGen/SystemZ/call-zos-01.ll
@@ -17,7 +17,7 @@ define i8 @call_char(){
; CHECK-NEXT: lg 7,2072(4)
; CHECK-NEXT: aghi 4,192
; CHECK-NEXT: b 2(7)
- %retval = call signext i8 (i8) @pass_char(i8 signext 8)
+ %retval = call i8 (i8) @pass_char(i8 8)
ret i8 %retval
}
@@ -37,7 +37,7 @@ define i16 @call_short() {
; CHECK-NEXT: aghi 4,192
; CHECK-NEXT: b 2(7)
entry:
- %retval = call signext i16 (i16) @pass_short(i16 signext 16)
+ %retval = call i16 (i16) @pass_short(i16 16)
ret i16 %retval
}
@@ -58,7 +58,7 @@ define i32 @call_int() {
; CHECK-NEXT: aghi 4,192
; CHECK-NEXT: b 2(7)
entry:
- %retval = call signext i32 (i32, i32) @pass_int(i32 signext 32, i32 signext 33)
+ %retval = call i32 (i32, i32) @pass_int(i32 32, i32 33)
ret i32 %retval
}
@@ -123,7 +123,7 @@ define i64 @call_integrals() {
; CHECK-NEXT: aghi 4,192
; CHECK-NEXT: b 2(7)
entry:
- %retval = call signext i64 (i64, i32, i16, i64) @pass_integrals0(i64 signext 64, i32 signext 32, i16 signext 16, i64 signext 128)
+ %retval = call i64 (i64, i32, i16, i64) @pass_integrals0(i64 64, i32 32, i16 16, i64 128)
ret i64 %retval
}
diff --git a/llvm/test/CodeGen/VE/Scalar/call.ll b/llvm/test/CodeGen/VE/Scalar/call.ll
index 15491310fb229..9d949919dc80a 100644
--- a/llvm/test/CodeGen/VE/Scalar/call.ll
+++ b/llvm/test/CodeGen/VE/Scalar/call.ll
@@ -64,7 +64,7 @@ define i32 @stack_call_int_szext() {
; CHECK-NEXT: st %s34, 240(, %s11)
; CHECK-NEXT: bsic %s10, (, %s12)
; CHECK-NEXT: or %s11, 0, %s9
- %r = tail call i32 @stack_callee_int_szext(i1 signext -1, i8 zeroext -1, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i16 zeroext -1, i8 signext -1)
+ %r = tail call i32 @stack_callee_int_szext(i1 -1, i8 -1, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i16 -1, i8 -1)
ret i32 %r
}
diff --git a/llvm/test/CodeGen/VE/Scalar/va_callee.ll b/llvm/test/CodeGen/VE/Scalar/va_callee.ll
index 708d60fecbdbb..8ed707dac8a71 100644
--- a/llvm/test/CodeGen/VE/Scalar/va_callee.ll
+++ b/llvm/test/CodeGen/VE/Scalar/va_callee.ll
@@ -27,11 +27,11 @@ define i32 @va_func(i32, ...) {
%p10 = va_arg ptr %va, double
call void @llvm.va_end(ptr nonnull %va)
call void @use_i32(i32 %p1)
- call void @use_s16(i16 signext %p2)
- call void @use_s8(i8 signext %p3)
+ call void @use_s16(i16 %p2)
+ call void @use_s8(i8 %p3)
call void @use_i32(i32 %p4)
- call void @use_u16(i16 zeroext %p5)
- call void @use_u8(i8 zeroext %p6)
+ call void @use_u16(i16 %p5)
+ call void @use_u8(i8 %p6)
call void @use_float(float %p7)
call void @use_i8p(ptr %p8)
call void @use_i64(i64 %p9)
@@ -73,11 +73,11 @@ define i32 @va_copy0(i32, ...) {
call void @llvm.va_end(ptr nonnull %vb)
call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %vb)
call void @use_i32(i32 %p1)
- call void @use_s16(i16 signext %p2)
- call void @use_s8(i8 signext %p3)
+ call void @use_s16(i16 %p2)
+ call void @use_s8(i8 %p3)
call void @use_i32(i32 %p4)
- call void @use_u16(i16 zeroext %p5)
- call void @use_u8(i8 zeroext %p6)
+ call void @use_u16(i16 %p5)
+ call void @use_u8(i8 %p6)
call void @use_float(float %p7)
call void @use_i8p(ptr %p8)
call void @use_i64(i64 %p9)
@@ -117,11 +117,11 @@ define i32 @va_copy8(i32, ...) {
%p10 = va_arg ptr %vc, double
call void @llvm.va_end(ptr nonnull %vc)
call void @use_i32(i32 %p1)
- call void @use_s16(i16 signext %p2)
- call void @use_s8(i8 signext %p3)
+ call void @use_s16(i16 %p2)
+ call void @use_s8(i8 %p3)
call void @use_i32(i32 %p4)
- call void @use_u16(i16 zeroext %p5)
- call void @use_u8(i8 zeroext %p6)
+ call void @use_u16(i16 %p5)
+ call void @use_u8(i8 %p6)
call void @use_float(float %p7)
call void @use_i8p(ptr %p8)
call void @use_i64(i64 %p9)
diff --git a/llvm/test/CodeGen/VE/Vector/fastcc_caller.ll b/llvm/test/CodeGen/VE/Vector/fastcc_caller.ll
index 35cbba2b8e13a..72e95091f8534 100644
--- a/llvm/test/CodeGen/VE/Vector/fastcc_caller.ll
+++ b/llvm/test/CodeGen/VE/Vector/fastcc_caller.ll
@@ -67,7 +67,7 @@ define fastcc i32 @stack_call_int_szext() {
; CHECK-NEXT: st %s34, 240(, %s11)
; CHECK-NEXT: bsic %s10, (, %s12)
; CHECK-NEXT: or %s11, 0, %s9
- %r = tail call fastcc i32 @stack_callee_int_szext(i1 signext -1, i8 zeroext -1, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i16 zeroext -1, i8 signext -1)
+ %r = tail call fastcc i32 @stack_callee_int_szext(i1 -1, i8 -1, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i16 -1, i8 -1)
ret i32 %r
}
diff --git a/llvm/test/CodeGen/WebAssembly/signext-zeroext-callsite.ll b/llvm/test/CodeGen/WebAssembly/signext-zeroext-callsite.ll
index 1d7adfb712b68..f7f0b68c1b665 100644
--- a/llvm/test/CodeGen/WebAssembly/signext-zeroext-callsite.ll
+++ b/llvm/test/CodeGen/WebAssembly/signext-zeroext-callsite.ll
@@ -7,15 +7,25 @@ target triple = "wasm32-unknown-unknown"
declare i32 @foo(i1 signext noundef, i32 noundef)
-; callsite_signext and callsite_nosignext should emit different code,
-; as the signext is not inherited from the callee.
+; callsite_signext and callsite_nosignext must emit equivalent codes
define i32 @callsite_nosignext() {
; CHECK-LABEL: callsite_nosignext:
; CHECK: .functype callsite_nosignext () -> (i32)
+; CHECK-NEXT: .local i32, i32, i32
; CHECK-NEXT: # %bb.0: # %start
; CHECK-NEXT: i32.const 1
+; CHECK-NEXT: local.set 0
; CHECK-NEXT: i32.const 0
+; CHECK-NEXT: local.set 1
+; CHECK-NEXT: i32.const 31
+; CHECK-NEXT: local.set 2
+; CHECK-NEXT: local.get 0
+; CHECK-NEXT: local.get 2
+; CHECK-NEXT: i32.shl
+; CHECK-NEXT: local.get 2
+; CHECK-NEXT: i32.shr_s
+; CHECK-NEXT: local.get 1
; CHECK-NEXT: call foo
; CHECK-NEXT: return
;
@@ -25,7 +35,7 @@ define i32 @callsite_nosignext() {
; NO-FAST-ISEL-NEXT: # %bb.0: # %start
; NO-FAST-ISEL-NEXT: i32.const 0
; NO-FAST-ISEL-NEXT: local.set 0
-; NO-FAST-ISEL-NEXT: i32.const 1
+; NO-FAST-ISEL-NEXT: i32.const -1
; NO-FAST-ISEL-NEXT: local.get 0
; NO-FAST-ISEL-NEXT: call foo
; NO-FAST-ISEL-NEXT: return
@@ -71,15 +81,21 @@ start:
declare i32 @foo2(i1 zeroext noundef, i32 noundef)
-; callsite_zeroext and callsite_nozeroext should emit different code,
-; as the zeroext is not inherited from the callee.
+; callsite_zeroext and callsite_nozeroext must emit equivalent codes
define i32 @callsite_nozeroext() {
; CHECK-LABEL: callsite_nozeroext:
; CHECK: .functype callsite_nozeroext () -> (i32)
+; CHECK-NEXT: .local i32, i32
; CHECK-NEXT: # %bb.0: # %start
; CHECK-NEXT: i32.const 1
+; CHECK-NEXT: local.set 0
; CHECK-NEXT: i32.const 0
+; CHECK-NEXT: local.set 1
+; CHECK-NEXT: local.get 0
+; CHECK-NEXT: i32.const 1
+; CHECK-NEXT: i32.and
+; CHECK-NEXT: local.get 1
; CHECK-NEXT: call foo2
; CHECK-NEXT: return
;
diff --git a/llvm/test/CodeGen/X86/bool-zext.ll b/llvm/test/CodeGen/X86/bool-zext.ll
index 2df0a63f151e0..539be245eb1d0 100644
--- a/llvm/test/CodeGen/X86/bool-zext.ll
+++ b/llvm/test/CodeGen/X86/bool-zext.ll
@@ -53,7 +53,7 @@ define zeroext i1 @bar3() nounwind ssp {
; X64-NEXT: callq foo2 at PLT
; X64-NEXT: popq %rcx
; X64-NEXT: retq
- %call = call zeroext i1 @foo2() nounwind
+ %call = call i1 @foo2() nounwind
ret i1 %call
}
diff --git a/llvm/test/CodeGen/X86/return-ext.ll b/llvm/test/CodeGen/X86/return-ext.ll
index 69bc67489cb1c..d38284df1f530 100644
--- a/llvm/test/CodeGen/X86/return-ext.ll
+++ b/llvm/test/CodeGen/X86/return-ext.ll
@@ -97,7 +97,7 @@ entry:
define i32 @use_i1() {
entry:
- %0 = call zeroext i1 @unsigned_i1();
+ %0 = call i1 @unsigned_i1();
%1 = zext i1 %0 to i32
ret i32 %1
@@ -112,7 +112,7 @@ entry:
define i32 @use_i8() {
entry:
- %0 = call zeroext i8 @unsigned_i8();
+ %0 = call i8 @unsigned_i8();
%1 = zext i8 %0 to i32
ret i32 %1
@@ -127,7 +127,7 @@ entry:
define i32 @use_i16() {
entry:
- %0 = call zeroext i16 @unsigned_i16();
+ %0 = call i16 @unsigned_i16();
%1 = zext i16 %0 to i32
ret i32 %1
diff --git a/llvm/test/Instrumentation/ThreadSanitizer/tsan_basic.ll b/llvm/test/Instrumentation/ThreadSanitizer/tsan_basic.ll
index 14020d0a76d97..5a15cfa6864c4 100644
--- a/llvm/test/Instrumentation/ThreadSanitizer/tsan_basic.ll
+++ b/llvm/test/Instrumentation/ThreadSanitizer/tsan_basic.ll
@@ -94,7 +94,7 @@ define void @SwiftError(ptr swifterror) sanitize_thread {
define void @SwiftErrorCall(ptr swifterror) sanitize_thread {
%swifterror_addr = alloca swifterror ptr
store ptr null, ptr %0
- call void @SwiftError(ptr swifterror %0)
+ call void @SwiftError(ptr %0)
ret void
}
diff --git a/llvm/test/Transforms/DeadArgElim/deadexternal.ll b/llvm/test/Transforms/DeadArgElim/deadexternal.ll
index 6839e4ecf5736..5120d1a5f98ee 100644
--- a/llvm/test/Transforms/DeadArgElim/deadexternal.ll
+++ b/llvm/test/Transforms/DeadArgElim/deadexternal.ll
@@ -62,6 +62,6 @@ define void @unused_swifterror_arg(ptr swifterror %dead_arg) {
define void @dont_replace_by_poison() {
%error_ptr_ref = alloca swifterror ptr
store ptr null, ptr %error_ptr_ref
- call void @unused_swifterror_arg(ptr swifterror %error_ptr_ref)
+ call void @unused_swifterror_arg(ptr %error_ptr_ref)
ret void
}
diff --git a/llvm/test/Transforms/Inline/access-attributes-prop.ll b/llvm/test/Transforms/Inline/access-attributes-prop.ll
index efa3cb7d26413..a5c52ecdfd8c2 100644
--- a/llvm/test/Transforms/Inline/access-attributes-prop.ll
+++ b/llvm/test/Transforms/Inline/access-attributes-prop.ll
@@ -591,17 +591,17 @@ define ptr @callee_bad_param_prop(ptr readonly %x) {
define dso_local void @foo_byval_readonly2(ptr readonly %p) {
; CHECK-LABEL: define {{[^@]+}}@foo_byval_readonly2
; CHECK-SAME: (ptr readonly [[P:%.*]]) {
-; CHECK-NEXT: call void @bar4(ptr byval([4 x i32]) [[P]])
+; CHECK-NEXT: call void @bar4(ptr [[P]])
; CHECK-NEXT: ret void
;
- call void @bar4(ptr byval([4 x i32]) %p)
+ call void @bar4(ptr %p)
ret void
}
define void @prop_byval_readonly2(ptr %p) {
; CHECK-LABEL: define {{[^@]+}}@prop_byval_readonly2
; CHECK-SAME: (ptr [[P:%.*]]) {
-; CHECK-NEXT: call void @bar4(ptr byval([4 x i32]) [[P]])
+; CHECK-NEXT: call void @bar4(ptr [[P]])
; CHECK-NEXT: ret void
;
call void @foo_byval_readonly2(ptr %p)
diff --git a/llvm/test/Transforms/PhaseOrdering/pr64289-tce.ll b/llvm/test/Transforms/PhaseOrdering/pr64289-tce.ll
index d420511952539..f56463a0b6107 100644
--- a/llvm/test/Transforms/PhaseOrdering/pr64289-tce.ll
+++ b/llvm/test/Transforms/PhaseOrdering/pr64289-tce.ll
@@ -19,7 +19,7 @@ start:
recurse:
store i64 0, ptr %new_x, align 8
- call void @pr64289(ptr byval(i64) %new_x)
+ call void @pr64289(ptr %new_x)
br label %end
end:
diff --git a/llvm/test/Transforms/SROA/readonlynocapture.ll b/llvm/test/Transforms/SROA/readonlynocapture.ll
index 488efc9930677..b6f7b1fd1685e 100644
--- a/llvm/test/Transforms/SROA/readonlynocapture.ll
+++ b/llvm/test/Transforms/SROA/readonlynocapture.ll
@@ -396,12 +396,12 @@ define i32 @simple_byval() {
; CHECK-LABEL: @simple_byval(
; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
; CHECK-NEXT: store i32 0, ptr [[A]], align 4
-; CHECK-NEXT: call void @callee_byval(ptr byval(i32) [[A]])
+; CHECK-NEXT: call void @callee_byval(ptr [[A]])
; CHECK-NEXT: ret i32 0
;
%a = alloca i32
store i32 0, ptr %a
- call void @callee_byval(ptr byval(i32) %a)
+ call void @callee_byval(ptr %a)
%l1 = load i32, ptr %a
ret i32 %l1
}
diff --git a/llvm/test/Transforms/SimplifyCFG/hoist-sink-swifterror-store.ll b/llvm/test/Transforms/SimplifyCFG/hoist-sink-swifterror-store.ll
index aaf1063d3ad86..382d881caf5c0 100644
--- a/llvm/test/Transforms/SimplifyCFG/hoist-sink-swifterror-store.ll
+++ b/llvm/test/Transforms/SimplifyCFG/hoist-sink-swifterror-store.ll
@@ -227,11 +227,11 @@ define swiftcc void @sink_call(i1 %c) {
; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[ELSE:%.*]]
; CHECK: then:
; CHECK-NEXT: call void @clobber1()
-; CHECK-NEXT: call swiftcc void @foo(ptr swifterror [[TMP2]])
+; CHECK-NEXT: call swiftcc void @foo(ptr [[TMP2]])
; CHECK-NEXT: br label [[EXIT:%.*]]
; CHECK: else:
; CHECK-NEXT: call void @clobber2()
-; CHECK-NEXT: call swiftcc void @foo(ptr swifterror [[TMP1]])
+; CHECK-NEXT: call swiftcc void @foo(ptr [[TMP1]])
; CHECK-NEXT: br label [[EXIT]]
; CHECK: exit:
; CHECK-NEXT: ret void
@@ -242,12 +242,12 @@ define swiftcc void @sink_call(i1 %c) {
then:
call void @clobber1()
- call swiftcc void @foo(ptr swifterror %3)
+ call swiftcc void @foo(ptr %3)
br label %exit
else:
call void @clobber2()
- call swiftcc void @foo(ptr swifterror %2)
+ call swiftcc void @foo(ptr %2)
br label %exit
exit:
@@ -270,7 +270,7 @@ define swiftcc void @safe_sink_call(i1 %c) {
; CHECK-NEXT: br label [[EXIT]]
; CHECK: exit:
; CHECK-NEXT: [[B_SINK:%.*]] = phi ptr [ [[B]], [[ELSE]] ], [ [[A]], [[THEN]] ]
-; CHECK-NEXT: call swiftcc void @bar(ptr swifterror [[ERR]], ptr [[B_SINK]])
+; CHECK-NEXT: call swiftcc void @bar(ptr [[ERR]], ptr [[B_SINK]])
; CHECK-NEXT: ret void
;
%err = alloca swifterror ptr, align 8
@@ -280,12 +280,12 @@ define swiftcc void @safe_sink_call(i1 %c) {
then:
call void @clobber1()
- call swiftcc void @bar(ptr swifterror %err, ptr %a)
+ call swiftcc void @bar(ptr %err, ptr %a)
br label %exit
else:
call void @clobber2()
- call swiftcc void @bar(ptr swifterror %err, ptr %b)
+ call swiftcc void @bar(ptr %err, ptr %b)
br label %exit
exit:
diff --git a/llvm/unittests/IR/AttributesTest.cpp b/llvm/unittests/IR/AttributesTest.cpp
index 1c6fc053f9779..5e795ef771713 100644
--- a/llvm/unittests/IR/AttributesTest.cpp
+++ b/llvm/unittests/IR/AttributesTest.cpp
@@ -287,17 +287,17 @@ TEST(Attributes, MismatchedABIAttrs) {
{
auto *I = cast<CallBase>(&M->getFunction("g")->getEntryBlock().front());
- ASSERT_FALSE(I->isByValArgument(0));
- ASSERT_FALSE(I->getParamByValType(0));
+ ASSERT_TRUE(I->isByValArgument(0));
+ ASSERT_TRUE(I->getParamByValType(0));
}
{
auto *I = cast<CallBase>(&M->getFunction("h")->getEntryBlock().front());
- ASSERT_FALSE(I->getParamPreallocatedType(0));
+ ASSERT_TRUE(I->getParamPreallocatedType(0));
}
{
auto *I = cast<CallBase>(&M->getFunction("i")->getEntryBlock().front());
- ASSERT_FALSE(I->isInAllocaArgument(0));
- ASSERT_FALSE(I->getParamInAllocaType(0));
+ ASSERT_TRUE(I->isInAllocaArgument(0));
+ ASSERT_TRUE(I->getParamInAllocaType(0));
}
}
More information about the llvm-commits
mailing list