http://gcc.gnu.org/bugzilla/show_bug.cgi?id=61010
--- Comment #4 from ktkachov at gcc dot gnu.org --- Hmmm... int main (void) { int a = 0; unsigned b = (a * 64 & 192) | 63; return 0; } works (i.e. 63 without the U). I suspect there's something dodgy with the implementation of mask_with_tz (tree type, double_int x, double_int y) in fold-const.c that I added with r202652. Interestingly, the wide-int branch that rewrites that function to use the new wide-int interface makes this ICE go away.