diff options
author | Eric Botcazou <ebotcazou@libertysurf.fr> | 2003-07-03 09:30:03 +0200 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2003-07-03 07:30:03 +0000 |
commit | 8821d0914c6c0679a76995f95e7b7cc38d258da3 (patch) | |
tree | 7e595affeb40107a2fa540e31a6dd8bea9a5cbed /gcc | |
parent | 7960bf2230487ce4626051a2710ecdab9a57d183 (diff) | |
download | gcc-8821d0914c6c0679a76995f95e7b7cc38d258da3.zip gcc-8821d0914c6c0679a76995f95e7b7cc38d258da3.tar.gz gcc-8821d0914c6c0679a76995f95e7b7cc38d258da3.tar.bz2 |
re PR rtl-optimization/11381 (volatile memory access optimized away)
PR optimization/11381
* simplify-rtx.c (simplify_relational_operation): Check that
two equal operands have no side-effects before simplifying
the comparison.
From-SVN: r68869
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/simplify-rtx.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/i386-volatile-1.c | 14 |
4 files changed, 29 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7a29f36..b96942d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2003-07-03 Eric Botcazou <ebotcazou@libertysurf.fr> + + PR optimization/11381 + * simplify-rtx.c (simplify_relational_operation): Check that + two equal operands have no side-effects before simplifying + the comparison. + 2003-07-02 Jeff Law <law@redhat.com> * expr.c (do_store_flag): Remove special case folding for diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index 132b3ab..f49f53d 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -2220,8 +2220,10 @@ simplify_relational_operation (code, mode, op0, op1) return const0_rtx; /* For modes without NaNs, if the two operands are equal, we know the - result. */ - if (!HONOR_NANS (GET_MODE (trueop0)) && rtx_equal_p (trueop0, trueop1)) + result except if they have side-effects. */ + if (! HONOR_NANS (GET_MODE (trueop0)) + && rtx_equal_p (trueop0, trueop1) + && ! side_effects_p (trueop0)) equal = 1, op0lt = 0, op0ltu = 0, op1lt = 0, op1ltu = 0; /* If the operands are floating-point constants, see if we can fold diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 78f0f59..e598f21 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-07-03 Eric Botcazou <ebotcazou@libertysurf.fr> + + * gcc.dg/i386-volatile-1.c: New test. + 2003-07-02 Nathan Sidwell <nathan@codesourcery.com> PR c++/11072 diff --git a/gcc/testsuite/gcc.dg/i386-volatile-1.c b/gcc/testsuite/gcc.dg/i386-volatile-1.c new file mode 100644 index 0000000..633ea50 --- /dev/null +++ b/gcc/testsuite/gcc.dg/i386-volatile-1.c @@ -0,0 +1,14 @@ +/* PR optimization/11381 */ +/* Originator: <tobias@ringstrom.mine.nu> */ +/* { dg-do compile { target i?86-*-* } } */ +/* { dg-options "-O" } */ + +/* Verify that the comparison is not optimized away. */ + +void foo(volatile unsigned int *vaddr) +{ + while (*vaddr != *vaddr) + ; +} + +/* { dg-final { scan-assembler "cmp" } } */ |