Simplify the GEP instruction for index
This commit is contained in:
parent
4790a435cb
commit
3fc506b4d4
3 changed files with 60 additions and 4 deletions
|
@ -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)
|
||||
}
|
||||
|
|
22
tests/codegen/bounds-checking/gep-issue-133979.rs
Normal file
22
tests/codegen/bounds-checking/gep-issue-133979.rs
Normal file
|
@ -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
tests/codegen/gep-index.rs
Normal file
37
tests/codegen/gep-index.rs
Normal file
|
@ -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) }
|
||||
}
|
Loading…
Add table
Reference in a new issue