re PR tree-optimization/71452 (Wrong optimization of stores to _Bool via char*)

2016-06-08  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/71452
	* tree-ssa.c (non_rewritable_lvalue_p): Make sure that the
	type used for the SSA rewrite has enough precision to cover
	the dynamic type of the location.

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

From-SVN: r237214
This commit is contained in:
Richard Biener 2016-06-08 13:11:43 +00:00 committed by Richard Biener
parent 988c115ca0
commit 72d50660ad
4 changed files with 30 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2016-06-08 Richard Biener <rguenther@suse.de>
PR tree-optimization/71452
* tree-ssa.c (non_rewritable_lvalue_p): Make sure that the
type used for the SSA rewrite has enough precision to cover
the dynamic type of the location.
2016-06-08 Jakub Jelinek <jakub@redhat.com>
Richard Biener <rguenther@suse.de>

View File

@ -1,3 +1,8 @@
2016-06-08 Richard Biener <rguenther@suse.de>
PR tree-optimization/71452
* gcc.dg/torture/pr71452.c: New testcase.
2016-06-08 Jakub Jelinek <jakub@redhat.com>
PR c++/71448

View File

@ -0,0 +1,10 @@
/* { dg-do run } */
int main()
{
_Bool b;
*(char *)&b = 123;
if (*(char *)&b != 123)
__builtin_abort ();
return 0;
}

View File

@ -1292,6 +1292,14 @@ non_rewritable_lvalue_p (tree lhs)
if (integer_zerop (TREE_OPERAND (lhs, 1))
&& DECL_P (decl)
&& DECL_SIZE (decl) == TYPE_SIZE (TREE_TYPE (lhs))
/* If the dynamic type of the decl has larger precision than
the decl itself we can't use the decls type for SSA rewriting. */
&& ((! INTEGRAL_TYPE_P (TREE_TYPE (decl))
|| compare_tree_int (DECL_SIZE (decl),
TYPE_PRECISION (TREE_TYPE (decl))) == 0)
|| (INTEGRAL_TYPE_P (TREE_TYPE (lhs))
&& (TYPE_PRECISION (TREE_TYPE (decl))
>= TYPE_PRECISION (TREE_TYPE (lhs)))))
&& (TREE_THIS_VOLATILE (decl) == TREE_THIS_VOLATILE (lhs)))
return false;