[clang] [llvm] [SystemZ] Do not extend integer arguments in z/OS XPLINK64 ABI (PR #206833)

Zibi Sarbinowski via cfe-commits cfe-commits at lists.llvm.org
Fri Jul 31 09:29:06 PDT 2026


================

----------------
zibi2 wrote:

> If the ABI does indeed say that all small integer arguments are passed zero-extended, then we can certainly implement that in a caller. The question is then, can we also rely on that property when compiling a callee? If so, we should simply emit zeroext markers from clang always ...

The spec does not explicitly state this. What we have is:

1. clang-as-caller zero-extends — enforced by CCPromoteToType<i64> / ZERO_EXTEND in our fix, confirmed by the cross-compiler test above.

1. Old xlc-as-caller does not — it writes only R1L (32-bit sub-register), upper half undefined.

So we cannot emit zeroext on callee parameters because interoperability with old xlc callers requires tolerating an undefined upper half. The xlc callee assembly confirms this is fine, xlc derives the correct value from the low 32 bits via LGF on reload, never reading the upper half. clang-as-callee should do the same: getDirect (no extend attribute), use the value at its natural 32-bit width.

https://github.com/llvm/llvm-project/pull/206833


More information about the cfe-commits mailing list