Skip to content

Commit 4836ce1

Browse files
committed
Do not read a scalar on a non-scalar layout.
1 parent 1ac2d8f commit 4836ce1

File tree

4 files changed

+801
-2
lines changed

4 files changed

+801
-2
lines changed

compiler/rustc_mir_transform/src/gvn.rs

+6-2
Original file line numberDiff line numberDiff line change
@@ -945,8 +945,12 @@ impl<'body, 'tcx> VnState<'body, 'tcx> {
945945

946946
let as_bits = |value| {
947947
let constant = self.evaluated[value].as_ref()?;
948-
let scalar = self.ecx.read_scalar(constant).ok()?;
949-
scalar.to_bits(constant.layout.size).ok()
948+
if layout.abi.is_scalar() {
949+
let scalar = self.ecx.read_scalar(constant).ok()?;
950+
scalar.to_bits(constant.layout.size).ok()
951+
} else {
952+
None
953+
}
950954
};
951955

952956
// Represent the values as `Ok(bits)` or `Err(VnIndex)`.

tests/mir-opt/gvn.rs

+23
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,27 @@ fn constant_index_overflow<T: Copy>(x: &[T]) {
644644
opaque(b)
645645
}
646646

647+
fn wide_ptr_ops() {
648+
let a: *const dyn Send = &1 as &dyn Send;
649+
let b: *const dyn Send = &1 as &dyn Send;
650+
let _val = a == b;
651+
let _val = a != b;
652+
let _val = a < b;
653+
let _val = a <= b;
654+
let _val = a > b;
655+
let _val = a >= b;
656+
657+
let a: *const [u8] = unsafe { transmute((1usize, 1usize)) };
658+
let b: *const [u8] = unsafe { transmute((1usize, 2usize)) };
659+
660+
opaque(!(a == b));
661+
opaque(a != b);
662+
opaque(a <= b);
663+
opaque(a < b);
664+
opaque(!(a >= b));
665+
opaque(!(a > b));
666+
}
667+
647668
fn main() {
648669
subexpression_elimination(2, 4, 5);
649670
wrap_unwrap(5);
@@ -664,6 +685,7 @@ fn main() {
664685
fn_pointers();
665686
indirect_static();
666687
constant_index_overflow(&[5, 3]);
688+
wide_ptr_ops();
667689
}
668690

669691
#[inline(never)]
@@ -692,3 +714,4 @@ fn identity<T>(x: T) -> T {
692714
// EMIT_MIR gvn.fn_pointers.GVN.diff
693715
// EMIT_MIR gvn.indirect_static.GVN.diff
694716
// EMIT_MIR gvn.constant_index_overflow.GVN.diff
717+
// EMIT_MIR gvn.wide_ptr_ops.GVN.diff

0 commit comments

Comments
 (0)