tree-ssa-dom.c (record_equivalences_from_incoming_edge): Record addititional equivalences for equality comparisons between an SSA_NAME...
* tree-ssa-dom.c (record_equivalences_from_incoming_edge): Record addititional equivalences for equality comparisons between an SSA_NAME and a constant where the SSA_NAME was set from a widening conversion. * g++.dg/tree-ssa/ssa-dom.C: New test. From-SVN: r196855
This commit is contained in:
parent
efcf217b1c
commit
4f1f78b9dc
@ -1,3 +1,9 @@
|
|||||||
|
2013-03-20 Jeff Law <law@redhat.com>
|
||||||
|
|
||||||
|
* tree-ssa-dom.c (record_equivalences_from_incoming_edge): Record
|
||||||
|
addititional equivalences for equality comparisons between an SSA_NAME
|
||||||
|
and a constant where the SSA_NAME was set from a widening conversion.
|
||||||
|
|
||||||
2013-03-20 Walter Lee <walt@tilera.com>
|
2013-03-20 Walter Lee <walt@tilera.com>
|
||||||
|
|
||||||
* config/tilegx/sync.md (atomic_test_and_set): New pattern.
|
* config/tilegx/sync.md (atomic_test_and_set): New pattern.
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
2013-03-20 Jeff Law <law@redhat.com>
|
||||||
|
|
||||||
|
* g++.dg/tree-ssa/ssa-dom.C: New test.
|
||||||
|
|
||||||
|
|
||||||
2013-03-20 Michael Meissner <meissner@linux.vnet.ibm.com>
|
2013-03-20 Michael Meissner <meissner@linux.vnet.ibm.com>
|
||||||
|
|
||||||
* gcc.target/powerpc/mmfpgpr.c: New test.
|
* gcc.target/powerpc/mmfpgpr.c: New test.
|
||||||
|
104
gcc/testsuite/g++.dg/tree-ssa/ssa-dom.C
Normal file
104
gcc/testsuite/g++.dg/tree-ssa/ssa-dom.C
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-options "-O2 -fdump-tree-dom1" } */
|
||||||
|
|
||||||
|
typedef long unsigned int size_t;
|
||||||
|
extern void abort (void) __attribute__ ((__noreturn__));
|
||||||
|
union tree_node;
|
||||||
|
typedef union tree_node *tree;
|
||||||
|
union gimple_statement_d;
|
||||||
|
typedef union gimple_statement_d *gimple;
|
||||||
|
typedef const union gimple_statement_d *const_gimple;
|
||||||
|
|
||||||
|
enum gimple_code
|
||||||
|
{
|
||||||
|
GIMPLE_RETURN = 10,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct gimple_statement_base
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
enum gimple_code code:8;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
enum gimple_statement_structure_enum
|
||||||
|
{
|
||||||
|
xyz
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
union gimple_statement_d
|
||||||
|
{
|
||||||
|
struct gimple_statement_base gsbase;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern size_t const gimple_ops_offset_[];
|
||||||
|
|
||||||
|
|
||||||
|
extern enum gimple_statement_structure_enum const gss_for_code_[];
|
||||||
|
|
||||||
|
|
||||||
|
static inline enum gimple_code
|
||||||
|
gimple_code (const_gimple g)
|
||||||
|
{
|
||||||
|
return g->gsbase.code;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static inline enum gimple_statement_structure_enum
|
||||||
|
gss_for_code (enum gimple_code code)
|
||||||
|
{
|
||||||
|
return gss_for_code_[code];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static inline enum gimple_statement_structure_enum
|
||||||
|
gimple_statement_structure (gimple gs)
|
||||||
|
{
|
||||||
|
return gss_for_code (gimple_code (gs));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline tree *
|
||||||
|
gimple_ops (gimple gs)
|
||||||
|
{
|
||||||
|
size_t off;
|
||||||
|
off = gimple_ops_offset_[gimple_statement_structure (gs)];
|
||||||
|
return (tree *) ((char *) gs + off);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
gimple_set_op (gimple gs, unsigned i, tree op)
|
||||||
|
{
|
||||||
|
gimple_ops (gs)[i] = op;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gimple_return_set_retval (gimple gs, tree retval)
|
||||||
|
{
|
||||||
|
const_gimple __gs = (gs);
|
||||||
|
if (gimple_code (__gs) != (GIMPLE_RETURN))
|
||||||
|
abort ();
|
||||||
|
gimple_set_op (gs, 0, retval);
|
||||||
|
}
|
||||||
|
/* { dg-final { scan-tree-dump-times "gss_for_code_.10." 1 "dom1"} } */
|
||||||
|
/* { dg-final { cleanup-tree-dump "dom1" } } */
|
||||||
|
|
@ -1135,6 +1135,33 @@ record_equivalences_from_incoming_edge (basic_block bb)
|
|||||||
if (lhs)
|
if (lhs)
|
||||||
record_equality (lhs, rhs);
|
record_equality (lhs, rhs);
|
||||||
|
|
||||||
|
/* If LHS is an SSA_NAME and RHS is a constant and LHS was set
|
||||||
|
via a widening type conversion, then we may be able to record
|
||||||
|
additional equivalences. */
|
||||||
|
if (lhs
|
||||||
|
&& TREE_CODE (lhs) == SSA_NAME
|
||||||
|
&& is_gimple_constant (rhs))
|
||||||
|
{
|
||||||
|
gimple defstmt = SSA_NAME_DEF_STMT (lhs);
|
||||||
|
|
||||||
|
if (defstmt
|
||||||
|
&& is_gimple_assign (defstmt)
|
||||||
|
&& CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (defstmt)))
|
||||||
|
{
|
||||||
|
tree old_rhs = gimple_assign_rhs1 (defstmt);
|
||||||
|
tree newval = fold_convert (TREE_TYPE (old_rhs), rhs);
|
||||||
|
|
||||||
|
/* If this was a widening conversion and if RHS is converted
|
||||||
|
to the type of OLD_RHS and has the same value, then we
|
||||||
|
can record an equivalence between OLD_RHS and the
|
||||||
|
converted representation of RHS. */
|
||||||
|
if ((TYPE_PRECISION (TREE_TYPE (lhs))
|
||||||
|
> TYPE_PRECISION (TREE_TYPE (old_rhs)))
|
||||||
|
&& operand_equal_p (rhs, newval, 0))
|
||||||
|
record_equality (old_rhs, newval);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; edge_info->cond_equivalences.iterate (i, &eq); ++i)
|
for (i = 0; edge_info->cond_equivalences.iterate (i, &eq); ++i)
|
||||||
record_cond (eq);
|
record_cond (eq);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user