Commit 8389386c by Richard Biener Committed by Richard Biener

gimple-parser.c (c_parser_gimple_postfix_expression): Support _Literal (int *)…

gimple-parser.c (c_parser_gimple_postfix_expression): Support _Literal (int *) &x for address literals.

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

	c/
	* gimple-parser.c (c_parser_gimple_postfix_expression): Support
	_Literal (int *) &x for address literals.

	* tree-ssa-sccvn.c (vn_reference_lookup_3): Look at valueized
	LHS whenever possible.

	* gcc.dg/torture/ssa-fre-5.c: New testcase.
	* gcc.dg/torture/ssa-fre-6.c: Likewise.
	* gcc.dg/torture/ssa-fre-7.c: Likewise.

From-SVN: r273354
parent f861d731
2019-07-10 Richard Biener <rguenther@suse.de>
* tree-ssa-sccvn.c (vn_reference_lookup_3): Look at valueized
LHS whenever possible.
2019-07-09 Jan Hubicka <hubicka@ucw.cz> 2019-07-09 Jan Hubicka <hubicka@ucw.cz>
* tree-ssa-alias.c (nonoverlapping_component_refs_p_1): Break out * tree-ssa-alias.c (nonoverlapping_component_refs_p_1): Break out
......
2019-07-10 Richard Biener <rguenther@suse.de>
* gimple-parser.c (c_parser_gimple_postfix_expression): Support
_Literal (int *) &x for address literals.
2019-07-09 Martin Sebor <msebor@redhat.com> 2019-07-09 Martin Sebor <msebor@redhat.com>
PR c++/61339 PR c++/61339
......
...@@ -1606,8 +1606,10 @@ c_parser_gimple_postfix_expression (gimple_parser &parser) ...@@ -1606,8 +1606,10 @@ c_parser_gimple_postfix_expression (gimple_parser &parser)
tree val = c_parser_gimple_postfix_expression (parser).value; tree val = c_parser_gimple_postfix_expression (parser).value;
if (! val if (! val
|| val == error_mark_node || val == error_mark_node
|| ! CONSTANT_CLASS_P (val) || (!CONSTANT_CLASS_P (val)
|| (addr_p && TREE_CODE (val) != STRING_CST)) && !(addr_p
&& (TREE_CODE (val) == STRING_CST
|| DECL_P (val)))))
{ {
c_parser_error (parser, "invalid _Literal"); c_parser_error (parser, "invalid _Literal");
return expr; return expr;
......
2019-07-10 Richard Biener <rguenther@suse.de>
* gcc.dg/torture/ssa-fre-5.c: New testcase.
* gcc.dg/torture/ssa-fre-6.c: Likewise.
* gcc.dg/torture/ssa-fre-7.c: Likewise.
2019-07-10 Ed Schonberg <schonberg@adacore.com> 2019-07-10 Ed Schonberg <schonberg@adacore.com>
* gnat.dg/modular5.adb: New testcase. * gnat.dg/modular5.adb: New testcase.
......
/* { dg-do compile } */
/* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */
/* { dg-additional-options "-fgimple -fdump-tree-fre1" } */
typedef int v4si __attribute__((vector_size(16)));
int __GIMPLE (ssa,startwith("fre"))
foo ()
{
int * p;
int i;
int x[4];
long unsigned int _1;
long unsigned int _2;
int _7;
__BB(2):
i_3 = 0;
_1 = (long unsigned int) i_3;
_2 = _1 * 4ul;
p_4 = _Literal (int *) &x + _2;
__MEM <v4si> ((v4si *)p_4) = _Literal (v4si) { 1, 2, 3, 4 };
_7 = x[0];
return _7;
}
/* { dg-final { scan-tree-dump "return 1;" "fre1" } } */
/* { dg-do compile } */
/* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */
/* { dg-additional-options "-fgimple -fdump-tree-fre1" } */
typedef int v4si __attribute__((vector_size(16)));
int __GIMPLE (ssa,startwith("fre"))
foo ()
{
int * p;
int i;
int x[4];
long unsigned int _1;
long unsigned int _2;
int _7;
__BB(2):
i_3 = 0;
_1 = (long unsigned int) i_3;
_2 = _1 * 4ul;
p_4 = _Literal (int *) &x + _2;
__MEM <v4si> ((v4si *)p_4) = _Literal (v4si) {};
_7 = x[0];
return _7;
}
/* { dg-final { scan-tree-dump "return 0;" "fre1" } } */
/* { dg-do compile } */
/* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */
/* { dg-additional-options "-fgimple -fdump-tree-fre1" } */
typedef int v4si __attribute__((vector_size(16)));
int __GIMPLE (ssa,startwith("fre"))
foo (int c)
{
int * p;
int i;
int x[4];
long unsigned int _1;
long unsigned int _2;
int _7;
v4si _6;
__BB(2):
i_3 = 0;
_1 = (long unsigned int) i_3;
_2 = _1 * 4ul;
p_4 = _Literal (int *) &x + _2;
_6 = _Literal (v4si) { c_5(D), c_5(D), c_5(D), c_5(D) };
__MEM <v4si> ((v4si *)p_4) = _6;
_7 = x[0];
return _7;
}
/* { dg-final { scan-tree-dump "return c_5\\(D\\);" "fre1" } } */
...@@ -2488,12 +2488,22 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *data_, ...@@ -2488,12 +2488,22 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *data_,
&& gimple_assign_rhs_code (def_stmt) == CONSTRUCTOR && gimple_assign_rhs_code (def_stmt) == CONSTRUCTOR
&& CONSTRUCTOR_NELTS (gimple_assign_rhs1 (def_stmt)) == 0) && CONSTRUCTOR_NELTS (gimple_assign_rhs1 (def_stmt)) == 0)
{ {
tree lhs = gimple_assign_lhs (def_stmt);
tree base2; tree base2;
poly_int64 offset2, size2, maxsize2; poly_int64 offset2, size2, maxsize2;
HOST_WIDE_INT offset2i, size2i; HOST_WIDE_INT offset2i, size2i;
bool reverse; bool reverse;
base2 = get_ref_base_and_extent (gimple_assign_lhs (def_stmt), if (lhs_ref_ok)
&offset2, &size2, &maxsize2, &reverse); {
base2 = ao_ref_base (&lhs_ref);
offset2 = lhs_ref.offset;
size2 = lhs_ref.size;
maxsize2 = lhs_ref.max_size;
reverse = reverse_storage_order_for_component_p (lhs);
}
else
base2 = get_ref_base_and_extent (lhs,
&offset2, &size2, &maxsize2, &reverse);
if (known_size_p (maxsize2) if (known_size_p (maxsize2)
&& known_eq (maxsize2, size2) && known_eq (maxsize2, size2)
&& adjust_offsets_for_equal_base_address (base, &offset, && adjust_offsets_for_equal_base_address (base, &offset,
...@@ -2541,12 +2551,22 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *data_, ...@@ -2541,12 +2551,22 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *data_,
|| (TREE_CODE (gimple_assign_rhs1 (def_stmt)) == SSA_NAME || (TREE_CODE (gimple_assign_rhs1 (def_stmt)) == SSA_NAME
&& is_gimple_min_invariant (SSA_VAL (gimple_assign_rhs1 (def_stmt)))))) && is_gimple_min_invariant (SSA_VAL (gimple_assign_rhs1 (def_stmt))))))
{ {
tree lhs = gimple_assign_lhs (def_stmt);
tree base2; tree base2;
poly_int64 offset2, size2, maxsize2; poly_int64 offset2, size2, maxsize2;
HOST_WIDE_INT offset2i, size2i; HOST_WIDE_INT offset2i, size2i;
bool reverse; bool reverse;
base2 = get_ref_base_and_extent (gimple_assign_lhs (def_stmt), if (lhs_ref_ok)
&offset2, &size2, &maxsize2, &reverse); {
base2 = ao_ref_base (&lhs_ref);
offset2 = lhs_ref.offset;
size2 = lhs_ref.size;
maxsize2 = lhs_ref.max_size;
reverse = reverse_storage_order_for_component_p (lhs);
}
else
base2 = get_ref_base_and_extent (lhs,
&offset2, &size2, &maxsize2, &reverse);
if (base2 if (base2
&& !reverse && !reverse
&& known_eq (maxsize2, size2) && known_eq (maxsize2, size2)
...@@ -2627,12 +2647,21 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *data_, ...@@ -2627,12 +2647,21 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *data_,
downstream, not so much for actually doing the insertion. */ downstream, not so much for actually doing the insertion. */
&& data->partial_defs.is_empty ()) && data->partial_defs.is_empty ())
{ {
tree lhs = gimple_assign_lhs (def_stmt);
tree base2; tree base2;
poly_int64 offset2, size2, maxsize2; poly_int64 offset2, size2, maxsize2;
bool reverse; bool reverse;
base2 = get_ref_base_and_extent (gimple_assign_lhs (def_stmt), if (lhs_ref_ok)
&offset2, &size2, &maxsize2, {
&reverse); base2 = ao_ref_base (&lhs_ref);
offset2 = lhs_ref.offset;
size2 = lhs_ref.size;
maxsize2 = lhs_ref.max_size;
reverse = reverse_storage_order_for_component_p (lhs);
}
else
base2 = get_ref_base_and_extent (lhs,
&offset2, &size2, &maxsize2, &reverse);
tree def_rhs = gimple_assign_rhs1 (def_stmt); tree def_rhs = gimple_assign_rhs1 (def_stmt);
if (!reverse if (!reverse
&& known_size_p (maxsize2) && known_size_p (maxsize2)
......
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