On Tue, Nov 29, 2016 at 05:00:05PM +0100, Markus Trippelsdorf wrote: > Building gcc with -fsanitize=undefined shows: > rtlanal.c:5210:38: runtime error: shift exponent 4294967295 is too large for > 64-bit type 'long unsigned int' > > This happens because if_then_else_cond() in combine.c calls > num_sign_bit_copies() in rtlanal.c with mode==BLKmode. > > 5205 bitwidth = GET_MODE_PRECISION (mode); > 5206 if (bitwidth > HOST_BITS_PER_WIDE_INT) > 5207 return 1; > 5208 > 5209 nonzero = nonzero_bits (x, mode); > 5210 return nonzero & (HOST_WIDE_INT_1U << (bitwidth - 1)) > 5211 ? 1 : bitwidth - floor_log2 (nonzero) - 1; > > This causes (bitwidth - 1) to wrap around.
Could you also add a gcc_assert here? > PR rtl-optimization/78588 > * combine.c (if_then_else_cond): Also guard against BLKmode. Approved, please apply. Thanks, Segher