Skip to content

Commit a607ae7

Browse files
Don't reset cast kind without also updating the operand in simplify_cast
1 parent 75d03b1 commit a607ae7

File tree

3 files changed

+14
-12
lines changed

3 files changed

+14
-12
lines changed

compiler/rustc_mir_transform/src/gvn.rs

+11-9
Original file line numberDiff line numberDiff line change
@@ -1366,16 +1366,17 @@ impl<'body, 'tcx> VnState<'body, 'tcx> {
13661366

13671367
fn simplify_cast(
13681368
&mut self,
1369-
kind: &mut CastKind,
1370-
operand: &mut Operand<'tcx>,
1369+
initial_kind: &mut CastKind,
1370+
initial_operand: &mut Operand<'tcx>,
13711371
to: Ty<'tcx>,
13721372
location: Location,
13731373
) -> Option<VnIndex> {
13741374
use CastKind::*;
13751375
use rustc_middle::ty::adjustment::PointerCoercion::*;
13761376

1377-
let mut from = operand.ty(self.local_decls, self.tcx);
1378-
let mut value = self.simplify_operand(operand, location)?;
1377+
let mut from = initial_operand.ty(self.local_decls, self.tcx);
1378+
let mut kind = *initial_kind;
1379+
let mut value = self.simplify_operand(initial_operand, location)?;
13791380
if from == to {
13801381
return Some(value);
13811382
}
@@ -1399,7 +1400,7 @@ impl<'body, 'tcx> VnState<'body, 'tcx> {
13991400
&& to.is_unsafe_ptr()
14001401
&& self.pointers_have_same_metadata(from, to)
14011402
{
1402-
*kind = PtrToPtr;
1403+
kind = PtrToPtr;
14031404
was_updated_this_iteration = true;
14041405
}
14051406

@@ -1442,7 +1443,7 @@ impl<'body, 'tcx> VnState<'body, 'tcx> {
14421443
to: inner_to,
14431444
} = *self.get(value)
14441445
{
1445-
let new_kind = match (inner_kind, *kind) {
1446+
let new_kind = match (inner_kind, kind) {
14461447
// Even if there's a narrowing cast in here that's fine, because
14471448
// things like `*mut [i32] -> *mut i32 -> *const i32` and
14481449
// `*mut [i32] -> *const [i32] -> *const i32` can skip the middle in MIR.
@@ -1470,7 +1471,7 @@ impl<'body, 'tcx> VnState<'body, 'tcx> {
14701471
_ => None,
14711472
};
14721473
if let Some(new_kind) = new_kind {
1473-
*kind = new_kind;
1474+
kind = new_kind;
14741475
from = inner_from;
14751476
value = inner_value;
14761477
was_updated_this_iteration = true;
@@ -1488,10 +1489,11 @@ impl<'body, 'tcx> VnState<'body, 'tcx> {
14881489
}
14891490

14901491
if was_ever_updated && let Some(op) = self.try_as_operand(value, location) {
1491-
*operand = op;
1492+
*initial_operand = op;
1493+
*initial_kind = kind;
14921494
}
14931495

1494-
Some(self.insert(Value::Cast { kind: *kind, value, from, to }))
1496+
Some(self.insert(Value::Cast { kind, value, from, to }))
14951497
}
14961498

14971499
fn simplify_len(&mut self, place: &mut Place<'tcx>, location: Location) -> Option<VnIndex> {

tests/mir-opt/dont_reset_cast_kind_without_updating_operand.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
// EMIT_MIR dont_reset_cast_kind_without_updating_operand.test.GVN.diff
44

55
fn test() {
6-
let vp_ctx: &Box<()>= &Box::new(());
6+
let vp_ctx: &Box<()> = &Box::new(());
77
let slf: *const () = &raw const **vp_ctx;
88
let bytes = std::ptr::slice_from_raw_parts(slf, 1);
99
let _x = foo(bytes);
1010
}
1111

1212
fn foo(bytes: *const [()]) -> *mut () {
1313
bytes as *mut ()
14-
}
14+
}

tests/mir-opt/dont_reset_cast_kind_without_updating_operand.test.GVN.diff

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
StorageLive(_8);
6767
_8 = copy _5;
6868
- _7 = copy _8 as *mut () (PtrToPtr);
69-
+ _7 = copy _5 as *mut () (Transmute);
69+
+ _7 = copy _5 as *mut () (PtrToPtr);
7070
StorageDead(_8);
7171
StorageDead(_7);
7272
- StorageDead(_5);

0 commit comments

Comments
 (0)