diff options
author | Roger Sayle <roger@eyesopen.com> | 2003-04-14 20:16:58 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2003-04-14 20:16:58 +0000 |
commit | 15d4fd986330e2e993d0aef0f58d0c5bf7ab0e28 (patch) | |
tree | a3d2d13cfa04d1656aee06fd96e6f08bdbc67e20 /gcc/fold-const.c | |
parent | 22fc0e9ffec42f27aff7062dad4a9759c5edb23c (diff) | |
download | gcc-15d4fd986330e2e993d0aef0f58d0c5bf7ab0e28.zip gcc-15d4fd986330e2e993d0aef0f58d0c5bf7ab0e28.tar.gz gcc-15d4fd986330e2e993d0aef0f58d0c5bf7ab0e28.tar.bz2 |
fold-const.c (fold): Transform (c1 - x) cmp c2...
* fold-const.c (fold): Transform (c1 - x) cmp c2, where cmp is a
comparison operation and c1/c2 are floating point constants into
x swap(cmp) (c1 - c2).
* gcc.dg/20030414-2.c: New test case.
From-SVN: r65584
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index ebb87e2..95812a2 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -6484,6 +6484,19 @@ fold (expr) && ! TREE_CONSTANT_OVERFLOW (tem)) return fold (build (code, type, TREE_OPERAND (arg0, 0), tem)); + /* Likewise, we can simplify a comparison of a real constant with + a MINUS_EXPR whose first operand is also a real constant, i.e. + (c1 - x) < c2 becomes x > c1-c2. */ + if (flag_unsafe_math_optimizations + && TREE_CODE (arg1) == REAL_CST + && TREE_CODE (arg0) == MINUS_EXPR + && TREE_CODE (TREE_OPERAND (arg0, 0)) == REAL_CST + && 0 != (tem = const_binop (MINUS_EXPR, TREE_OPERAND (arg0, 0), + arg1, 0)) + && ! TREE_CONSTANT_OVERFLOW (tem)) + return fold (build (swap_tree_comparison (code), type, + TREE_OPERAND (arg0, 1), tem)); + /* Fold comparisons against built-in math functions. */ if (TREE_CODE (arg1) == REAL_CST && flag_unsafe_math_optimizations |