[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