Skip to content

Commit c1017d4

Browse files
use non-inbounds GEP for ZSTs, add fixmes
1 parent 4724cd4 commit c1017d4

File tree

2 files changed

+8
-3
lines changed

2 files changed

+8
-3
lines changed

compiler/rustc_codegen_ssa/src/mir/place.rs

+5
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,10 @@ impl<'a, 'tcx, V: CodegenObject> PlaceRef<'tcx, V> {
104104
let mut simple = || {
105105
let llval = if offset.bytes() == 0 {
106106
self.llval
107+
} else if field.is_zst() {
108+
// FIXME(erikdesjardins): it should be fine to use inbounds for ZSTs too;
109+
// keeping this logic for now to preserve previous behavior.
110+
bx.ptradd(self.llval, bx.const_usize(offset.bytes()))
107111
} else {
108112
bx.inbounds_ptradd(self.llval, bx.const_usize(offset.bytes()))
109113
};
@@ -164,6 +168,7 @@ impl<'a, 'tcx, V: CodegenObject> PlaceRef<'tcx, V> {
164168
debug!("struct_field_ptr: DST field offset: {:?}", offset);
165169

166170
// Adjust pointer.
171+
// FIXME(erikdesjardins): should be able to use inbounds here too.
167172
let ptr = bx.ptradd(self.llval, offset);
168173

169174
PlaceRef { llval: ptr, llextra: self.llextra, layout: field, align: effective_field_align }

tests/codegen/zst-offset.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ pub fn helper(_: usize) {
1313
// CHECK-LABEL: @scalar_layout
1414
#[no_mangle]
1515
pub fn scalar_layout(s: &(u64, ())) {
16-
// CHECK: getelementptr inbounds i8, {{.+}}, [[USIZE]] 8
16+
// CHECK: getelementptr i8, {{.+}}, [[USIZE]] 8
1717
let x = &s.1;
1818
witness(&x); // keep variable in an alloca
1919
}
@@ -22,7 +22,7 @@ pub fn scalar_layout(s: &(u64, ())) {
2222
// CHECK-LABEL: @scalarpair_layout
2323
#[no_mangle]
2424
pub fn scalarpair_layout(s: &(u64, u32, ())) {
25-
// CHECK: getelementptr inbounds i8, {{.+}}, [[USIZE]] 12
25+
// CHECK: getelementptr i8, {{.+}}, [[USIZE]] 12
2626
let x = &s.2;
2727
witness(&x); // keep variable in an alloca
2828
}
@@ -34,7 +34,7 @@ pub struct U64x4(u64, u64, u64, u64);
3434
// CHECK-LABEL: @vector_layout
3535
#[no_mangle]
3636
pub fn vector_layout(s: &(U64x4, ())) {
37-
// CHECK: getelementptr inbounds i8, {{.+}}, [[USIZE]] 32
37+
// CHECK: getelementptr i8, {{.+}}, [[USIZE]] 32
3838
let x = &s.1;
3939
witness(&x); // keep variable in an alloca
4040
}

0 commit comments

Comments
 (0)