aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1997-05-08 13:20:18 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1997-05-08 13:20:18 -0400
commit96f06cb6dda0ad26a734dea2f05dd07a246b7ef1 (patch)
tree880d3ba72df0358a5622b61385ba909ee7c49f28 /gcc
parent95e8f2f3064f8ac1e9b6be9a25afb1d123b7ec4f (diff)
downloadgcc-96f06cb6dda0ad26a734dea2f05dd07a246b7ef1.zip
gcc-96f06cb6dda0ad26a734dea2f05dd07a246b7ef1.tar.gz
gcc-96f06cb6dda0ad26a734dea2f05dd07a246b7ef1.tar.bz2
(fold, truth_andor): Disable optimization for side effects on RHS.
From-SVN: r14047
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fold-const.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 84e098a..45311c9 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -4791,12 +4791,14 @@ fold (expr)
to A || (B && C). Note that either operator can be any of the four
truth and/or operations and the transformation will still be
valid. Also note that we only care about order for the
- ANDIF and ORIF operators. */
+ ANDIF and ORIF operators. If B contains side effects, this
+ might change the truth-value of A. */
if (TREE_CODE (arg0) == TREE_CODE (arg1)
&& (TREE_CODE (arg0) == TRUTH_ANDIF_EXPR
|| TREE_CODE (arg0) == TRUTH_ORIF_EXPR
|| TREE_CODE (arg0) == TRUTH_AND_EXPR
- || TREE_CODE (arg0) == TRUTH_OR_EXPR))
+ || TREE_CODE (arg0) == TRUTH_OR_EXPR)
+ && ! TREE_SIDE_EFFECTS (TREE_OPERAND (arg0, 1)))
{
tree a00 = TREE_OPERAND (arg0, 0);
tree a01 = TREE_OPERAND (arg0, 1);