On Mon, Oct 9, 2017 at 11:12 AM, Yuri Gribov <tetra2...@gmail.com> wrote: > Hi all, > > This patch gets rid of float casts in comparisons when all values of > casted integral type are exactly representable by the float type > (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81376). > > Bootstrapped and regtested on x64_64. Ok to commit?
+bool format_helper::can_represent_integral_type_p (tree type) const +{ + gcc_assert (! decimal_p () && INTEGRAL_TYPE_P (type) && "NYI"); "NYI"? + /* Determine the largest type. */ + excess vertical space + signop sign1 = TYPE_SIGN (type1), + sign2 = TYPE_SIGN (type2); + int prec1 = TYPE_PRECISION (type1), + prec2 = TYPE_PRECISION (type2); + + bool type1_largest_p = (sign1 == sign2 && prec2 <= prec1) + || (sign1 == SIGNED && sign2 == UNSIGNED && prec2 < prec1); + bool type2_largest_p = (sign1 == sign2 && prec1 <= prec2) + || (sign1 == UNSIGNED && sign2 == SIGNED && prec1 < prec2); + } + (switch I dislike too many temporaries, isn't (if (TYPE_PRECISION (type1) > TYPE_PRECISION (type2)) (cmp @1 (convert @2) (if (TYPE_PRECISION (type2) > TYPE_PRECISION (type1)) (cmp (convert @1) @2) (if (TYPE_SIGN (type1) == TYPE_SIGN (type2)) (cmp @1 @2))))) easier to follow? Note the if-else cascade, note the (convert ..)s do not need an explicit type. I wonder if we anywhere "canonicalize" non-simple comparison operators (unle, ltgt, etc.) for comparisons involving integer-to-float converted operands. Thanks, Richard. > -Y