diff options
author | Richard Biener <rguenther@suse.de> | 2018-02-28 13:40:41 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2018-02-28 13:40:41 +0000 |
commit | 9348eb677eb9e113ae7889faa5466723a307941f (patch) | |
tree | fcffeb99d5674cf27e19b9ce648a6e5782e6b8c0 | |
parent | 35129fd3a745403bec0a06d62b18fc30ce1bbf8e (diff) | |
download | gcc-9348eb677eb9e113ae7889faa5466723a307941f.zip gcc-9348eb677eb9e113ae7889faa5466723a307941f.tar.gz gcc-9348eb677eb9e113ae7889faa5466723a307941f.tar.bz2 |
re PR c/84607 (Side effects discarded in address computation inside 'if')
2018-02-28 Richard Biener <rguenther@suse.de>
PR middle-end/84607
* genmatch.c (capture_info::walk_match): Do not mark
captured expressions without operands as expr_p given
they act more like predicates and should be subject to
"lost tail" side-effect preserving.
* gcc.dg/pr84607.c: New testcase.
From-SVN: r258061
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/genmatch.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr84607.c | 16 |
4 files changed, 34 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8eedfca..d7f8754 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2018-02-28 Richard Biener <rguenther@suse.de> + + PR middle-end/84607 + * genmatch.c (capture_info::walk_match): Do not mark + captured expressions without operands as expr_p given + they act more like predicates and should be subject to + "lost tail" side-effect preserving. + 2018-02-28 Alexandre Oliva <aoliva@redhat.com> PR rtl-optimization/81611 diff --git a/gcc/genmatch.c b/gcc/genmatch.c index e2b2cbf..be6efe3 100644 --- a/gcc/genmatch.c +++ b/gcc/genmatch.c @@ -2104,7 +2104,11 @@ capture_info::walk_match (operand *o, unsigned toplevel_arg, if (c->what && (e = dyn_cast <expr *> (c->what))) { - info[where].expr_p = true; + /* Zero-operand expression captures like ADDR_EXPR@0 are + similar as predicates -- if they are not mentioned in + the result we have to force them to have no side-effects. */ + if (e->ops.length () != 0) + info[where].expr_p = true; info[where].force_single_use |= e->force_single_use; } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 252a33a..eaa5041 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-02-28 Richard Biener <rguenther@suse.de> + + PR middle-end/84607 + * gcc.dg/pr84607.c: New testcase. + 2018-02-28 Nathan Sidwell <nathan@acm.org> PR c++/84602 diff --git a/gcc/testsuite/gcc.dg/pr84607.c b/gcc/testsuite/gcc.dg/pr84607.c new file mode 100644 index 0000000..710ee94 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr84607.c @@ -0,0 +1,16 @@ +/* { dg-do run } */ + +extern void exit(int); +extern void abort(void); +int a[10]; +int foo() +{ + exit (0); + return 0; +} +int main() +{ + if (&a[foo()]) + abort (); + return 0; +} |