Actually the casts don't have to be very complex. See for instance:
<D175450>_4 = (short unsigned int * const *)&__first;
T.14797_7 = *<D175450>_4;
<D175454>_9 = (short unsigned int * const *)&__last;
T.14799_12 = *<D175454>_9;
these two are operands of template:
void std::fill(_ForwardIter, _ForwardIter, const _Tp&) [with
_ForwardIter = __gnu_cxx::__normal_iterator<short unsigned int*,
std::vector<short unsigned int, std::allocator<short unsigned int> >
>, _Tp = short unsigned int] (__first, __last, __value)
so if I read it right, they shall differ only in constantness.