The following fixes an optimization regression noted in PR78546 where moving patterns from forwprop to match.pd missed one variant.
Bootstrap & regtest running on x86_64-unknown-linux-gnu. Richard. 2016-11-28 Richard Biener <rguent...@suse.de> PR middle-end/78546 * match.pd: Add CST - (CST - A) -> CST - A missing case. * gcc.dg/tree-ssa/forwprop-36.c: New testcase. diff --git a/gcc/match.pd b/gcc/match.pd index 2d4e019..9e5df64 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -1216,6 +1216,13 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (if (cst && !TREE_OVERFLOW (cst)) (minus { cst; } @0))))) + /* CST - (CST - A) -> CST - A */ + (simplify + (minus CONSTANT_CLASS_P@1 (minus CONSTANT_CLASS_P@2 @0)) + (with { tree cst = const_binop (MINUS_EXPR, type, @1, @2); } + (if (cst && !TREE_OVERFLOW (cst)) + (minus { cst; } @0)))) + /* ~A + A -> -1 */ (simplify (plus:c (bit_not @0) @0) diff --git a/gcc/testsuite/gcc.dg/tree-ssa/forwprop-36.c b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-36.c new file mode 100644 index 0000000..9de73ff --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/forwprop-36.c @@ -0,0 +1,24 @@ +/* { dg-do compile { target int128 } } */ +/* { dg-options "-O -fdump-tree-cddce1" } */ + +typedef unsigned __int128 u128; + +u128 a, b; + +static inline u128 +foo (u128 p1) +{ + p1 += ~b; + return -p1; +} + +int +main () +{ + u128 x = foo (~0x7fffffffffffffff); + if (x != 0x8000000000000001) + __builtin_abort(); + return 0; +} + +/* { dg-final { scan-tree-dump "if \\(b.0_\[0-9\]+ != 0\\)" "cddce1" } } */