re PR tree-optimization/56799 (Runfail after r197060+r197082.)

PR tree-optimization/56799
        * tree-ssa-dom.c (record_equivalences_from_incoming_edge): Bring
        back test for widening conversion erroneously dropped in prior
        change.

        PR tree-optimization/56799
        * gcc.c-torture/execute/pr56799.c: New test.

From-SVN: r197453
This commit is contained in:
Jeff Law 2013-04-03 13:18:09 -06:00 committed by Jeff Law
parent 9eb85f2724
commit be672e08bb
4 changed files with 64 additions and 2 deletions

View file

@ -1,3 +1,10 @@
2013-04-03 Jeff Law <law@redhat.com>
PR tree-optimization/56799
* tree-ssa-dom.c (record_equivalences_from_incoming_edge): Bring
back test for widening conversion erroneously dropped in prior
change.
2013-04-03 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR target/56809
@ -896,6 +903,7 @@
* config/tilegx/tilepro.h (PROFILE_BEFORE_PROLOGUE): Define.
2013-03-25 Jeff Law <law@redhat.com>
* tree-ssa-dom.c (record_equivalences_from_incoming_edge): Add missing
check for INTEGRAL_TYPE_P that was missing due to checking in
wrong version of prior patch.

View file

@ -1,3 +1,8 @@
2013-04-03 Jeff Law <law@redhat.com>
PR tree-optimization/56799
* gcc.c-torture/execute/pr56799.c: New test.
2013-04-03 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/56815

View file

@ -0,0 +1,43 @@
#include <stdio.h>
typedef struct { int x; int y;} S;
extern int foo(S*);
int hi = 0, lo = 0;
int main()
{
S a;
int r;
a.x = (int) 0x00010000;
a.y = 1;
r = foo (&a);
if (r == 2 && lo==0 && hi==1)
{
exit (0);
}
abort ();
}
typedef unsigned short u16;
__attribute__ ((noinline)) int foo (S* ptr)
{
int a = ptr->x;
int c = 0;
u16 b = (u16) a;
if (b != 0)
{
lo = 1;
c += ptr->y;
}
b = a >> 16;
if (b != 0)
{
hi = 1;
c+= ptr->y;
}
c += ptr->y;
return c;
}

View file

@ -1151,9 +1151,15 @@ record_equivalences_from_incoming_edge (basic_block bb)
{
tree old_rhs = gimple_assign_rhs1 (defstmt);
/* If the constant is in the range of the type of OLD_RHS,
then convert the constant and record the equivalence. */
/* If the conversion widens the original value and
the constant is in the range of the type of OLD_RHS,
then convert the constant and record the equivalence.
Note that int_fits_type_p does not check the precision
if the upper and lower bounds are OK. */
if (INTEGRAL_TYPE_P (TREE_TYPE (old_rhs))
&& (TYPE_PRECISION (TREE_TYPE (lhs))
> TYPE_PRECISION (TREE_TYPE (old_rhs)))
&& int_fits_type_p (rhs, TREE_TYPE (old_rhs)))
{
tree newval = fold_convert (TREE_TYPE (old_rhs), rhs);