From a3e87f07f3dc36bd42ed82853429d64a4b5b9703 Mon Sep 17 00:00:00 2001 From: Paul Koning Date: Thu, 7 Jun 2018 13:55:05 -0400 Subject: [PATCH] compare-elim.c (try_merge_compare): Don't merge compare if address contains a side effect. 2018-06-07 Paul Koning gcc/ * compare-elim.c (try_merge_compare): Don't merge compare if address contains a side effect. (try_eliminate_compare): Likewise. gcc/testsuite/ * gcc.c-torture/compile/20180605-1.c: New test. From-SVN: r261287 --- gcc/ChangeLog | 6 ++++++ gcc/compare-elim.c | 13 +++++++++++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.c-torture/compile/20180605-1.c | 9 +++++++++ 4 files changed, 32 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/20180605-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 81eec65e43d..ee56a211d59 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-06-07 Paul Koning + + * compare-elim.c (try_merge_compare): Don't merge compare if + address contains a side effect. + (try_eliminate_compare): Likewise. + 2018-06-07 Olga Makhotina * config.gcc: Support "tremont". diff --git a/gcc/compare-elim.c b/gcc/compare-elim.c index 16576c44473..50bbaa84b6d 100644 --- a/gcc/compare-elim.c +++ b/gcc/compare-elim.c @@ -690,6 +690,13 @@ try_merge_compare (struct comparison *cmp) return false; rtx src = SET_SRC (set); + + /* If the source uses addressing modes with side effects, we can't + do the merge because we'd end up with a PARALLEL that has two + instances of that side effect in it. */ + if (side_effects_p (src)) + return false; + rtx flags = maybe_select_cc_mode (cmp, src, CONST0_RTX (GET_MODE (src))); if (!flags) { @@ -809,6 +816,12 @@ try_eliminate_compare (struct comparison *cmp) else return false; + /* If the source uses addressing modes with side effects, we can't + do the merge because we'd end up with a PARALLEL that has two + instances of that side effect in it. */ + if (side_effects_p (cmp_src)) + return false; + /* Determine if we ought to use a different CC_MODE here. */ flags = maybe_select_cc_mode (cmp, cmp_src, in_b); if (flags == NULL) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f26dd5b2f58..272cb03f80c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2018-06-07 Paul Koning + + * gcc.c-torture/compile/20180605-1.c: New test. + 2018-06-07 Steven G. Kargl PR fortran/86045 diff --git a/gcc/testsuite/gcc.c-torture/compile/20180605-1.c b/gcc/testsuite/gcc.c-torture/compile/20180605-1.c new file mode 100644 index 00000000000..915dafddad0 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20180605-1.c @@ -0,0 +1,9 @@ +void f (int *p, int n) +{ + int j = 0, k; + + for (int i = 0; i < n; i++) + if ((k = *p++) > 0) + j += k; + return j; +} -- 2.30.2