Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rollup of 10 pull requests #93069

Merged
merged 28 commits into from
Jan 19, 2022
Merged
Changes from 2 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
3eb87db
doc: guarantee call order for sort_by_cached_key
digama0 Oct 7, 2021
61ff847
Use iterator instead of recursion in `codegen_place`
SparrowLii Nov 27, 2021
4b62a77
Little improves in CString `new` when creating from slice
AngelicosPhosphoros Dec 20, 2021
b9f008b
Update wording
digama0 Jan 4, 2022
06b17a2
Clarify that ordering is unspecified
digama0 Jan 5, 2022
bd1f09d
Annotate dead code lint with notes about ignored derived impls
FabianWolff Jan 11, 2022
8b459dd
Use span of ignored impls for explanatory note
FabianWolff Jan 15, 2022
0882bbb
Remove some unused `Ord` derivations based on `DefId`
pierwill Jan 18, 2022
b160564
Move expr-related pretty printing functions to module
dtolnay Jan 15, 2022
07a0325
Move item-related pretty printing functions to module
dtolnay Jan 15, 2022
282224e
Add Option::is_some_with.
m-ou-se Jan 18, 2022
aaebae9
Add Result::{is_ok_with, is_err_with}.
m-ou-se Jan 18, 2022
148234f
Add is_some_with tracking issue number.
m-ou-se Jan 18, 2022
45dee47
Improve is_err_with example.
m-ou-se Jan 18, 2022
5f74ef4
Formally implement let chains
c410-f3r Jan 18, 2022
5fee3e7
Fix is_some_with tests.
m-ou-se Jan 18, 2022
fa9a843
Remove horizontal lines at top of page
jsha Jan 11, 2022
84e0d9d
Update books
ehuss Jan 19, 2022
5d2928f
Rollup merge of #88642 - c410-f3r:let_chains_2, r=matthewjasper
matthiaskrgr Jan 19, 2022
2a4381d
Rollup merge of #89621 - digama0:patch-2, r=yaahc
matthiaskrgr Jan 19, 2022
3a1db90
Rollup merge of #91278 - SparrowLii:place, r=spastorino
matthiaskrgr Jan 19, 2022
3148a32
Rollup merge of #92124 - AngelicosPhosphoros:remove_extra_alloc_in_cs…
matthiaskrgr Jan 19, 2022
9a82f74
Rollup merge of #92783 - FabianWolff:issue-92726, r=nikomatsakis
matthiaskrgr Jan 19, 2022
7f2dbcb
Rollup merge of #92797 - jsha:fewer-lines, r=GuillaumeGomez
matthiaskrgr Jan 19, 2022
420ada6
Rollup merge of #92920 - dtolnay:printtidy, r=cjgillot
matthiaskrgr Jan 19, 2022
0b9056c
Rollup merge of #93041 - pierwill:rm-unused-defid-ords, r=cjgillot
matthiaskrgr Jan 19, 2022
d5bc168
Rollup merge of #93051 - m-ou-se:is-some-with, r=yaahc
matthiaskrgr Jan 19, 2022
ea1275a
Rollup merge of #93062 - ehuss:update-books, r=ehuss
matthiaskrgr Jan 19, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
143 changes: 67 additions & 76 deletions compiler/rustc_codegen_ssa/src/mir/place.rs
Original file line number Diff line number Diff line change
@@ -429,87 +429,78 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
let cx = self.cx;
let tcx = self.cx.tcx();

