diff options
| author | bors <bors@rust-lang.org> | 2023-09-14 10:04:45 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2023-09-14 10:04:45 +0000 |
| commit | d97e04fbfc149b4c3dd297df738e039bacc5c531 (patch) | |
| tree | f4aa445d92cd2c6b051f317419c50239de63b96c /compiler/rustc_codegen_ssa/src | |
| parent | fea046037f7f557a032a904a71463be80d0acc25 (diff) | |
| parent | 04a4df5f169c738a8c631874fa449d5107d52bbb (diff) | |
| download | rust-d97e04fbfc149b4c3dd297df738e039bacc5c531.tar.gz rust-d97e04fbfc149b4c3dd297df738e039bacc5c531.zip | |
Auto merge of #115764 - RalfJung:const-by-ref-alloc-id, r=oli-obk
some ConstValue refactoring In particular, use AllocId instead of Allocation in ConstValue::ByRef. This helps avoid redundant AllocIds when a `ByRef` constant gets put back into the interpreter. r? `@oli-obk` Fixes https://github.com/rust-lang/rust/issues/105536
Diffstat (limited to 'compiler/rustc_codegen_ssa/src')
| -rw-r--r-- | compiler/rustc_codegen_ssa/src/mir/operand.rs | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/compiler/rustc_codegen_ssa/src/mir/operand.rs b/compiler/rustc_codegen_ssa/src/mir/operand.rs index ef66aa6ce1c..1926bb8df52 100644 --- a/compiler/rustc_codegen_ssa/src/mir/operand.rs +++ b/compiler/rustc_codegen_ssa/src/mir/operand.rs @@ -105,7 +105,10 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> { bug!("from_const: invalid ScalarPair layout: {:#?}", layout); }; let a = Scalar::from_pointer( - Pointer::new(bx.tcx().create_memory_alloc(data), Size::from_bytes(start)), + Pointer::new( + bx.tcx().reserve_and_set_memory_alloc(data), + Size::from_bytes(start), + ), &bx.tcx(), ); let a_llval = bx.scalar_to_backend( @@ -116,7 +119,8 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> { let b_llval = bx.const_usize((end - start) as u64); OperandValue::Pair(a_llval, b_llval) } - ConstValue::ByRef { alloc, offset } => { + ConstValue::Indirect { alloc_id, offset } => { + let alloc = bx.tcx().global_alloc(alloc_id).unwrap_memory(); return Self::from_const_alloc(bx, layout, alloc, offset); } }; @@ -182,6 +186,8 @@ impl<'a, 'tcx, V: CodegenObject> OperandRef<'tcx, V> { _ if layout.is_zst() => OperandRef::zero_sized(layout), _ => { // Neither a scalar nor scalar pair. Load from a place + // FIXME: should we cache `const_data_from_alloc` to avoid repeating this for the + // same `ConstAllocation`? let init = bx.const_data_from_alloc(alloc); let base_addr = bx.static_addr_of(init, alloc_align, None); |
