tree-ssa-dom.c (record_conditions): Only record "unordered" conditions from floating point comparisons.

* tree-ssa-dom.c (record_conditions): Only record "unordered"
	conditions from floating point comparisons.

From-SVN: r114489
This commit is contained in:
Roger Sayle 2006-06-08 16:48:30 +00:00 committed by Roger Sayle
parent 33b881ca3a
commit 14b41b5f66
2 changed files with 47 additions and 17 deletions

View File

@ -1,3 +1,8 @@
2006-06-08 Roger Sayle <roger@eyesopen.com>
* tree-ssa-dom.c (record_conditions): Only record "unordered"
conditions from floating point comparisons.
2006-06-08 Paolo Bonzini <bonzini@gnu.org>
PR middle-end/27733

View File

@ -950,36 +950,61 @@ record_conditions (struct edge_info *edge_info, tree cond, tree inverted)
{
case LT_EXPR:
case GT_EXPR:
edge_info->max_cond_equivalences = 12;
edge_info->cond_equivalences = XNEWVEC (tree, 12);
if (FLOAT_TYPE_P (TREE_TYPE (op0)))
{
edge_info->max_cond_equivalences = 12;
edge_info->cond_equivalences = XNEWVEC (tree, 12);
build_and_record_new_cond (ORDERED_EXPR, op0, op1,
&edge_info->cond_equivalences[8]);
build_and_record_new_cond (LTGT_EXPR, op0, op1,
&edge_info->cond_equivalences[10]);
}
else
{
edge_info->max_cond_equivalences = 8;
edge_info->cond_equivalences = XNEWVEC (tree, 8);
}
build_and_record_new_cond ((TREE_CODE (cond) == LT_EXPR
? LE_EXPR : GE_EXPR),
op0, op1, &edge_info->cond_equivalences[4]);
build_and_record_new_cond (ORDERED_EXPR, op0, op1,
&edge_info->cond_equivalences[6]);
build_and_record_new_cond (NE_EXPR, op0, op1,
&edge_info->cond_equivalences[8]);
build_and_record_new_cond (LTGT_EXPR, op0, op1,
&edge_info->cond_equivalences[10]);
&edge_info->cond_equivalences[6]);
break;
case GE_EXPR:
case LE_EXPR:
edge_info->max_cond_equivalences = 6;
edge_info->cond_equivalences = XNEWVEC (tree, 6);
build_and_record_new_cond (ORDERED_EXPR, op0, op1,
&edge_info->cond_equivalences[4]);
if (FLOAT_TYPE_P (TREE_TYPE (op0)))
{
edge_info->max_cond_equivalences = 6;
edge_info->cond_equivalences = XNEWVEC (tree, 6);
build_and_record_new_cond (ORDERED_EXPR, op0, op1,
&edge_info->cond_equivalences[4]);
}
else
{
edge_info->max_cond_equivalences = 4;
edge_info->cond_equivalences = XNEWVEC (tree, 4);
}
break;
case EQ_EXPR:
edge_info->max_cond_equivalences = 10;
edge_info->cond_equivalences = XNEWVEC (tree, 10);
build_and_record_new_cond (ORDERED_EXPR, op0, op1,
&edge_info->cond_equivalences[4]);
if (FLOAT_TYPE_P (TREE_TYPE (op0)))
{
edge_info->max_cond_equivalences = 10;
edge_info->cond_equivalences = XNEWVEC (tree, 10);
build_and_record_new_cond (ORDERED_EXPR, op0, op1,
&edge_info->cond_equivalences[8]);
}
else
{
edge_info->max_cond_equivalences = 8;
edge_info->cond_equivalences = XNEWVEC (tree, 8);
}
build_and_record_new_cond (LE_EXPR, op0, op1,
&edge_info->cond_equivalences[6]);
&edge_info->cond_equivalences[4]);
build_and_record_new_cond (GE_EXPR, op0, op1,
&edge_info->cond_equivalences[8]);
&edge_info->cond_equivalences[6]);
break;
case UNORDERED_EXPR: