diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 57fd23ccc04..fc2aac6029c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2007-07-02 Daniel Berlin + + Fix PR tree-optimization/32583 + Fix PR tree-optimization/32584 + * tree-ssa-pre.c (phi_translate): Always pass seen bitmap. + (phi_translate_set): Use phi_translate directly now. + (make_values_for_stmt): Don't value number RHS if we already know + it is constant. + 2007-07-02 Steve Ellcey Jim Wilson diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 40a309f1858..9e6773cb8fd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-07-02 Daniel Berlin + + * gfortran.fortran-torture/compile/pr32583.f: New. + * gcc.c-torture/compile/pr32584.c: New + 2007-07-02 Ollie Wild * g++.dg/lookup/using16.C: Merge dg-errors with common line. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr32584.c b/gcc/testsuite/gcc.c-torture/compile/pr32584.c new file mode 100644 index 00000000000..02799fc7449 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr32584.c @@ -0,0 +1,71 @@ +typedef long unsigned int size_t; +typedef long int __ssize_t; +typedef struct +{ +} __mbstate_t; +typedef struct +{ +} _G_fpos64_t; +enum +{ + __GCONV_INTERNAL_ERROR +}; +typedef int (*__gconv_trans_fct) (struct __gconv_step *, + size_t *); +typedef int (*__gconv_trans_context_fct) (void *, __const unsigned char *, + unsigned char *, unsigned char *); +struct __gconv_trans_data +{ +}; +struct _IO_marker { +}; +typedef __ssize_t __io_write_fn (void *__cookie, __const char *__buf, + size_t __n); +typedef struct blockbox { +} *BBOXPTR, BBOX ; +typedef struct netbox { +} *NBOXPTR, NBOX ; +typedef struct termbox { + struct termbox *nextterm ; +} *TEBOXPTR, TEBOX ; +typedef struct tilebox { + TEBOXPTR termsptr ; +} +*TIBOXPTR , +TIBOX ; +typedef struct cellbox { + TIBOXPTR tileptr ; +} +*CBOXPTR , +CBOX ; +typedef struct dimbox { +} +DBOX ; +typedef struct rowbox { +} ROWBOX ; +typedef struct binbox { +} +CHANGRDBOX ; +extern int numcells ; +extern int numterms ; +sortpin() +{ +int j , n , cell ; +CBOXPTR ptr ; +TIBOXPTR tile ; +TEBOXPTR term , *xpptr ; +for( cell = 1 ; cell <= numcells + numterms ; cell++ ) { + if( ( tile = ptr->tileptr ) == (TIBOXPTR) ((void *)0) ) { + } + n = 0 ; + for( term = tile->termsptr ; term != (TEBOXPTR) ((void *)0) ; + term = term->nextterm ) { + xpptr[ ++n ] = term ; + } + xpptr[ n + 1 ] = (TEBOXPTR) ((void *)0) ; + ptr->tileptr->termsptr = xpptr[ 1 ] ; + for( j = 1 ; j <= n ; j++ ) { + } +} +} + diff --git a/gcc/testsuite/gfortran.fortran-torture/compile/pr32583.f b/gcc/testsuite/gfortran.fortran-torture/compile/pr32583.f new file mode 100644 index 00000000000..61c9d98b80b --- /dev/null +++ b/gcc/testsuite/gfortran.fortran-torture/compile/pr32583.f @@ -0,0 +1,40 @@ + subroutine detune(iv,ekk,ep,beta,dtu,dtup,dfac) + implicit real*8 (a-h,o-z) + parameter(npart=64,nmac=1) + parameter(nele=700,nblo=300,nper=16, + &nelb=100,nblz=20000,nzfz=300000,mmul=11) + parameter(nran=280000,ncom=100,mran=500,mpa=6,nrco=5,nema=15) + parameter(mcor=10) + parameter(npos=20000,nlya=10000,ninv=1000,nplo=20000) + parameter(nmon1=600,ncor1=600) + parameter(pieni=1d-17) + parameter(zero=0.0d0,half=0.5d0,one=1.0d0) + parameter(two=2.0d0,three=3.0d0,four=4.0d0) + dimension dfac(10),dtu(2,5),ep(2),beta(2),dtup(2,5,0:4,0:4) + save + pi=four*atan(one) + iv2=2*iv + iv3=iv+1 + vtu1=-ekk*(half**iv2)*dfac(iv2)/pi + dtu1=zero + dtu2=zero + do 10 iv4=1,iv3 + iv5=iv4-1 + iv6=iv-iv5 + vor=one + if(mod(iv6,2).ne.0) vor=-one + vtu2=vor/(dfac(iv5+1)**2)/(dfac(iv6+1)**2)*(beta(1)**iv5)* (beta + + (2)**iv6) + if(iv5.ne.0) then + dtu1=dtu1+vtu2*iv5*(ep(1)**(iv5-1))*(ep(2)**iv6) + dtup(1,iv,iv5-1,iv6)=dtup(1,iv,iv5-1,iv6)+vtu2*iv5*vtu1 + endif + if(iv6.ne.0) then + dtu2=dtu2+vtu2*iv6*(ep(1)**iv5)*(ep(2)**(iv6-1)) + dtup(2,iv,iv5,iv6-1)=dtup(2,iv,iv5,iv6-1)+vtu2*iv6*vtu1 + endif + 10 continue + dtu(1,iv)=dtu(1,iv)+vtu1*dtu1 + dtu(2,iv)=dtu(2,iv)+vtu1*dtu2 + return + end diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index 913cd7def9d..059a2adbbfc 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -1322,6 +1322,7 @@ phi_translate_1 (tree expr, bitmap_set_t set1, bitmap_set_t set2, gcc_unreachable (); } } + /* Translate EXPR using phis in PHIBLOCK, so that it has the values of the phis in PRED. Return NULL if we can't find a leader for each part of the @@ -1331,7 +1332,9 @@ static tree phi_translate (tree expr, bitmap_set_t set1, bitmap_set_t set2, basic_block pred, basic_block phiblock) { - return phi_translate_1 (expr, set1, set2, pred, phiblock, NULL); + bitmap_clear (seen_during_translate); + return phi_translate_1 (expr, set1, set2, pred, phiblock, + seen_during_translate); } /* For each expression in SET, translate the value handles through phi nodes @@ -1356,9 +1359,7 @@ phi_translate_set (bitmap_set_t dest, bitmap_set_t set, basic_block pred, for (i = 0; VEC_iterate (tree, exprs, i, expr); i++) { tree translated; - bitmap_clear (seen_during_translate); - translated = phi_translate_1 (expr, set, NULL, pred, phiblock, - seen_during_translate); + translated = phi_translate (expr, set, NULL, pred, phiblock); /* Don't add constants or empty translations to the cache, since we won't look them up that way, or use the result, anyway. */ @@ -3404,7 +3405,8 @@ make_values_for_stmt (tree stmt, basic_block block) lhsval = valvh ? valvh : get_value_handle (lhs); STRIP_USELESS_TYPE_CONVERSION (rhs); - if (can_value_number_operation (rhs)) + if (can_value_number_operation (rhs) + && (!lhsval || !is_gimple_min_invariant (lhsval))) { /* For value numberable operation, create a duplicate expression with the operands replaced