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:
parent
9eb85f2724
commit
be672e08bb
4 changed files with 64 additions and 2 deletions
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
43
gcc/testsuite/gcc.c-torture/execute/pr56799.c
Normal file
43
gcc/testsuite/gcc.c-torture/execute/pr56799.c
Normal 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;
|
||||
}
|
||||
|
||||
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue