Skip to content

Commit df9342a

Browse files
committed
Remove from cranelift too.
1 parent 194497a commit df9342a

File tree

1 file changed

+0
-89
lines changed

1 file changed

+0
-89
lines changed

compiler/rustc_codegen_cranelift/src/discriminant.rs

-89
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,6 @@ pub(crate) fn codegen_get_discriminant<'tcx>(
103103
}
104104
};
105105

106-
let cast_to_size = dest_layout.layout.size();
107106
let cast_to = fx.clif_type(dest_layout.ty).unwrap();
108107

109108
// Read the tag/niche-encoded discriminant from memory.
@@ -122,21 +121,7 @@ pub(crate) fn codegen_get_discriminant<'tcx>(
122121
dest.write_cvalue(fx, res);
123122
}
124123
TagEncoding::Niche { untagged_variant, ref niche_variants, niche_start } => {
125-
let tag_size = tag_scalar.size(fx);
126-
let max_unsigned = tag_size.unsigned_int_max();
127-
let max_signed = tag_size.signed_int_max() as u128;
128-
let min_signed = max_signed + 1;
129124
let relative_max = niche_variants.end().as_u32() - niche_variants.start().as_u32();
130-
let niche_end = niche_start.wrapping_add(relative_max as u128) & max_unsigned;
131-
let range = tag_scalar.valid_range(fx);
132-
133-
let sle = |lhs: u128, rhs: u128| -> bool {
134-
// Signed and unsigned comparisons give the same results,
135-
// except that in signed comparisons an integer with the
136-
// sign bit set is less than one with the sign bit clear.
137-
// Toggle the sign bit to do a signed comparison.
138-
(lhs ^ min_signed) <= (rhs ^ min_signed)
139-
};
140125

141126
// We have a subrange `niche_start..=niche_end` inside `range`.
142127
// If the value of the tag is inside this subrange, it's a
@@ -153,45 +138,6 @@ pub(crate) fn codegen_get_discriminant<'tcx>(
153138
// }
154139
// However, we will likely be able to emit simpler code.
155140

156-
// Find the least and greatest values in `range`, considered
157-
// both as signed and unsigned.
158-
let (low_unsigned, high_unsigned) =
159-
if range.start <= range.end { (range.start, range.end) } else { (0, max_unsigned) };
160-
let (low_signed, high_signed) = if sle(range.start, range.end) {
161-
(range.start, range.end)
162-
} else {
163-
(min_signed, max_signed)
164-
};
165-
166-
let niches_ule = niche_start <= niche_end;
167-
let niches_sle = sle(niche_start, niche_end);
168-
let cast_smaller = cast_to_size <= tag_size;
169-
170-
// In the algorithm above, we can change
171-
// cast(relative_tag) + niche_variants.start()
172-
// into
173-
// cast(tag + (niche_variants.start() - niche_start))
174-
// if either the casted type is no larger than the original
175-
// type, or if the niche values are contiguous (in either the
176-
// signed or unsigned sense).
177-
let can_incr = cast_smaller || niches_ule || niches_sle;
178-
179-
let data_for_boundary_niche = || -> Option<(IntCC, u128)> {
180-
if !can_incr {
181-
None
182-
} else if niche_start == low_unsigned {
183-
Some((IntCC::UnsignedLessThanOrEqual, niche_end))
184-
} else if niche_end == high_unsigned {
185-
Some((IntCC::UnsignedGreaterThanOrEqual, niche_start))
186-
} else if niche_start == low_signed {
187-
Some((IntCC::SignedLessThanOrEqual, niche_end))
188-
} else if niche_end == high_signed {
189-
Some((IntCC::SignedGreaterThanOrEqual, niche_start))
190-
} else {
191-
None
192-
}
193-
};
194-
195141
let (is_niche, tagged_discr, delta) = if relative_max == 0 {
196142
// Best case scenario: only one tagged variant. This will
197143
// likely become just a comparison and a jump.
@@ -206,41 +152,6 @@ pub(crate) fn codegen_get_discriminant<'tcx>(
206152
let tagged_discr =
207153
fx.bcx.ins().iconst(cast_to, niche_variants.start().as_u32() as i64);
208154
(is_niche, tagged_discr, 0)
209-
} else if let Some((predicate, constant)) = data_for_boundary_niche() {
210-
// The niche values are either the lowest or the highest in
211-
// `range`. We can avoid the first subtraction in the
212-
// algorithm.
213-
// The algorithm is now this:
214-
// is_niche = tag <= niche_end
215-
// discr = if is_niche {
216-
// cast(tag + (niche_variants.start() - niche_start))
217-
// } else {
218-
// untagged_variant
219-
// }
220-
// (the first line may instead be tag >= niche_start,
221-
// and may be a signed or unsigned comparison)
222-
// The arithmetic must be done before the cast, so we can
223-
// have the correct wrapping behavior. See issue #104519 for
224-
// the consequences of getting this wrong.
225-
let is_niche = codegen_icmp_imm(fx, predicate, tag, constant as i128);
226-
let delta = (niche_variants.start().as_u32() as u128).wrapping_sub(niche_start);
227-
let incr_tag = if delta == 0 {
228-
tag
229-
} else {
230-
let delta = match fx.bcx.func.dfg.value_type(tag) {
231-
types::I128 => {
232-
let lsb = fx.bcx.ins().iconst(types::I64, delta as u64 as i64);
233-
let msb = fx.bcx.ins().iconst(types::I64, (delta >> 64) as u64 as i64);
234-
fx.bcx.ins().iconcat(lsb, msb)
235-
}
236-
ty => fx.bcx.ins().iconst(ty, delta as i64),
237-
};
238-
fx.bcx.ins().iadd(tag, delta)
239-
};
240-
241-
let cast_tag = clif_intcast(fx, incr_tag, cast_to, !niches_ule);
242-
243-
(is_niche, cast_tag, 0)
244155
} else {
245156
// The special cases don't apply, so we'll have to go with
246157
// the general algorithm.

0 commit comments

Comments
 (0)