On Fri, 1 Jun 2012, Eric Botcazou wrote: > > Ah, I see. So the proper fix would be to use STRIP_NOP()ed op0/op1, > > something not readily available though. > > Why not just add > > TYPE_UNSIGNED (TREE_TYPE (op0)) == TYPE_UNSIGNED (TREE_TYPE (arg0)) > && TYPE_UNSIGNED (TREE_TYPE (op1)) == TYPE_UNSIGNED (TREE_TYPE (arg1)) > > with a small comment?
Well, it would rather be TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg0)) && TYPE_UNSIGNED (type) == TYPE_UNSIGNED (TREE_TYPE (arg1)) but only in the !FLOAT_TYPE_P path. We could even compare TYPE_OVERFLOW_UNDEFINED I think. Or even just make sure that when TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0)) also TYPE_OVERFLOW_UNDEFINED (type), thus !TYPE_OVERFLOW_UNDEFINED (type) || ((TREE_CODE (arg0) != MULT_EXPR || TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg0))) && (TREE_CODE (arg1) != MULT_EXPR || TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (arg1)))) That is, the newly created multiplication in type TYPE should either not have undefined overflow or the inner multiplications all should already have. Best done with a comment in fold_plusminus_mult_expr. Richard.