summaryrefslogtreecommitdiff
path: root/gcc/compare-elim.c
diff options
context:
space:
mode:
authorPaul Koning <ni1d@arrl.net>2018-06-07 13:55:05 -0400
committerPaul Koning <pkoning@gcc.gnu.org>2018-06-07 13:55:05 -0400
commita3e87f07f3dc36bd42ed82853429d64a4b5b9703 (patch)
tree2d3ec078e149f926309b09d57d900fb27c257a8d /gcc/compare-elim.c
parent75d1c00452b12b51121236930d09578bc01f6306 (diff)
downloadgcc-a3e87f07f3dc36bd42ed82853429d64a4b5b9703.tar.gz
compare-elim.c (try_merge_compare): Don't merge compare if address contains a side effect.
2018-06-07 Paul Koning <ni1d@arrl.net> 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
Diffstat (limited to 'gcc/compare-elim.c')
-rw-r--r--gcc/compare-elim.c13
1 files changed, 13 insertions, 0 deletions
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)