diff options
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 3847fc0..726e845 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -6041,6 +6041,18 @@ fold (expr) if (FLOAT_TYPE_P (TREE_TYPE (arg0))) { + tree targ0 = strip_float_extensions (arg0); + tree targ1 = strip_float_extensions (arg1); + tree newtype = TREE_TYPE (targ0); + + if (TYPE_PRECISION (TREE_TYPE (targ1)) > TYPE_PRECISION (newtype)) + newtype = TREE_TYPE (targ1); + + /* Fold (double)float1 CMP (double)float2 into float1 CMP float2. */ + if (TYPE_PRECISION (newtype) < TYPE_PRECISION (TREE_TYPE (arg0))) + return fold (build (code, type, convert (newtype, targ0), + convert (newtype, targ1))); + /* (-a) CMP (-b) -> b CMP a */ if (TREE_CODE (arg0) == NEGATE_EXPR && TREE_CODE (arg1) == NEGATE_EXPR) |