[clang] [Clang] Set writable and dead_on_unwind attributes on sret arguments (PR #77116)
https://github.com/nikic closed https://github.com/llvm/llvm-project/pull/77116 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Set writable and dead_on_unwind attributes on sret arguments (PR #77116)
https://github.com/rjmccall approved this pull request. https://github.com/llvm/llvm-project/pull/77116 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Set writable and dead_on_unwind attributes on sret arguments (PR #77116)
rjmccall wrote: If I understand the specification of these attributes correctly, they seem fine. `dead_on_unwind` is definitely fine — the return value must be treated as uninitialized after a call that throws. `writable` has a somewhat loose specification that scares me a bit, but as long as the actual analysis is being properly conservative about possible aliases created during the call, I think it should be fine. https://github.com/llvm/llvm-project/pull/77116 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Set writable and dead_on_unwind attributes on sret arguments (PR #77116)
nikic wrote: Some IR for reference: https://clang.godbolt.org/z/qEsP7vozW I believe that on unwind, the sret temporary is either entirely unused (if no cleanup landingpad is necessary) or we will call lifetime.end on it (which is legal for dead_on_unwind). This should be independent of whether copy elision is performed or not. https://github.com/llvm/llvm-project/pull/77116 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang] Set writable and dead_on_unwind attributes on sret arguments (PR #77116)
llvmbot wrote: @llvm/pr-subscribers-backend-x86 @llvm/pr-subscribers-clang Author: Nikita Popov (nikic) Changes Set the writable and dead_on_unwind attributes for sret arguments. These indicate that the argument points to writable memory (and it's legal to introduce spurious writes to it on entry to the function) and that the argument memory will not be used if the call unwinds. This enables additional MemCpyOpt/DSE/LICM optimizations. I hope there isn't some subtle NRVO-related reason why this is illegal... --- Patch is 416.97 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/77116.diff 134 Files Affected: - (modified) clang/lib/CodeGen/CGCall.cpp (+2) - (modified) clang/test/CodeGen/2006-05-19-SingleEltReturn.c (+2-2) - (modified) clang/test/CodeGen/64bit-swiftcall.c (+11-11) - (modified) clang/test/CodeGen/CSKY/csky-abi.c (+2-2) - (modified) clang/test/CodeGen/CSKY/csky-hard-abi.c (+22-22) - (modified) clang/test/CodeGen/CSKY/csky-soft-abi.c (+22-22) - (modified) clang/test/CodeGen/PowerPC/aix-alignment.c (+2-2) - (modified) clang/test/CodeGen/PowerPC/powerpc-c99complex.c (+3-3) - (modified) clang/test/CodeGen/PowerPC/ppc-aggregate-abi.cpp (+11-11) - (modified) clang/test/CodeGen/PowerPC/ppc32-and-aix-struct-return.c (+11-11) - (modified) clang/test/CodeGen/PowerPC/ppc64-align-struct.c (+8-8) - (modified) clang/test/CodeGen/PowerPC/ppc64-elf-abi.c (+1-1) - (modified) clang/test/CodeGen/PowerPC/ppc64-soft-float.c (+23-23) - (modified) clang/test/CodeGen/PowerPC/ppc64-vector.c (+2-2) - (modified) clang/test/CodeGen/PowerPC/ppc64le-aggregates.c (+6-6) - (modified) clang/test/CodeGen/PowerPC/ppc64le-f128Aggregates.c (+2-2) - (modified) clang/test/CodeGen/RISCV/bfloat-abi.c (+2-2) - (modified) clang/test/CodeGen/RISCV/riscv-abi.cpp (+4-4) - (modified) clang/test/CodeGen/RISCV/riscv32-abi.c (+33-33) - (modified) clang/test/CodeGen/RISCV/riscv64-abi.c (+5-5) - (modified) clang/test/CodeGen/SystemZ/gnu-atomic-builtins-i128-8Al.c (+15-39) - (modified) clang/test/CodeGen/SystemZ/systemz-abi-vector.c (+62-62) - (modified) clang/test/CodeGen/SystemZ/systemz-abi.c (+47-47) - (modified) clang/test/CodeGen/SystemZ/systemz-abi.cpp (+18-18) - (modified) clang/test/CodeGen/SystemZ/systemz-inline-asm.c (+1-1) - (modified) clang/test/CodeGen/WebAssembly/wasm-arguments.c (+6-6) - (modified) clang/test/CodeGen/WebAssembly/wasm-varargs.c (+2-2) - (modified) clang/test/CodeGen/X86/x86_32-arguments-darwin.c (+9-9) - (modified) clang/test/CodeGen/X86/x86_32-arguments-iamcu.c (+1-1) - (modified) clang/test/CodeGen/X86/x86_64-arguments-nacl.c (+1-1) - (modified) clang/test/CodeGen/X86/x86_64-arguments-win32.c (+1-1) - (modified) clang/test/CodeGen/X86/x86_64-arguments.c (+3-3) - (modified) clang/test/CodeGen/aarch64-sve-acle-__ARM_FEATURE_SVE_VECTOR_OPERATORS.c (+1-1) - (modified) clang/test/CodeGen/aarch64-varargs.c (+2-2) - (modified) clang/test/CodeGen/aggregate-assign-call.c (+2-2) - (modified) clang/test/CodeGen/aligned-sret.c (+1-1) - (modified) clang/test/CodeGen/arc/arguments.c (+4-4) - (modified) clang/test/CodeGen/arm-aapcs-vfp.c (+1-1) - (modified) clang/test/CodeGen/arm-arguments.c (+14-14) - (modified) clang/test/CodeGen/arm-homogenous.c (+4-4) - (modified) clang/test/CodeGen/arm-neon-vld.c (+72-72) - (modified) clang/test/CodeGen/arm-swiftcall.c (+13-13) - (modified) clang/test/CodeGen/arm-varargs.c (+9-9) - (modified) clang/test/CodeGen/arm-vector-arguments.c (+3-3) - (modified) clang/test/CodeGen/arm-vfp16-arguments.c (+1-1) - (modified) clang/test/CodeGen/arm-vfp16-arguments2.cpp (+5-5) - (modified) clang/test/CodeGen/arm64-arguments.c (+2-2) - (modified) clang/test/CodeGen/arm64-microsoft-arguments.cpp (+17-17) - (modified) clang/test/CodeGen/arm64_32.c (+1-1) - (modified) clang/test/CodeGen/armv7k-abi.c (+1-1) - (modified) clang/test/CodeGen/attr-noundef.cpp (+3-3) - (modified) clang/test/CodeGen/blocks.c (+1-1) - (modified) clang/test/CodeGen/c11atomics-ios.c (+2-2) - (modified) clang/test/CodeGen/c11atomics.c (+2-2) - (modified) clang/test/CodeGen/ext-int-cc.c (+62-62) - (modified) clang/test/CodeGen/isfpclass.c (+1-1) - (modified) clang/test/CodeGen/lanai-arguments.c (+2-2) - (modified) clang/test/CodeGen/mcu-struct-return.c (+2-2) - (modified) clang/test/CodeGen/mingw-long-double.c (+4-4) - (modified) clang/test/CodeGen/mips-vector-return.c (+3-3) - (modified) clang/test/CodeGen/mips-zero-sized-struct.c (+1-1) - (modified) clang/test/CodeGen/mips64-nontrivial-return.cpp (+1-1) - (modified) clang/test/CodeGen/mips64-padding-arg.c (+3-3) - (modified) clang/test/CodeGen/ms_abi.c (+2-2) - (modified) clang/test/CodeGen/paren-list-agg-init.cpp (+3-3) - (modified) clang/test/CodeGen/regcall2.c (+1-1) - (modified) clang/test/CodeGen/regparm-struct.c (+1-1) - (modified) clang/test/CodeGen/renderscript.c (+9-9) - (modified) clang/test/CodeGen/sparcv9-abi.c (+1-1) - (modified)