Skip to content

Commit 302bd58

Browse files
committed
---
yaml --- r: 3738 b: refs/heads/master c: 7c66894 h: refs/heads/master v: v3
1 parent ecbb2e6 commit 302bd58

File tree

3 files changed

+57
-24
lines changed

3 files changed

+57
-24
lines changed

[refs]

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: d0a432f4bb3ca2468f4d2d52f19625e4e13898e9
2+
refs/heads/master: 7c66894a71988c72998d0584f82cf356d1068723

trunk/src/comp/middle/trans.rs

+40-23
Original file line numberDiff line numberDiff line change
@@ -4001,12 +4001,20 @@ mod ivec {
40014001
copy_cx.build.Phi(T_ptr(llunitty),
40024002
~[dest_ptr_stack, dest_ptr_heap],
40034003
~[stack_cx.llbb, heap_cx.llbb]);
4004-
auto lhs_len_unscaled = copy_cx.build.UDiv(lhs_len, unit_sz);
4005-
auto lhs_end_ptr =
4006-
copy_cx.build.InBoundsGEP(lhs_data, ~[lhs_len_unscaled]);
4007-
auto rhs_len_unscaled = copy_cx.build.UDiv(rhs_len, unit_sz);
4008-
auto rhs_end_ptr =
4009-
copy_cx.build.InBoundsGEP(rhs_data, ~[rhs_len_unscaled]);
4004+
4005+
auto lhs_end_ptr; auto rhs_end_ptr;
4006+
if (ty::type_has_dynamic_size(cx.fcx.lcx.ccx.tcx, unit_ty)) {
4007+
lhs_end_ptr = copy_cx.build.InBoundsGEP(lhs_data, ~[lhs_len]);
4008+
rhs_end_ptr = copy_cx.build.InBoundsGEP(rhs_data, ~[rhs_len]);
4009+
} else {
4010+
auto lhs_len_unscaled = copy_cx.build.UDiv(lhs_len, unit_sz);
4011+
lhs_end_ptr = copy_cx.build.InBoundsGEP(lhs_data,
4012+
~[lhs_len_unscaled]);
4013+
auto rhs_len_unscaled = copy_cx.build.UDiv(rhs_len, unit_sz);
4014+
rhs_end_ptr = copy_cx.build.InBoundsGEP(rhs_data,
4015+
~[rhs_len_unscaled]);
4016+
}
4017+
40104018
auto dest_ptr_ptr = alloca(copy_cx, T_ptr(llunitty));
40114019
copy_cx.build.Store(first_dest_ptr, dest_ptr_ptr);
40124020
auto lhs_ptr_ptr = alloca(copy_cx, T_ptr(llunitty));
@@ -4027,18 +4035,22 @@ mod ivec {
40274035
rhs_copy_cx.llbb);
40284036
auto dest_ptr_lhs_copy = lhs_do_copy_cx.build.Load(dest_ptr_ptr);
40294037
auto lhs_val = load_if_immediate(lhs_do_copy_cx, lhs_ptr, unit_ty);
4030-
rs =
4031-
copy_val(lhs_do_copy_cx, INIT, dest_ptr_lhs_copy, lhs_val,
4032-
unit_ty);
4038+
rs = copy_val(lhs_do_copy_cx, INIT, dest_ptr_lhs_copy, lhs_val,
4039+
unit_ty);
40334040
lhs_do_copy_cx = rs.bcx;
4034-
{
4035-
auto d = lhs_do_copy_cx.build.InBoundsGEP(dest_ptr_lhs_copy,
4036-
~[C_int(1)]);
4037-
auto lhs = lhs_do_copy_cx.build.InBoundsGEP(lhs_ptr,
4038-
~[C_int(1)]);
4039-
lhs_do_copy_cx.build.Store(d, dest_ptr_ptr);
4040-
lhs_do_copy_cx.build.Store(lhs, lhs_ptr_ptr);
4041+
4042+
// Increment both pointers.
4043+
if (ty::type_has_dynamic_size(cx.fcx.lcx.ccx.tcx, unit_ty)) {
4044+
// We have to increment by the dynamically-computed size.
4045+
incr_ptr(lhs_do_copy_cx, dest_ptr_lhs_copy, unit_sz,
4046+
dest_ptr_ptr);
4047+
incr_ptr(lhs_do_copy_cx, lhs_ptr, unit_sz, lhs_ptr_ptr);
4048+
} else {
4049+
incr_ptr(lhs_do_copy_cx, dest_ptr_lhs_copy, C_int(1),
4050+
dest_ptr_ptr);
4051+
incr_ptr(lhs_do_copy_cx, lhs_ptr, C_int(1), lhs_ptr_ptr);
40414052
}
4053+
40424054
lhs_do_copy_cx.build.Br(lhs_copy_cx.llbb);
40434055
// Copy in elements from the RHS.
40444056

@@ -4055,14 +4067,19 @@ mod ivec {
40554067
copy_val(rhs_do_copy_cx, INIT, dest_ptr_rhs_copy, rhs_val,
40564068
unit_ty);
40574069
rhs_do_copy_cx = rs.bcx;
4058-
{
4059-
auto d = rhs_do_copy_cx.build.InBoundsGEP(dest_ptr_rhs_copy,
4060-
~[C_int(1)]);
4061-
auto rhs = rhs_do_copy_cx.build.InBoundsGEP(rhs_ptr,
4062-
~[C_int(1)]);
4063-
rhs_do_copy_cx.build.Store(d, dest_ptr_ptr);
4064-
rhs_do_copy_cx.build.Store(rhs, rhs_ptr_ptr);
4070+
4071+
// Increment both pointers.
4072+
if (ty::type_has_dynamic_size(cx.fcx.lcx.ccx.tcx, unit_ty)) {
4073+
// We have to increment by the dynamically-computed size.
4074+
incr_ptr(rhs_do_copy_cx, dest_ptr_rhs_copy, unit_sz,
4075+
dest_ptr_ptr);
4076+
incr_ptr(rhs_do_copy_cx, rhs_ptr, unit_sz, rhs_ptr_ptr);
4077+
} else {
4078+
incr_ptr(rhs_do_copy_cx, dest_ptr_rhs_copy, C_int(1),
4079+
dest_ptr_ptr);
4080+
incr_ptr(rhs_do_copy_cx, rhs_ptr, C_int(1), rhs_ptr_ptr);
40654081
}
4082+
40664083
rhs_do_copy_cx.build.Br(rhs_copy_cx.llbb);
40674084
// Finally done!
40684085

trunk/src/test/run-pass/ivec-add.rs

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// xfail-stage0
2+
3+
fn double[T](&T a) -> T[] { ret ~[a] + ~[a]; }
4+
5+
fn double_int(int a) -> int[] { ret ~[a] + ~[a]; }
6+
7+
fn main() {
8+
auto d = double(1);
9+
assert (d.(0) == 1);
10+
assert (d.(1) == 1);
11+
12+
d = double_int(1);
13+
assert (d.(0) == 1);
14+
assert (d.(1) == 1);
15+
}
16+

0 commit comments

Comments
 (0)