[all-commits] [llvm/llvm-project] cdd190: [IR] Do not inherit ABI attributes from the callee...

Nikita Popov via All-commits all-commits at lists.llvm.org
Wed Sep 9 01:02:44 PDT 2026


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: cdd1900816f625eb1f38a6e755c49ccadec56209
      https://github.com/llvm/llvm-project/commit/cdd1900816f625eb1f38a6e755c49ccadec56209
  Author: Nikita Popov <npopov at redhat.com>
  Date:   2026-09-09 (Wed, 09 Sep 2026)

  Changed paths:
    M llvm/include/llvm/CodeGen/FastISel.h
    M llvm/include/llvm/CodeGen/TargetLowering.h
    M llvm/include/llvm/IR/Attributes.h
    M llvm/include/llvm/IR/Attributes.td
    M llvm/include/llvm/IR/InstrTypes.h
    M llvm/lib/Analysis/Lint.cpp
    M llvm/lib/CodeGen/GlobalISel/CallLowering.cpp
    M llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp
    M llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
    M llvm/lib/CodeGen/TypePromotion.cpp
    M llvm/lib/IR/Attributes.cpp
    M llvm/lib/IR/Instructions.cpp
    M llvm/lib/IR/Verifier.cpp
    M llvm/lib/IR/VerifierAMDGPU.cpp
    M llvm/lib/Target/AMDGPU/Utils/AMDGPUBaseInfo.cpp
    M llvm/lib/Target/ARM/ARMFastISel.cpp
    M llvm/lib/Target/WebAssembly/WebAssemblyFastISel.cpp
    M llvm/lib/Target/X86/X86FastISel.cpp
    M llvm/lib/Target/X86/X86ISelLoweringCall.cpp
    M llvm/lib/Transforms/IPO/ExpandVariadics.cpp
    M llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
    M llvm/lib/Transforms/Utils/CallPromotionUtils.cpp
    M llvm/test/Analysis/BasicAA/call-attrs.ll
    M llvm/test/CodeGen/AArch64/GlobalISel/call-translator-tail-call-sret.ll
    M llvm/test/CodeGen/AArch64/GlobalISel/call-translator.ll
    M llvm/test/CodeGen/AArch64/GlobalISel/swifterror.ll
    M llvm/test/CodeGen/AArch64/GlobalISel/swiftself.ll
    M llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-call-return-values.ll
    M llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-call-sret.ll
    M llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-call.ll
    M llvm/test/CodeGen/AMDGPU/fncall-implicitdef.ll
    M llvm/test/CodeGen/AMDGPU/swdev504645-global-fold.ll
    M llvm/test/CodeGen/AMDGPU/waterfall-call-inreg-agpr.ll
    M llvm/test/CodeGen/ARM/returned-ext.ll
    M llvm/test/CodeGen/ARM/struct-byval-loop.ll
    M llvm/test/CodeGen/M68k/multiple-return.ll
    M llvm/test/CodeGen/NVPTX/forward-ld-param.ll
    M llvm/test/CodeGen/RISCV/rvv/shrinkwrap.ll
    M llvm/test/CodeGen/RISCV/shrinkwrap.ll
    M llvm/test/CodeGen/SPARC/64abi.ll
    M llvm/test/CodeGen/SystemZ/args-14.ll
    M llvm/test/CodeGen/SystemZ/call-zos-01.ll
    M llvm/test/CodeGen/VE/Scalar/call.ll
    M llvm/test/CodeGen/VE/Scalar/va_callee.ll
    M llvm/test/CodeGen/VE/Vector/fastcc_caller.ll
    M llvm/test/CodeGen/WebAssembly/signext-zeroext-callsite.ll
    M llvm/test/CodeGen/X86/bool-zext.ll
    M llvm/test/CodeGen/X86/return-ext.ll
    M llvm/test/Instrumentation/ThreadSanitizer/tsan_basic.ll
    M llvm/test/Transforms/DeadArgElim/deadexternal.ll
    M llvm/test/Transforms/Inline/access-attributes-prop.ll
    M llvm/test/Transforms/PhaseOrdering/pr64289-tce.ll
    M llvm/test/Transforms/SROA/readonlynocapture.ll
    M llvm/test/Transforms/SimplifyCFG/hoist-sink-swifterror-store.ll
    M llvm/unittests/IR/AttributesTest.cpp

  Log Message:
  -----------
  [IR] Do not inherit ABI attributes from the callee (#207173)

Usually attributes that are missing on the call-site are inherited form
the callee instead. This is fine for optional optimization attributes,
but problematic for ABI-affecting attributes.

ABI attributes generally must be placed at the call-site as well,
because there is no callee to inherit from for indirect calls. Failing
to specify ABI attributes at the call-site generally indicates a bug.

The motivation for being stricter about this (apart from just being the
right thing to do) is to properly support cases where the attributes at
the call-site and the callee actually differ. Two examples I'm aware of
are:

* During cross-language LTO, it's possible to have one side use a `ptr`
argument and the other a `ptr byval(ptr)` argument. Both represent the
same ABI using different IR encodings, but you can't just inherit the
`byval` attribute from one to the other (because the byval case requires
an additional level of indirection in use of the argument).
* To fix our incompatibility with the x86-64 psABI, I believe we'll want
to do something like emit zeroext/signext at function returns and
call-site arguments only, so that we both don't assume incoming values
are zero/sign-extended, but still zero/sign-extend outgoing values. This
makes sure we still remain compatible with old Clang-generated object
files.

We've attempted to make a change like this previously, but ran into
substantial issues with missing call-site attributes on
compiler-inserted calls. The issue was particularly severe on s390x,
which requires zeroext/signext on more values than other architectures.
I believe that the situation here has improved a lot in the meantime,
with libcalls now inferring mandatory ABI attributes, and s390x also
using a noext attribute plus validation logic in the backend to detect
cases where the necessary attributes are missing.

-----

ABI attributes on call-sites must be queried using `hasABIParamAttr()`
and `hasABIRetAttr()` instead of `paramHasAttr()` and `hasRetAttr()`
now. Passing an ABI attribute to the latter two will result in an
assertion failure.



To unsubscribe from these emails, change your notification settings at https://github.com/llvm/llvm-project/settings/notifications


More information about the All-commits mailing list