diff options
| author | bors <bors@rust-lang.org> | 2022-07-05 09:36:29 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-07-05 09:36:29 +0000 |
| commit | 96bdb398f9429fca79821cfe8aab828f52f8b710 (patch) | |
| tree | 493af06441dba429028135b3857d005ab6f57fdc | |
| parent | a71e691e74e06d0f3d50daee7510ce240f2b1783 (diff) | |
| parent | 846eecb1a40210b287b92ea1750aedcf478067ae (diff) | |
Auto merge of #96862 - oli-obk:enum_cast_mir, r=RalfJung
Change enum->int casts to not go through MIR casts. follow-up to https://github.com/rust-lang/rust/pull/96814 this simplifies all backends and even gives LLVM more information about the return value of `Rvalue::Discriminant`, enabling optimizations in more cases.
| -rw-r--r-- | src/base.rs | 23 |
1 files changed, 0 insertions, 23 deletions
diff --git a/src/base.rs b/src/base.rs index fa4ea426385..f71d749df62 100644 --- a/src/base.rs +++ b/src/base.rs @@ -635,29 +635,6 @@ fn codegen_stmt<'tcx>( let (ptr, _extra) = operand.load_scalar_pair(fx); lval.write_cvalue(fx, CValue::by_val(ptr, dest_layout)) } - } else if let ty::Adt(adt_def, _substs) = from_ty.kind() { - // enum -> discriminant value - assert!(adt_def.is_enum()); - match to_ty.kind() { - ty::Uint(_) | ty::Int(_) => {} - _ => unreachable!("cast adt {} -> {}", from_ty, to_ty), - } - let to_clif_ty = fx.clif_type(to_ty).unwrap(); - - let discriminant = crate::discriminant::codegen_get_discriminant( - fx, - operand, - fx.layout_of(operand.layout().ty.discriminant_ty(fx.tcx)), - ) - .load_scalar(fx); - - let res = crate::cast::clif_intcast( - fx, - discriminant, - to_clif_ty, - to_ty.is_signed(), - ); - lval.write_cvalue(fx, CValue::by_val(res, dest_layout)); } else { let to_clif_ty = fx.clif_type(to_ty).unwrap(); let from = operand.load_scalar(fx); |
