Skip to content

Commit 8a17066

Browse files
committed
Avoid unnecessary casts in struct_GEP
1 parent 5e2302a commit 8a17066

File tree

1 file changed

+12
-8
lines changed
  • src/librustc/middle/trans

1 file changed

+12
-8
lines changed

src/librustc/middle/trans/adt.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -205,24 +205,28 @@ pub fn trans_GEP(bcx: block, r: &Repr, val: ValueRef, discr: int, ix: uint)
205205
NoDtor => val,
206206
DtorPresent | DtorAbsent => GEPi(bcx, val, [0, 0])
207207
};
208-
struct_GEP(bcx, st, val, ix)
208+
struct_GEP(bcx, st, val, ix, false)
209209
}
210210
General(ref cases) => {
211211
struct_GEP(bcx, &cases[discr as uint],
212-
GEPi(bcx, val, [0, 1]), ix)
212+
GEPi(bcx, val, [0, 1]), ix, true)
213213
}
214214
}
215215
}
216216

217-
fn struct_GEP(bcx: block, st: &Struct, val: ValueRef, ix: uint)
218-
-> ValueRef {
217+
fn struct_GEP(bcx: block, st: &Struct, val: ValueRef, ix: uint,
218+
needs_cast: bool) -> ValueRef {
219219
let ccx = bcx.ccx();
220220

221-
let real_llty = T_struct(st.fields.map(
222-
|&ty| type_of::type_of(ccx, ty)));
223-
let cast_val = PointerCast(bcx, val, T_ptr(real_llty));
221+
let val = if needs_cast {
222+
let real_llty = T_struct(st.fields.map(
223+
|&ty| type_of::type_of(ccx, ty)));
224+
PointerCast(bcx, val, T_ptr(real_llty))
225+
} else {
226+
val
227+
};
224228

225-
GEPi(bcx, cast_val, [0, ix])
229+
GEPi(bcx, val, [0, ix])
226230
}
227231

228232
pub fn trans_const(ccx: @CrateContext, r: &Repr, discr: int,

0 commit comments

Comments
 (0)