https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114425
--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Though, guess it would help if evrp avoided undesirable propagation here: It is changing: <bb 2> : # DEBUG BEGIN_STMT _8 = .ADD_OVERFLOW (d_7(D), 0); _1 = IMAGPART_EXPR <_8>; _2 = (_Bool) _1; # DEBUG o => (int) _2 # DEBUG BEGIN_STMT a.0_3 = a; _4 = (_BitInt(2000)) a.0_3; c.1_5 = c; m_11 = _4 * c.1_5; # DEBUG m => m_11 # DEBUG BEGIN_STMT u_12 = (unsigned int) m_11; # DEBUG u => u_12 # DEBUG BEGIN_STMT - o.2_6 = (unsigned int) _2; + o.2_6 = (unsigned int) _1; _13 = o.2_6 + u_12; return _13; } which is surely possible because IMAGPART_EXPR of .{ADD,SUB,MUL}_OVERFLOW has [0, 1] range, but for such large/huge _BitInt IMAGPART_EXPR it extends the lifetime of an expensive large variable rather than just being a boolean.