rust/compiler
bors 76ed7a1fa4 Auto merge of #130329 - khuey:reorder-constant-spills, r=davidtwco
Reorder stack spills so that constants come later.

Currently constants are "pulled forward" and have their stack spills emitted first. This confuses LLVM as to where to place breakpoints at function entry, and results in argument values being wrong in the debugger. It's straightforward to avoid emitting the stack spills for constants until arguments/etc have been introduced in debug_introduce_locals, so do that.

Example LLVM IR (irrelevant IR elided):
Before:
```
define internal void `@_ZN11rust_1289457binding17h2c78f956ba4bd2c3E(i64` %a, i64 %b, double %c) unnamed_addr #0 !dbg !178 { start:
  %c.dbg.spill = alloca [8 x i8], align 8
  %b.dbg.spill = alloca [8 x i8], align 8
  %a.dbg.spill = alloca [8 x i8], align 8
  %x.dbg.spill = alloca [4 x i8], align 4
  store i32 0, ptr %x.dbg.spill, align 4, !dbg !192            ; LLVM places breakpoint here.
    #dbg_declare(ptr %x.dbg.spill, !190, !DIExpression(), !192)
  store i64 %a, ptr %a.dbg.spill, align 8
    #dbg_declare(ptr %a.dbg.spill, !187, !DIExpression(), !193)
  store i64 %b, ptr %b.dbg.spill, align 8
    #dbg_declare(ptr %b.dbg.spill, !188, !DIExpression(), !194)
  store double %c, ptr %c.dbg.spill, align 8
    #dbg_declare(ptr %c.dbg.spill, !189, !DIExpression(), !195)
  ret void, !dbg !196
}
```
After:
```
define internal void `@_ZN11rust_1289457binding17h2c78f956ba4bd2c3E(i64` %a, i64 %b, double %c) unnamed_addr #0 !dbg !178 { start:
  %x.dbg.spill = alloca [4 x i8], align 4
  %c.dbg.spill = alloca [8 x i8], align 8
  %b.dbg.spill = alloca [8 x i8], align 8
  %a.dbg.spill = alloca [8 x i8], align 8
  store i64 %a, ptr %a.dbg.spill, align 8
    #dbg_declare(ptr %a.dbg.spill, !187, !DIExpression(), !192)
  store i64 %b, ptr %b.dbg.spill, align 8
    #dbg_declare(ptr %b.dbg.spill, !188, !DIExpression(), !193)
  store double %c, ptr %c.dbg.spill, align 8
    #dbg_declare(ptr %c.dbg.spill, !189, !DIExpression(), !194)
  store i32 0, ptr %x.dbg.spill, align 4, !dbg !195            ; LLVM places breakpoint here.
    #dbg_declare(ptr %x.dbg.spill, !190, !DIExpression(), !195)
  ret void, !dbg !196
}
```
Note in particular the position of the "LLVM places breakpoint here" comment relative to the stack spills for the function arguments. LLVM assumes that the first instruction with with a debug location is the end of the prologue. As LLVM does not currently offer front ends any direct control over the placement of the prologue end reordering the IR is the only mechanism available to fix argument values at function entry in the presence of MIR optimizations like SingleUseConsts. Fixes #128945

r? `@michaelwoerister`
2024-09-26 02:37:52 +00:00
..
rustc disable size asserts in the compiler when randomizing layouts 2024-08-31 23:56:45 +02:00
rustc_abi Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_arena Remove unnecessary lifetimes from Arena. 2024-09-13 15:33:19 +10:00
rustc_ast Pin memchr to 2.5.0 in the library rather than rustc_ast 2024-09-24 18:09:43 +02:00
rustc_ast_ir Add warn(unreachable_pub) to several crates. 2024-08-16 08:46:13 +10:00
rustc_ast_lowering Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_ast_passes Ban combination of GCE and new solver 2024-09-24 10:53:32 -04:00
rustc_ast_pretty Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_attr rustdoc: inherit parent's stability where applicable 2024-09-24 20:18:36 +02:00
rustc_baked_icu_data Don't add warn(unreachable_pub) to rustc_baked_icu. 2024-08-16 08:46:52 +10:00
rustc_borrowck Auto merge of #130803 - cuviper:file-buffered, r=joshtriplett 2024-09-25 04:57:12 +00:00
rustc_builtin_macros Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_codegen_cranelift Add a debug assertion in codegen that unsize casts of the same principal trait def id are truly NOPs 2024-09-25 11:13:59 -04:00
rustc_codegen_gcc Auto merge of #130389 - Luv-Ray:LLVMMDNodeInContext2, r=nikic 2024-09-24 12:07:48 +00:00
rustc_codegen_llvm Dogfood feature(file_buffered) 2024-09-24 14:25:16 -07:00
rustc_codegen_ssa Auto merge of #130329 - khuey:reorder-constant-spills, r=davidtwco 2024-09-26 02:37:52 +00:00
rustc_const_eval be even more precise about "cast" vs "coercion" 2024-09-24 23:12:02 +02:00
rustc_data_structures Dogfood feature(file_buffered) 2024-09-24 14:25:16 -07:00
rustc_driver Use tidy to sort crate attributes for all compiler crates. 2024-06-12 15:49:10 +10:00
rustc_driver_impl Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_error_codes mark E0775 as no longer emitte by the compiler 2024-09-21 13:09:09 +02:00
rustc_error_messages Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_errors Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_expand Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_feature add unqualified_local_imports lint 2024-09-23 11:57:28 +02:00
rustc_fluent_macro Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_fs_util Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_graphviz Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_hir Rollup merge of #130714 - compiler-errors:try-structurally-resolve-const, r=BoxyUwU 2024-09-23 06:45:36 +02:00
rustc_hir_analysis Add a few more tests, comments 2024-09-25 13:13:04 -04:00
rustc_hir_pretty Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_hir_typeck Rollup merge of #130764 - compiler-errors:inherent, r=estebank 2024-09-24 19:47:50 -04:00
rustc_incremental Dogfood feature(file_buffered) 2024-09-24 14:25:16 -07:00
rustc_index Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_index_macros Remove usage of specialization from newtype_index! 2024-06-30 16:42:53 +00:00
rustc_infer Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_interface Dogfood feature(file_buffered) 2024-09-24 14:25:16 -07:00
rustc_lexer Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_lint Auto merge of #130768 - compiler-errors:rollup-8ncjy55, r=compiler-errors 2024-09-24 06:02:43 +00:00
rustc_lint_defs Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_llvm Auto merge of #130446 - durin42:llvm-20-fix-CommandLineArgs, r=workingjubilee 2024-09-22 05:26:41 +00:00
rustc_log Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_macros Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_metadata Auto merge of #130803 - cuviper:file-buffered, r=joshtriplett 2024-09-25 04:57:12 +00:00
rustc_middle Auto merge of #130803 - cuviper:file-buffered, r=joshtriplett 2024-09-25 04:57:12 +00:00
rustc_mir_build be even more precise about "cast" vs "coercion" 2024-09-24 23:12:02 +02:00
rustc_mir_dataflow Dogfood feature(file_buffered) 2024-09-24 14:25:16 -07:00
rustc_mir_transform Add a debug assertion in codegen that unsize casts of the same principal trait def id are truly NOPs 2024-09-25 11:13:59 -04:00
rustc_monomorphize Auto merge of #130803 - cuviper:file-buffered, r=joshtriplett 2024-09-25 04:57:12 +00:00
rustc_next_trait_solver Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_parse Rollup merge of #130551 - nnethercote:fix-break-last-token, r=petrochenkov 2024-09-23 07:54:44 -07:00
rustc_parse_format Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_passes Check vtable projections for validity in miri 2024-09-23 19:38:26 -04:00
rustc_pattern_analysis Rollup merge of #130715 - compiler-errors:mir-build-const-eval, r=BoxyUwU 2024-09-23 06:45:36 +02:00
rustc_privacy Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_query_impl Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_query_system Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_resolve Separate collection of crate-local inherent impls from error reporting 2024-09-24 10:12:05 -04:00
rustc_sanitizers Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_serialize Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_session Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_smir be even more precise about "cast" vs "coercion" 2024-09-24 23:12:02 +02:00
rustc_span add unqualified_local_imports lint 2024-09-23 11:57:28 +02:00
rustc_symbol_mangling Rollup merge of #130344 - Jaic1:fix-116306, r=BoxyUwU 2024-09-23 06:45:33 +02:00
rustc_target Rollup merge of #130809 - heiher:update-triple-ohos, r=jieyouxu 2024-09-25 10:09:24 +02:00
rustc_trait_selection Rollup merge of #130714 - compiler-errors:try-structurally-resolve-const, r=BoxyUwU 2024-09-23 06:45:36 +02:00
rustc_traits Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_transmute Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_ty_utils Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_type_ir Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
rustc_type_ir_macros Reformat using the new identifier sorting from rustfmt 2024-09-22 19:11:29 -04:00
stable_mir unify dyn* coercions with other pointer coercions 2024-09-24 22:17:55 +02:00