codegen: Propagate `ipo_purity_bits` to LLVM function attributes (#61394)
Translate Julia's inferred effects (consistent, effect_free, nothrow, terminates, notaskstate) into LLVM function attributes so that middle-end passes like GVN, LICM, and DSE can exploit them. The key design insight is that GC interactions don't need to be visible before GC lowering. Call-site declarations get optimistic memory attributes (e.g. memory(argmem: read)) that enable pre-GC optimizations, then LateLowerGCFrame widens them to memory(readwrite) before safepoint analysis so post-GC passes see correct semantics. Attributes added: - nounwind: for nothrow functions (with uwtable(async) on definitions to preserve .eh_frame for stack scanning) - mustprogress: for terminating functions - willreturn: for nothrow+terminating functions - memory(argmem: read): for consistent+effect_free functions with no user-facing pointer arguments (call-site declarations only) - readnone on gcstack param: for notaskstate functions, so LICM can hoist pure calls past heap stores - "julia.safepoint" marker: on all call-site declarations, used by LateLowerGCFrame to identify and widen optimistic attrs LateLowerGCFrame strips all optimistic attributes (memory effects, readnone on gcstack) from both call instructions and function declarations before safepoint analysis runs. Previously explored in #47844 Developed with Claude --------- Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: Gabriel Baraldi <28694980+gbaraldi@users.noreply.github.com>
I
Ian Butterworth committed
d50d2a54d46e4d0de782cd3ac37076b9626eedb1
Parent: 454f0a2
Committed by GitHub <noreply@github.com>
on 4/20/2026, 8:38:52 PM