let result = match place_ref {
mir::PlaceRef { local, projection: [] } => match self.locals[local] {
LocalRef::Place(place) => {
return place;
}
LocalRef::UnsizedPlace(place) => {
return bx.load_operand(place).deref(cx);
}
LocalRef::Operand(..) => {
let mut base = 0;
let mut cg_base = match self.locals[place_ref.local] {
LocalRef::Place(place) => place,
LocalRef::UnsizedPlace(place) => bx.load_operand(place).deref(cx),
LocalRef::Operand(..) => {
if let Some(elem) = place_ref
.projection
.iter()
.enumerate()
.find(|elem| matches!(elem.1, mir::ProjectionElem::Deref))
{
base = elem.0 + 1;
self.codegen_consume(
bx,
mir::PlaceRef { projection: &place_ref.projection[..elem.0], ..place_ref },
)
.deref(bx.cx())
} else {
bug!("using operand local {:?} as place", place_ref);
}
},
mir::PlaceRef { local, projection: [proj_base @ .., mir::ProjectionElem::Deref] } => {
// Load the pointer from its location.
self.codegen_consume(bx, mir::PlaceRef { local, projection: proj_base })
.deref(bx.cx())
}
mir::PlaceRef { local, projection: &[ref proj_base @ .., elem] } => {
// FIXME turn this recursion into iteration
let cg_base =
self.codegen_place(bx, mir::PlaceRef { local, projection: proj_base });

match elem {
mir::ProjectionElem::Deref => bug!(),
mir::ProjectionElem::Field(ref field, _) => {
cg_base.project_field(bx, field.index())
}
mir::ProjectionElem::Index(index) => {
let index = &mir::Operand::Copy(mir::Place::from(index));
let index = self.codegen_operand(bx, index);
let llindex = index.immediate();
cg_base.project_index(bx, llindex)
}
mir::ProjectionElem::ConstantIndex {
offset,
from_end: false,
min_length: _,
} => {
let lloffset = bx.cx().const_usize(offset as u64);
cg_base.project_index(bx, lloffset)
}
mir::ProjectionElem::ConstantIndex {
offset,
from_end: true,
min_length: _,
} => {
let lloffset = bx.cx().const_usize(offset as u64);
let lllen = cg_base.len(bx.cx());
let llindex = bx.sub(lllen, lloffset);
cg_base.project_index(bx, llindex)
}
mir::ProjectionElem::Subslice { from, to, from_end } => {
let mut subslice =
cg_base.project_index(bx, bx.cx().const_usize(from as u64));
let projected_ty =
PlaceTy::from_ty(cg_base.layout.ty).projection_ty(tcx, elem).ty;
subslice.layout = bx.cx().layout_of(self.monomorphize(projected_ty));

if subslice.layout.is_unsized() {
assert!(from_end, "slice subslices should be `from_end`");
subslice.llextra = Some(bx.sub(
cg_base.llextra.unwrap(),
bx.cx().const_usize((from as u64) + (to as u64)),
));
}

// Cast the place pointer type to the new
// array or slice type (`*[%_; new_len]`).
subslice.llval = bx.pointercast(
subslice.llval,
bx.cx().type_ptr_to(bx.cx().backend_type(subslice.layout)),
);

subslice
};
for elem in place_ref.projection[base..].iter() {
cg_base = match elem.clone() {
mir::ProjectionElem::Deref => bx.load_operand(cg_base).deref(bx.cx()),
mir::ProjectionElem::Field(ref field, _) => {
cg_base.project_field(bx, field.index())
}
mir::ProjectionElem::Index(index) => {
let index = &mir::Operand::Copy(mir::Place::from(index));
let index = self.codegen_operand(bx, index);
let llindex = index.immediate();
cg_base.project_index(bx, llindex)
}
mir::ProjectionElem::ConstantIndex { offset, from_end: false, min_length: _ } => {
let lloffset = bx.cx().const_usize(offset as u64);
cg_base.project_index(bx, lloffset)
}
mir::ProjectionElem::ConstantIndex { offset, from_end: true, min_length: _ } => {
let lloffset = bx.cx().const_usize(offset as u64);
let lllen = cg_base.len(bx.cx());
let llindex = bx.sub(lllen, lloffset);
cg_base.project_index(bx, llindex)
}
mir::ProjectionElem::Subslice { from, to, from_end } => {
let mut subslice = cg_base.project_index(bx, bx.cx().const_usize(from as u64));
let projected_ty =
PlaceTy::from_ty(cg_base.layout.ty).projection_ty(tcx, elem.clone()).ty;
subslice.layout = bx.cx().layout_of(self.monomorphize(projected_ty));

if subslice.layout.is_unsized() {
assert!(from_end, "slice subslices should be `from_end`");
subslice.llextra = Some(bx.sub(
cg_base.llextra.unwrap(),
bx.cx().const_usize((from as u64) + (to as u64)),
));
}
mir::ProjectionElem::Downcast(_, v) => cg_base.project_downcast(bx, v),

// Cast the place pointer type to the new
// array or slice type (`*[%_; new_len]`).
subslice.llval = bx.pointercast(
subslice.llval,
bx.cx().type_ptr_to(bx.cx().backend_type(subslice.layout)),
);

subslice
}
}
};
debug!("codegen_place(place={:?}) => {:?}", place_ref, result);
result
mir::ProjectionElem::Downcast(_, v) => cg_base.project_downcast(bx, v),
};
}
debug!("codegen_place(place={:?}) => {:?}", place_ref, cg_base);
cg_base
}

pub fn monomorphized_place_ty(&self, place_ref: mir::PlaceRef<'tcx>) -> Ty<'tcx> {