diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 22f990a3088c..3ef5b4d68f74 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2020-02-15 Jakub Jelinek + + PR tree-optimization/93744 + * match.pd (((m1 >/=/<= m2) * d -> (m1 >/=/<= m2) ? d : 0, + A - ((A - B) & -(C cmp D)) -> (C cmp D) ? B : A, + A + ((B - A) & -(C cmp D)) -> (C cmp D) ? B : A): For GENERIC, make + sure @2 in the first and @1 in the other patterns has no side-effects. + 2020-02-15 David Malcolm Bernd Edlinger diff --git a/gcc/match.pd b/gcc/match.pd index 73834c255935..19df0c404a47 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -1472,7 +1472,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (for cmp (gt lt ge le) (simplify (mult (convert (cmp @0 @1)) @2) - (cond (cmp @0 @1) @2 { build_zero_cst (type); }))) + (if (GIMPLE || !TREE_SIDE_EFFECTS (@2)) + (cond (cmp @0 @1) @2 { build_zero_cst (type); })))) /* For integral types with undefined overflow and C != 0 fold x * C EQ/NE y * C into x EQ/NE y. */ @@ -2709,7 +2710,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) && TREE_CODE (TREE_TYPE (@4)) != BOOLEAN_TYPE && INTEGRAL_TYPE_P (TREE_TYPE (@5)) && (TYPE_PRECISION (TREE_TYPE (@4)) >= TYPE_PRECISION (type) - || !TYPE_UNSIGNED (TREE_TYPE (@4)))) + || !TYPE_UNSIGNED (TREE_TYPE (@4))) + && (GIMPLE || !TREE_SIDE_EFFECTS (@1))) (cond (cmp @2 @3) @1 @0))) (simplify (plus:c @0 (bit_and:c (minus @1 @0) @@ -2719,7 +2721,8 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) && TREE_CODE (TREE_TYPE (@4)) != BOOLEAN_TYPE && INTEGRAL_TYPE_P (TREE_TYPE (@5)) && (TYPE_PRECISION (TREE_TYPE (@4)) >= TYPE_PRECISION (type) - || !TYPE_UNSIGNED (TREE_TYPE (@4)))) + || !TYPE_UNSIGNED (TREE_TYPE (@4))) + && (GIMPLE || !TREE_SIDE_EFFECTS (@1))) (cond (cmp @2 @3) @1 @0)))) /* Simplifications of shift and rotates. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3059e238ff31..77c781a40e8b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2020-02-15 Jakub Jelinek + + PR tree-optimization/93744 + * gcc.c-torture/execute/pr93744-1.c: New test. + * gcc.c-torture/execute/pr93744-2.c: New test. + * gcc.c-torture/execute/pr93744-3.c: New test. + 2020-02-14 Jakub Jelinek PR c++/61414 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr93744-1.c b/gcc/testsuite/gcc.c-torture/execute/pr93744-1.c new file mode 100644 index 000000000000..3229c9b2bd67 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr93744-1.c @@ -0,0 +1,14 @@ +/* PR tree-optimization/93744 */ + +typedef int I; + +int +main () +{ + int a = 0; + I b = 0; + (a > 0) * (b |= 2); + if (b != 2) + __builtin_abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.c-torture/execute/pr93744-2.c b/gcc/testsuite/gcc.c-torture/execute/pr93744-2.c new file mode 100644 index 000000000000..0c1baaac77b3 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr93744-2.c @@ -0,0 +1,21 @@ +/* PR tree-optimization/93744 */ + +int w; + +int +foo (int x, int y, int z) +{ + int r = z - ((z - w++) & -(x < y)); + return r; +} + +int +main () +{ + w = 4; + if (foo (5, 7, 12) != 4 || w != 5) + __builtin_abort (); + if (foo (7, 5, 12) != 12 || w != 6) + __builtin_abort (); + return 0; +} diff --git a/gcc/testsuite/gcc.c-torture/execute/pr93744-3.c b/gcc/testsuite/gcc.c-torture/execute/pr93744-3.c new file mode 100644 index 000000000000..8542c7c53ba0 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr93744-3.c @@ -0,0 +1,21 @@ +/* PR tree-optimization/93744 */ + +int w; + +int +foo (int x, int y, int z) +{ + int r = z + ((w++ - z) & -(x < y)); + return r; +} + +int +main () +{ + w = 4; + if (foo (5, 7, 12) != 4 || w != 5) + __builtin_abort (); + if (foo (7, 5, 12) != 12 || w != 6) + __builtin_abort (); + return 0; +}