aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2018-06-06 13:13:24 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2018-06-06 13:13:24 +0000
commit31a5d8c53883cd6ed31cd9d3320a5e0185a214b8 (patch)
tree21697896db187f87d4ae60c37f21cc561f54f079
parent1abc0f7f52c01e5fd1a8149eab1b5f4ad4e92fa5 (diff)
downloadgcc-31a5d8c53883cd6ed31cd9d3320a5e0185a214b8.zip
gcc-31a5d8c53883cd6ed31cd9d3320a5e0185a214b8.tar.gz
gcc-31a5d8c53883cd6ed31cd9d3320a5e0185a214b8.tar.bz2
re PR tree-optimization/86066 (wrong code for bit-field manipulation at -Os)
PR tree-optimization/86066 * gimple-ssa-store-merging.c (process_store): Do not bypass BIT_NOT_EXPR for BIT_INSERT_EXPR stores. From-SVN: r261232
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/gimple-ssa-store-merging.c5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr86066.c19
4 files changed, 33 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 18280e8..bda6ed4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2018-06-06 Eric Botcazou <ebotcazou@adacore.com>
+
+ PR tree-optimization/86066
+ * gimple-ssa-store-merging.c (process_store): Do not bypass BIT_NOT_EXPR
+ for BIT_INSERT_EXPR stores.
+
2018-06-06 Richard Biener <rguenther@suse.de>
PR tree-optimization/86062
diff --git a/gcc/gimple-ssa-store-merging.c b/gcc/gimple-ssa-store-merging.c
index 1cefdeb..007419b 100644
--- a/gcc/gimple-ssa-store-merging.c
+++ b/gcc/gimple-ssa-store-merging.c
@@ -4333,7 +4333,9 @@ pass_store_merging::process_store (gimple *stmt)
&& const_bitsize <= 64)
{
/* Bypass a conversion to the bit-field type. */
- if (is_gimple_assign (def_stmt) && CONVERT_EXPR_CODE_P (rhs_code))
+ if (!bit_not_p
+ && is_gimple_assign (def_stmt)
+ && CONVERT_EXPR_CODE_P (rhs_code))
{
tree rhs1 = gimple_assign_rhs1 (def_stmt);
if (TREE_CODE (rhs1) == SSA_NAME
@@ -4341,6 +4343,7 @@ pass_store_merging::process_store (gimple *stmt)
rhs = rhs1;
}
rhs_code = BIT_INSERT_EXPR;
+ bit_not_p = false;
ops[0].val = rhs;
ops[0].base_addr = NULL_TREE;
ops[1].base_addr = NULL_TREE;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 095cae3..f63c9d7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2018-06-06 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc.dg/torture/pr86066.c: New test.
+
2018-06-06 Richard Biener <rguenther@suse.de>
PR tree-optimization/86062
diff --git a/gcc/testsuite/gcc.dg/torture/pr86066.c b/gcc/testsuite/gcc.dg/torture/pr86066.c
new file mode 100644
index 0000000..9127ed3
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr86066.c
@@ -0,0 +1,19 @@
+/* PR tree-optimization/86066 */
+/* Testcase by Zhendong Su <Zhendong Su> */
+
+struct A
+{
+ int b:2;
+ int c:2;
+ unsigned d:8;
+};
+
+int main ()
+{
+ struct A t = { 0, 0, 2 };
+ L:
+ t.d = ~(~(~0 % t.d) % 2);
+ if (!t.d)
+ goto L;
+ return 0;
+}