Commit 95efa227 by Richard Biener Committed by Richard Biener

re PR tree-optimization/91126 (Incorrect constant propagation of BIT_FIELD_REF)

2019-07-10  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/91126
	* tree-ssa-sccvn.c (n_walk_cb_data::push_partial_def): Adjust
	native encoding offset for BYTES_BIG_ENDIAN.
	(vn_reference_lookup_3): Likewise.

	* gcc.dg/torture/pr91126.c: New testcase.

From-SVN: r273355
parent 8389386c
2019-07-10 Richard Biener <rguenther@suse.de> 2019-07-10 Richard Biener <rguenther@suse.de>
PR tree-optimization/91126
* tree-ssa-sccvn.c (n_walk_cb_data::push_partial_def): Adjust
native encoding offset for BYTES_BIG_ENDIAN.
(vn_reference_lookup_3): Likewise.
2019-07-10 Richard Biener <rguenther@suse.de>
* tree-ssa-sccvn.c (vn_reference_lookup_3): Look at valueized * tree-ssa-sccvn.c (vn_reference_lookup_3): Look at valueized
LHS whenever possible. LHS whenever possible.
......
2019-07-10 Richard Biener <rguenther@suse.de> 2019-07-10 Richard Biener <rguenther@suse.de>
PR tree-optimization/91126
* gcc.dg/torture/pr91126.c: New testcase.
2019-07-10 Richard Biener <rguenther@suse.de>
* gcc.dg/torture/ssa-fre-5.c: New testcase. * gcc.dg/torture/ssa-fre-5.c: New testcase.
* gcc.dg/torture/ssa-fre-6.c: Likewise. * gcc.dg/torture/ssa-fre-6.c: Likewise.
* gcc.dg/torture/ssa-fre-7.c: Likewise. * gcc.dg/torture/ssa-fre-7.c: Likewise.
......
/* { dg-do run } */
struct S
{
__INT32_TYPE__ a : 24;
__INT32_TYPE__ b : 8;
} s;
int
main()
{
s.a = 0xfefefe;
s.b = 0xfe;
unsigned char c;
c = ((unsigned char *)&s)[0];
if (c != 0xfe)
__builtin_abort ();
c = ((unsigned char *)&s)[1];
if (c != 0xfe)
__builtin_abort ();
c = ((unsigned char *)&s)[2];
if (c != 0xfe)
__builtin_abort ();
c = ((unsigned char *)&s)[3];
if (c != 0xfe)
__builtin_abort ();
return 0;
}
...@@ -1832,10 +1832,20 @@ vn_walk_cb_data::push_partial_def (const pd_data &pd, tree vuse, ...@@ -1832,10 +1832,20 @@ vn_walk_cb_data::push_partial_def (const pd_data &pd, tree vuse,
0, MIN ((HOST_WIDE_INT)sizeof (buffer), pd.size)); 0, MIN ((HOST_WIDE_INT)sizeof (buffer), pd.size));
else else
{ {
unsigned pad = 0;
if (BYTES_BIG_ENDIAN
&& is_a <scalar_mode> (TYPE_MODE (TREE_TYPE (pd.rhs))))
{
/* On big-endian the padding is at the 'front' so
just skip the initial bytes. */
fixed_size_mode mode = as_a <fixed_size_mode>
(TYPE_MODE (TREE_TYPE (pd.rhs)));
pad = GET_MODE_SIZE (mode) - pd.size;
}
len = native_encode_expr (pd.rhs, len = native_encode_expr (pd.rhs,
buffer + MAX (0, pd.offset), buffer + MAX (0, pd.offset),
sizeof (buffer - MAX (0, pd.offset)), sizeof (buffer - MAX (0, pd.offset)),
MAX (0, -pd.offset)); MAX (0, -pd.offset) + pad);
if (len <= 0 if (len <= 0
|| len < (pd.size - MAX (0, -pd.offset))) || len < (pd.size - MAX (0, -pd.offset)))
{ {
...@@ -2588,9 +2598,20 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *data_, ...@@ -2588,9 +2598,20 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *data_,
tree rhs = gimple_assign_rhs1 (def_stmt); tree rhs = gimple_assign_rhs1 (def_stmt);
if (TREE_CODE (rhs) == SSA_NAME) if (TREE_CODE (rhs) == SSA_NAME)
rhs = SSA_VAL (rhs); rhs = SSA_VAL (rhs);
unsigned pad = 0;
if (BYTES_BIG_ENDIAN
&& is_a <scalar_mode> (TYPE_MODE (TREE_TYPE (rhs))))
{
/* On big-endian the padding is at the 'front' so
just skip the initial bytes. */
fixed_size_mode mode
= as_a <fixed_size_mode> (TYPE_MODE (TREE_TYPE (rhs)));
pad = GET_MODE_SIZE (mode) - size2i / BITS_PER_UNIT;
}
len = native_encode_expr (rhs, len = native_encode_expr (rhs,
buffer, sizeof (buffer), buffer, sizeof (buffer),
(offseti - offset2i) / BITS_PER_UNIT); ((offseti - offset2i) / BITS_PER_UNIT
+ pad));
if (len > 0 && len * BITS_PER_UNIT >= maxsizei) if (len > 0 && len * BITS_PER_UNIT >= maxsizei)
{ {
tree type = vr->type; tree type = vr->type;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment