Skip to content

Commit aa61fb8

Browse files
committed
Fix write_operand_repeatedly
1 parent 3a6fea9 commit aa61fb8

File tree

2 files changed

+37
-12
lines changed

2 files changed

+37
-12
lines changed

gcc-test-backend/src/main.rs

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,39 @@
1+
#![feature(array_chunks, slice_as_chunks)]
2+
13
fn main() {
2-
let mut a = [0; 5];
3-
let ptr1: *mut i32 = &mut a[1];
4-
let ptr2: *mut i32 = &mut a[3];
5-
unsafe {
6-
assert_eq!(ptr2.offset_from(ptr1), 2);
7-
assert_eq!(ptr1.offset_from(ptr2), -2);
8-
assert_eq!(ptr1.offset(2), ptr2);
9-
assert_eq!(ptr2.offset(-2), ptr1);
4+
let v: &mut [i32] = &mut [0, 1, 2, 3, 4, 5, 6];
5+
6+
const WINDOW_SIZE: usize = 3;
7+
8+
let mut i = 0;
9+
let len = v.len();
10+
while i < len {
11+
if i + WINDOW_SIZE >= len {
12+
break;
13+
}
14+
15+
//let slice: &mut [i32; WINDOW_SIZE] = TryFrom::try_from(&mut v[i..i+WINDOW_SIZE]).unwrap();
16+
let slice = &mut v[i..i+WINDOW_SIZE];
17+
let ptr = slice.as_mut_ptr() as *mut [i32; WINDOW_SIZE];
18+
let array: &mut [i32; WINDOW_SIZE] = unsafe { &mut *ptr };
19+
//println!("{:?}", array);
20+
21+
let sum = array.iter().sum::<i32>();
22+
*array = [sum; WINDOW_SIZE];
23+
24+
i += WINDOW_SIZE;
1025
}
26+
27+
//println!("{:?}", v);
28+
assert_eq!(v, &[3, 3, 3, 12, 12, 12, 6]);
29+
30+
/*for a in v.array_chunks_mut() {
31+
let sum = a.iter().sum::<i32>();
32+
*a = [sum; 3];
33+
}
34+
assert_eq!(v, &[3, 3, 3, 12, 12, 12, 6]);*/
35+
36+
/*let v2: &mut [i32] = &mut [0, 1, 2, 3, 4, 5, 6];
37+
v2.array_chunks_mut().for_each(|[a, b]| core::mem::swap(a, b));
38+
assert_eq!(v2, &[1, 0, 3, 2, 5, 4, 6]);*/
1139
}

src/builder.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,10 +1034,7 @@ impl<'a, 'gcc, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'gcc, 'tcx> {
10341034
let align = dest.align.restrict_for_offset(dest.layout.field(self.cx(), 0).size);
10351035
cg_elem.val.store(&mut body_bx, PlaceRef::new_sized_aligned(current_val, cg_elem.layout, align));
10361036

1037-
let ptr_value = self.const_usize(1);
1038-
let current_int = body_bx.ptrtoint(current_val, self.usize_type);
1039-
let next = current_int + ptr_value;
1040-
let next = body_bx.inttoptr(next, ptr_type);
1037+
let next = body_bx.inbounds_gep(current.to_rvalue(), &[self.const_usize(1)]);
10411038
body_bx.llbb().add_assignment(None, current, next);
10421039
body_bx.br(header_bx.llbb());
10431040

0 commit comments

Comments
 (0)