Skip to content

Commit dd78b99

Browse files
committed
Reduce rightward drift.
1 parent dd452ae commit dd78b99

File tree

1 file changed

+35
-37
lines changed

1 file changed

+35
-37
lines changed

Diff for: compiler/rustc_mir_transform/src/dataflow_const_prop.rs

+35-37
Original file line numberDiff line numberDiff line change
@@ -110,48 +110,46 @@ impl<'tcx> ValueAnalysis<'tcx> for ConstAnalysis<'_, 'tcx> {
110110
// we must make sure that all `target as Variant#i` are `Top`.
111111
state.flood(target.as_ref(), self.map());
112112

113-
if let Some(target_idx) = self.map().find(target.as_ref()) {
114-
let (variant_target, variant_index) = match **kind {
115-
AggregateKind::Tuple | AggregateKind::Closure(..) => {
116-
(Some(target_idx), None)
117-
}
118-
AggregateKind::Adt(def_id, variant_index, ..) => {
119-
match self.tcx.def_kind(def_id) {
120-
DefKind::Struct => (Some(target_idx), None),
121-
DefKind::Enum => (
122-
self.map.apply(target_idx, TrackElem::Variant(variant_index)),
123-
Some(variant_index),
124-
),
125-
_ => (None, None),
126-
}
127-
}
128-
_ => (None, None),
129-
};
130-
if let Some(variant_target_idx) = variant_target {
131-
for (field_index, operand) in operands.iter().enumerate() {
132-
if let Some(field) = self.map().apply(
133-
variant_target_idx,
134-
TrackElem::Field(FieldIdx::from_usize(field_index)),
135-
) {
136-
let result = self.handle_operand(operand, state);
137-
state.insert_idx(field, result, self.map());
138-
}
113+
let Some(target_idx) = self.map().find(target.as_ref()) else { return };
114+
115+
let (variant_target, variant_index) = match **kind {
116+
AggregateKind::Tuple | AggregateKind::Closure(..) => (Some(target_idx), None),
117+
AggregateKind::Adt(def_id, variant_index, ..) => {
118+
match self.tcx.def_kind(def_id) {
119+
DefKind::Struct => (Some(target_idx), None),
120+
DefKind::Enum => (
121+
self.map.apply(target_idx, TrackElem::Variant(variant_index)),
122+
Some(variant_index),
123+
),
124+
_ => return,
139125
}
140126
}
141-
if let Some(variant_index) = variant_index
142-
&& let Some(discr_idx) = self.map().apply(target_idx, TrackElem::Discriminant)
143-
{
144-
// We are assigning the discriminant as part of an aggregate.
145-
// This discriminant can only alias a variant field's value if the operand
146-
// had an invalid value for that type.
147-
// Using invalid values is UB, so we are allowed to perform the assignment
148-
// without extra flooding.
149-
let enum_ty = target.ty(self.local_decls, self.tcx).ty;
150-
if let Some(discr_val) = self.eval_discriminant(enum_ty, variant_index) {
151-
state.insert_value_idx(discr_idx, FlatSet::Elem(discr_val), &self.map);
127+
_ => return,
128+
};
129+
if let Some(variant_target_idx) = variant_target {
130+
for (field_index, operand) in operands.iter().enumerate() {
131+
if let Some(field) = self.map().apply(
132+
variant_target_idx,
133+
TrackElem::Field(FieldIdx::from_usize(field_index)),
134+
) {
135+
let result = self.handle_operand(operand, state);
136+
state.insert_idx(field, result, self.map());
152137
}
153138
}
154139
}
140+
if let Some(variant_index) = variant_index
141+
&& let Some(discr_idx) = self.map().apply(target_idx, TrackElem::Discriminant)
142+
{
143+
// We are assigning the discriminant as part of an aggregate.
144+
// This discriminant can only alias a variant field's value if the operand
145+
// had an invalid value for that type.
146+
// Using invalid values is UB, so we are allowed to perform the assignment
147+
// without extra flooding.
148+
let enum_ty = target.ty(self.local_decls, self.tcx).ty;
149+
if let Some(discr_val) = self.eval_discriminant(enum_ty, variant_index) {
150+
state.insert_value_idx(discr_idx, FlatSet::Elem(discr_val), &self.map);
151+
}
152+
}
155153
}
156154
Rvalue::CheckedBinaryOp(op, box (left, right)) => {
157155
// Flood everything now, so we can use `insert_value_idx` directly later.

0 commit comments

Comments
 (0)