Commit 2dfb6ce1 by Daniel Berlin Committed by Daniel Berlin

tree-ssa-sccvn.c (expressions_equal_p): Check type equality.

2008-07-15  Daniel Berlin  <dberlin@dberlin.org>

	* tree-ssa-sccvn.c (expressions_equal_p): Check type equality.
	* tree-ssa-pre.c (pre_expr_eq): Ditto
	(get_constant_for_value_id): Take a type as an argument.
	(fully_constant_expression): Pass in type.
	(find_or_generate_expression): Short circuit constant case.
	(create_expression_by_pieces): Remove special casing of
	pointer_plus.
	(do_regular_insertion): Short circuit constant case.
	(do_partial_partial_insertion): Ditto.

From-SVN: r137859
parent 15e38d0d
2008-07-15 Daniel Berlin <dberlin@dberlin.org>
* tree-ssa-sccvn.c (expressions_equal_p): Check type equality.
* tree-ssa-pre.c (pre_expr_eq): Ditto
(get_constant_for_value_id): Take a type as an argument.
(fully_constant_expression): Pass in type.
(find_or_generate_expression): Short circuit constant case.
(create_expression_by_pieces): Remove special casing of
pointer_plus.
(do_regular_insertion): Short circuit constant case.
(do_partial_partial_insertion): Ditto.
2008-07-15 Kaz Kojima <kkojima@gcc.gnu.org> 2008-07-15 Kaz Kojima <kkojima@gcc.gnu.org>
PR target/36782 PR target/36782
......
/* This code used to crash fold_convert due to PRE /* This code used to crash fold_convert due to PRE
wanting to fold_convert from a REA_TYPE to an INTEGER_TYPE. */ wanting to fold_convert from a REAL_TYPE to an INTEGER_TYPE. */
typedef unsigned int uint32_t; typedef unsigned int uint32_t;
union double_union union double_union
{ {
......
...@@ -193,8 +193,13 @@ pre_expr_eq (const void *p1, const void *p2) ...@@ -193,8 +193,13 @@ pre_expr_eq (const void *p1, const void *p2)
switch (e1->kind) switch (e1->kind)
{ {
case CONSTANT: case CONSTANT:
return expressions_equal_p (PRE_EXPR_CONSTANT (e1), {
PRE_EXPR_CONSTANT (e2)); tree const0 = PRE_EXPR_CONSTANT (e1);
tree const1 = PRE_EXPR_CONSTANT (e2);
return TREE_TYPE (const1) == TREE_TYPE (const0)
&& expressions_equal_p (const0, const1);
}
break;
case NAME: case NAME:
return PRE_EXPR_NAME (e1) == PRE_EXPR_NAME (e2); return PRE_EXPR_NAME (e1) == PRE_EXPR_NAME (e2);
case NARY: case NARY:
...@@ -316,8 +321,9 @@ get_or_alloc_expr_for_name (tree name) ...@@ -316,8 +321,9 @@ get_or_alloc_expr_for_name (tree name)
result_id = lookup_expression_id (result); result_id = lookup_expression_id (result);
if (result_id != 0) if (result_id != 0)
{ {
pool_free (pre_expr_pool, result); pre_expr newresult = expression_for_id (result_id);
result = expression_for_id (result_id); pool_free (pre_expr_pool, result);
result = newresult;
return result; return result;
} }
get_or_alloc_expression_id (result); get_or_alloc_expression_id (result);
...@@ -994,8 +1000,9 @@ get_or_alloc_expr_for_constant (tree constant) ...@@ -994,8 +1000,9 @@ get_or_alloc_expr_for_constant (tree constant)
result_id = lookup_expression_id (newexpr); result_id = lookup_expression_id (newexpr);
if (result_id != 0) if (result_id != 0)
{ {
pool_free (pre_expr_pool, newexpr); pre_expr newresult = expression_for_id (result_id);
newexpr = expression_for_id (result_id); pool_free (pre_expr_pool, newexpr);
newexpr = newresult;
return newexpr; return newexpr;
} }
value_id = get_or_alloc_constant_value_id (constant); value_id = get_or_alloc_constant_value_id (constant);
...@@ -1009,7 +1016,7 @@ get_or_alloc_expr_for_constant (tree constant) ...@@ -1009,7 +1016,7 @@ get_or_alloc_expr_for_constant (tree constant)
a constant. */ a constant. */
static tree static tree
get_constant_for_value_id (unsigned int v) get_constant_for_value_id (unsigned int v, tree type)
{ {
if (value_id_constant_p (v)) if (value_id_constant_p (v))
{ {
...@@ -1020,7 +1027,8 @@ get_constant_for_value_id (unsigned int v) ...@@ -1020,7 +1027,8 @@ get_constant_for_value_id (unsigned int v)
FOR_EACH_EXPR_ID_IN_SET (exprset, i, bi) FOR_EACH_EXPR_ID_IN_SET (exprset, i, bi)
{ {
pre_expr expr = expression_for_id (i); pre_expr expr = expression_for_id (i);
if (expr->kind == CONSTANT) if (expr->kind == CONSTANT
&& TREE_TYPE (PRE_EXPR_CONSTANT (expr)) == type)
return PRE_EXPR_CONSTANT (expr); return PRE_EXPR_CONSTANT (expr);
} }
} }
...@@ -1064,8 +1072,10 @@ fully_constant_expression (pre_expr e) ...@@ -1064,8 +1072,10 @@ fully_constant_expression (pre_expr e)
pre_expr rep1 = get_or_alloc_expr_for (naryop1); pre_expr rep1 = get_or_alloc_expr_for (naryop1);
unsigned int vrep0 = get_expr_value_id (rep0); unsigned int vrep0 = get_expr_value_id (rep0);
unsigned int vrep1 = get_expr_value_id (rep1); unsigned int vrep1 = get_expr_value_id (rep1);
tree const0 = get_constant_for_value_id (vrep0); tree const0 = get_constant_for_value_id (vrep0,
tree const1 = get_constant_for_value_id (vrep1); TREE_TYPE (nary->op[0]));
tree const1 = get_constant_for_value_id (vrep1,
TREE_TYPE (nary->op[1]));
tree result = NULL; tree result = NULL;
if (const0 && const1) if (const0 && const1)
{ {
...@@ -1087,7 +1097,8 @@ fully_constant_expression (pre_expr e) ...@@ -1087,7 +1097,8 @@ fully_constant_expression (pre_expr e)
tree naryop0 = nary->op[0]; tree naryop0 = nary->op[0];
pre_expr rep0 = get_or_alloc_expr_for (naryop0); pre_expr rep0 = get_or_alloc_expr_for (naryop0);
unsigned int vrep0 = get_expr_value_id (rep0); unsigned int vrep0 = get_expr_value_id (rep0);
tree const0 = get_constant_for_value_id (vrep0); tree const0 = get_constant_for_value_id (vrep0,
TREE_TYPE (nary->op[0]));
tree result = NULL; tree result = NULL;
if (const0) if (const0)
{ {
...@@ -2599,9 +2610,14 @@ static tree ...@@ -2599,9 +2610,14 @@ static tree
find_or_generate_expression (basic_block block, pre_expr expr, tree stmts, find_or_generate_expression (basic_block block, pre_expr expr, tree stmts,
tree domstmt) tree domstmt)
{ {
pre_expr leader = bitmap_find_leader (AVAIL_OUT (block), pre_expr leader;
get_expr_value_id (expr), domstmt);
tree genop = NULL; tree genop = NULL;
if (expr->kind == CONSTANT)
return PRE_EXPR_CONSTANT (expr);
leader = bitmap_find_leader (AVAIL_OUT (block),
get_expr_value_id (expr), domstmt);
if (leader) if (leader)
{ {
if (leader->kind == NAME) if (leader->kind == NAME)
...@@ -2705,14 +2721,10 @@ create_expression_by_pieces (basic_block block, pre_expr expr, tree stmts, ...@@ -2705,14 +2721,10 @@ create_expression_by_pieces (basic_block block, pre_expr expr, tree stmts,
stmts, domstmt); stmts, domstmt);
if (!genop1 || !genop2) if (!genop1 || !genop2)
return NULL_TREE; return NULL_TREE;
genop1 = fold_convert (TREE_TYPE (nary->op[0]), genop1 = fold_convert (TREE_TYPE (nary->op[0]),
genop1); genop1);
/* Ensure op2 is a sizetype for POINTER_PLUS_EXPR. It genop2 = fold_convert (TREE_TYPE (nary->op[1]), genop2);
may be a constant with the wrong type. */
if (nary->opcode == POINTER_PLUS_EXPR)
genop2 = fold_convert (sizetype, genop2);
else
genop2 = fold_convert (TREE_TYPE (nary->op[1]), genop2);
folded = fold_build2 (nary->opcode, nary->type, folded = fold_build2 (nary->opcode, nary->type,
genop1, genop2); genop1, genop2);
...@@ -3141,9 +3153,16 @@ do_regular_insertion (basic_block block, basic_block dom) ...@@ -3141,9 +3153,16 @@ do_regular_insertion (basic_block block, basic_block dom)
} }
eprime = fully_constant_expression (eprime); eprime = fully_constant_expression (eprime);
vprime = get_expr_value_id (eprime); if (eprime->kind == CONSTANT)
edoubleprime = bitmap_find_leader (AVAIL_OUT (bprime), {
vprime, NULL_TREE); edoubleprime = eprime;
}
else
{
vprime = get_expr_value_id (eprime);
edoubleprime = bitmap_find_leader (AVAIL_OUT (bprime),
vprime, NULL_TREE);
}
if (edoubleprime == NULL) if (edoubleprime == NULL)
{ {
avail[bprime->index] = eprime; avail[bprime->index] = eprime;
...@@ -3275,9 +3294,17 @@ do_partial_partial_insertion (basic_block block, basic_block dom) ...@@ -3275,9 +3294,17 @@ do_partial_partial_insertion (basic_block block, basic_block dom)
} }
eprime = fully_constant_expression (eprime); eprime = fully_constant_expression (eprime);
vprime = get_expr_value_id (eprime); if (eprime->kind == CONSTANT)
edoubleprime = bitmap_find_leader (AVAIL_OUT (bprime), {
vprime, NULL_TREE); edoubleprime = eprime;
}
else
{
vprime = get_expr_value_id (eprime);
edoubleprime = bitmap_find_leader (AVAIL_OUT (bprime),
vprime, NULL_TREE);
}
if (edoubleprime == NULL) if (edoubleprime == NULL)
{ {
by_all = false; by_all = false;
......
...@@ -2582,6 +2582,8 @@ expressions_equal_p (tree e1, tree e2) ...@@ -2582,6 +2582,8 @@ expressions_equal_p (tree e1, tree e2)
te1 = TREE_TYPE (e1); te1 = TREE_TYPE (e1);
te2 = TREE_TYPE (e2); te2 = TREE_TYPE (e2);
if (te1 != te2)
return false;
if (TREE_CODE (e1) == TREE_LIST && TREE_CODE (e2) == TREE_LIST) if (TREE_CODE (e1) == TREE_LIST && TREE_CODE (e2) == TREE_LIST)
{ {
......
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