Skip to content

Commit

Permalink
Simplify the GEP instruction for index
Browse files Browse the repository at this point in the history
  • Loading branch information
DianQK committed Dec 15, 2024
1 parent 4790a43 commit 3fc506b
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 4 deletions.
5 changes: 1 addition & 4 deletions compiler/rustc_codegen_ssa/src/mir/place.rs
Original file line number Diff line number Diff line change
Expand Up @@ -422,10 +422,7 @@ impl<'a, 'tcx, V: CodegenObject> PlaceRef<'tcx, V> {
layout.size
};

let llval = bx.inbounds_gep(bx.cx().backend_type(self.layout), self.val.llval, &[
bx.cx().const_usize(0),
llindex,
]);
let llval = bx.inbounds_gep(bx.cx().backend_type(layout), self.val.llval, &[llindex]);
let align = self.val.align.restrict_for_offset(offset);
PlaceValue::new_sized(llval, align).with_type(layout)
}
Expand Down
22 changes: 22 additions & 0 deletions tests/codegen/bounds-checking/gep-issue-133979.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
//! Issue: <https://github.com/rust-lang/rust/issues/133979>
//! Check that bounds checking are eliminated.
//@ compile-flags: -Copt-level=2

#![crate_type = "lib"]

// CHECK-LABEL: @test(
#[no_mangle]
fn test(a: &[&[u8]]) -> u32 {
// CHECK-NOT: panic_bounds_check
a.iter()
.enumerate()
.map(|(y, b)| {
b.iter()
.enumerate()
.filter(|(_, c)| **c == b'A')
.map(|(x, _)| a[y][x] as u32)
.sum::<u32>()
})
.sum()
}
37 changes: 37 additions & 0 deletions tests/codegen/gep-index.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
//! Check that index and offset use the same getelementptr format.
//@ revisions: NO-OPT OPT
//@[NO-OPT] compile-flags: -Copt-level=0
//@[OPT] compile-flags: -Copt-level=1

#![crate_type = "lib"]

struct Foo(i32, i32);

// CHECK-LABEL: @index_on_struct(
#[no_mangle]
fn index_on_struct(a: &[Foo], index: usize) -> &Foo {
// CHECK: getelementptr inbounds %Foo, ptr %a.0, {{i64|i32}} %index
&a[index]
}

// CHECK-LABEL: @offset_on_struct(
#[no_mangle]
fn offset_on_struct(a: *const Foo, index: usize) -> *const Foo {
// CHECK: getelementptr inbounds %Foo, ptr %a, {{i64|i32}} %index
unsafe { a.add(index) }
}

// CHECK-LABEL: @index_on_i32(
#[no_mangle]
fn index_on_i32(a: &[i32], index: usize) -> &i32 {
// CHECK: getelementptr inbounds i32, ptr %a.0, {{i64|i32}} %index
&a[index]
}

// CHECK-LABEL: @offset_on_i32(
#[no_mangle]
fn offset_on_i32(a: *const i32, index: usize) -> *const i32 {
// CHECK: getelementptr inbounds i32, ptr %a, {{i64|i32}} %index
unsafe { a.add(index) }
}

0 comments on commit 3fc506b

Please sign in to comment.