aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-10-23 08:25:55 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-10-23 08:25:55 +0000
commit4d885a639e4a72665b95fa895032d2600418d390 (patch)
tree004e2ca23be9197e0f29a83864df1f382bc5f99b
parenta15d2ea8adf0aeb4e02872b0fb55b513035de2d6 (diff)
downloadgcc-4d885a639e4a72665b95fa895032d2600418d390.zip
gcc-4d885a639e4a72665b95fa895032d2600418d390.tar.gz
gcc-4d885a639e4a72665b95fa895032d2600418d390.tar.bz2
fold-const.c (fold_binary_loc): Preserve side-effects of X - X when simplifying to 0.
2014-10-22 Richard Biener <rguenther@suse.de> * fold-const.c (fold_binary_loc): Preserve side-effects of X - X when simplifying to 0. * stor-layout.c (finish_bitfield_representative): Strip side-effects of evaluating the difference of two DECL_FIELD_OFFSET. From-SVN: r216575
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/fold-const.c2
-rw-r--r--gcc/stor-layout.c2
3 files changed, 10 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5bc8b64..fa3a9cc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2014-10-23 Richard Biener <rguenther@suse.de>
+
+ * fold-const.c (fold_binary_loc): Preserve side-effects of
+ X - X when simplifying to 0.
+ * stor-layout.c (finish_bitfield_representative): Strip
+ side-effects of evaluating the difference of two DECL_FIELD_OFFSET.
+
2014-10-22 Richard Biener <rguenther@suse.de>
Tobias Burnus <burnus@net-b.de>
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 1e7e932..d70658c3 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -10749,7 +10749,7 @@ fold_binary_loc (location_t loc,
if ((!FLOAT_TYPE_P (type) || !HONOR_NANS (TYPE_MODE (type)))
&& operand_equal_p (arg0, arg1, 0))
- return build_zero_cst (type);
+ return omit_one_operand_loc (loc, type, build_zero_cst (type), arg0);
/* A - B -> A + (-B) if B is easily negatable. */
if (negate_expr_p (arg1)
diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c
index 237cf69..9f0064b 100644
--- a/gcc/stor-layout.c
+++ b/gcc/stor-layout.c
@@ -1860,6 +1860,8 @@ finish_bitfield_representative (tree repr, tree field)
size = size_diffop (DECL_FIELD_OFFSET (field),
DECL_FIELD_OFFSET (repr));
+ while (TREE_CODE (size) == COMPOUND_EXPR)
+ size = TREE_OPERAND (size, 1);
gcc_assert (tree_fits_uhwi_p (size));
bitsize = (tree_to_uhwi (size) * BITS_PER_UNIT
+ tree_to_uhwi (DECL_FIELD_BIT_OFFSET (field))