diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2018-06-03 11:51:10 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2018-06-03 11:51:10 +0000 |
commit | c14add82fa4ec24a09e48d56094d9f46310f0809 (patch) | |
tree | 74d872b2a20990ecc63ce48b040263450fdce3df /gcc | |
parent | 5b9a3332c27e2f4ea372f2fc53bcbd27e204fb73 (diff) | |
download | gcc-c14add82fa4ec24a09e48d56094d9f46310f0809.zip gcc-c14add82fa4ec24a09e48d56094d9f46310f0809.tar.gz gcc-c14add82fa4ec24a09e48d56094d9f46310f0809.tar.bz2 |
re PR tree-optimization/86034 (wrong code for bit-field manipulation at -Os)
PR tree-optimization/86034
* gimple-ssa-store-merging.c (output_merged_store): Convert the RHS to
the unsigned bitfield type in a bit insertion sequence if it does not
have a larger precision than the bitfield size.
(process_store): Also bypass widening conversions for BIT_INSERT_EXPR.
From-SVN: r261128
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/gimple-ssa-store-merging.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr86034.c | 32 |
4 files changed, 54 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0dc3091b..4faeadc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2018-06-03 Eric Botcazou <ebotcazou@adacore.com> + + PR tree-optimization/86034 + * gimple-ssa-store-merging.c (output_merged_store): Convert the RHS to + the unsigned bitfield type in a bit insertion sequence if it does not + have a larger precision than the bitfield size. + (process_store): Also bypass widening conversions for BIT_INSERT_EXPR. + 2018-06-03 Kito Cheng <kito.cheng@gmail.com> * config/nds32/nds32-peephole2.md: Add new patterns for code size. diff --git a/gcc/gimple-ssa-store-merging.c b/gcc/gimple-ssa-store-merging.c index 3c63e75..b972f9b 100644 --- a/gcc/gimple-ssa-store-merging.c +++ b/gcc/gimple-ssa-store-merging.c @@ -3778,7 +3778,14 @@ imm_store_chain_info::output_merged_store (merged_store_group *group) const HOST_WIDE_INT end_gap = (try_bitpos + try_size) - (info->bitpos + info->bitsize); tree tem = info->ops[0].val; - if ((BYTES_BIG_ENDIAN ? start_gap : end_gap) > 0) + if (TYPE_PRECISION (TREE_TYPE (tem)) <= info->bitsize) + { + tree bitfield_type + = build_nonstandard_integer_type (info->bitsize, + UNSIGNED); + tem = gimple_convert (&seq, loc, bitfield_type, tem); + } + else if ((BYTES_BIG_ENDIAN ? start_gap : end_gap) > 0) { const unsigned HOST_WIDE_INT imask = (HOST_WIDE_INT_1U << info->bitsize) - 1; @@ -4270,13 +4277,12 @@ pass_store_merging::process_store (gimple *stmt) || !multiple_p (bitpos, BITS_PER_UNIT)) && const_bitsize <= 64) { - /* Bypass a truncating conversion to the bit-field type. */ + /* Bypass a conversion to the bit-field type. */ if (is_gimple_assign (def_stmt) && CONVERT_EXPR_CODE_P (rhs_code)) { tree rhs1 = gimple_assign_rhs1 (def_stmt); if (TREE_CODE (rhs1) == SSA_NAME - && INTEGRAL_TYPE_P (TREE_TYPE (rhs1)) - && const_bitsize <= TYPE_PRECISION (TREE_TYPE (rhs1))) + && INTEGRAL_TYPE_P (TREE_TYPE (rhs1))) rhs = rhs1; } rhs_code = BIT_INSERT_EXPR; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 084c231..1367ca6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2018-06-03 Eric Botcazou <ebotcazou@adacore.com> + + * gcc.dg/torture/pr86034.c: New test. + 2018-06-03 Paul Thomas <pault@gcc.gnu.org> PR fortran/36497 diff --git a/gcc/testsuite/gcc.dg/torture/pr86034.c b/gcc/testsuite/gcc.dg/torture/pr86034.c new file mode 100644 index 0000000..247428c --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr86034.c @@ -0,0 +1,32 @@ +/* PR tree-optimization/86034 */ +/* Testcase by Zhendong Su <su@cs.ucdavis.edu> */ + +/* { dg-do run } */ + +struct A +{ + int b; + int c:24; + int d:10; + int e; +} f; + +int g; + +void h () +{ + struct A i = { 0, 0, -1, 0 }; +L: + f = i; + i.d = 0; + if (g < 0) + goto L; +} + +int main (void) +{ + h (); + if (f.e != 0) + __builtin_abort (); + return 0; +} |