On Tue, May 24, 2016 at 08:38:29PM +1000, Kugan Vivekanandarajah wrote:
> Hi,
> 
> In build_and_add_sum, new stmt is created and inserted (which is the
> actual use stmt). Therefore stmt_to_insert has to be inserted after
> this is created. This patch moves it after.
> 
> I don’t know how I can reduce the Fortran test-case so adding the
> test-case from bug report. Any help in reducing the test-case is
> appreciated.
> 
> Regression testing on x86_64-linux-gnu and bootstrap didn’t find any new 
> issues.
> 
> Is this OK for trunk?
> 
> Thanks,
> Kugan
> 
> gcc/testsuite/ChangeLog:
> 
> 2016-05-24  Kugan Vivekanandarajah  <kug...@linaro.org>
> 
>     * gfortran.dg/pr71252.f90: New test.
> 
> gcc/ChangeLog:
> 
> 2016-05-24  Kugan Vivekanandarajah  <kug...@linaro.org>
> 

Please add
        PR tree-optimization/71252
to both ChangeLog entries and
! PR tree-optimization/71252
to the first line in the testcase.

>     * tree-ssa-reassoc.c (rewrite_expr_tree_parallel): Add stmt_to_insert 
> after
>     build_and_add_sum creates new use stmt.

> diff --git a/gcc/testsuite/gfortran.dg/pr71252.f90 
> b/gcc/testsuite/gfortran.dg/pr71252.f90
> index e69de29..dae210b 100644
> --- a/gcc/testsuite/gfortran.dg/pr71252.f90
> +++ b/gcc/testsuite/gfortran.dg/pr71252.f90
> @@ -0,0 +1,88 @@
> +
> +! { dg-do compile }
> +! { dg-options "-O1 -ffast-math" }
> +
> +MODULE xc_b97
> +  INTEGER, PARAMETER :: dp=8
> +  PRIVATE
> +  PUBLIC :: b97_lda_info, b97_lsd_info, b97_lda_eval, b97_lsd_eval
> +CONTAINS
> +  SUBROUTINE b97_lsd_eval(rho_set,deriv_set,grad_deriv,b97_params)
> +    INTEGER, INTENT(in)                      :: grad_deriv
> +    INTEGER                                  :: handle, npoints, param, stat
> +    LOGICAL                                  :: failure
> +    REAL(kind=dp)                            :: epsilon_drho, epsilon_rho, &
> +                                                scale_c, scale_x
> +    REAL(kind=dp), DIMENSION(:, :, :), POINTER :: dummy, e_0, e_ndra, &
> +      e_ndra_ndra, e_ndra_ndrb, e_ndra_ra, e_ndra_rb, e_ndrb, e_ndrb_ndrb, &
> +      e_ndrb_ra, e_ndrb_rb, e_ra, e_ra_ra, e_ra_rb, e_rb, e_rb_rb, &
> +      norm_drhoa, norm_drhob, rhoa, rhob
> +    IF (.NOT. failure) THEN
> +       CALL b97_lsd_calc(&
> +            rhoa=rhoa, rhob=rhob, norm_drhoa=norm_drhoa,&
> +            norm_drhob=norm_drhob, e_0=e_0, &
> +            e_ra=e_ra, e_rb=e_rb, &
> +            e_ndra=e_ndra, e_ndrb=e_ndrb, &
> +            e_ra_ra=e_ra_ra, e_ra_rb=e_ra_rb, e_rb_rb=e_rb_rb,&
> +            e_ra_ndra=e_ndra_ra, e_ra_ndrb=e_ndrb_ra, &
> +            e_rb_ndrb=e_ndrb_rb, e_rb_ndra=e_ndra_rb,&
> +            e_ndra_ndra=e_ndra_ndra, e_ndrb_ndrb=e_ndrb_ndrb,&
> +            e_ndra_ndrb=e_ndra_ndrb,&
> +            grad_deriv=grad_deriv, npoints=npoints, &
> +            epsilon_rho=epsilon_rho,epsilon_drho=epsilon_drho,&
> +            param=param,scale_c_in=scale_c,scale_x_in=scale_x)
> +    END IF
> +  END SUBROUTINE b97_lsd_eval
> +  SUBROUTINE b97_lsd_calc(rhoa, rhob, norm_drhoa, norm_drhob,&
> +       e_0, e_ra, e_rb, e_ndra, e_ndrb, &
> +       e_ra_ndra,e_ra_ndrb, e_rb_ndra, e_rb_ndrb,&
> +       e_ndra_ndra, e_ndrb_ndrb, e_ndra_ndrb, &
> +       e_ra_ra, e_ra_rb, e_rb_rb,&
> +       grad_deriv,npoints,epsilon_rho,epsilon_drho, &
> +       param, scale_c_in, scale_x_in)
> +    REAL(kind=dp), DIMENSION(*), INTENT(in)  :: rhoa, rhob, norm_drhoa, &
> +                                                norm_drhob
> +    REAL(kind=dp), DIMENSION(*), INTENT(inout) :: e_0, e_ra, e_rb, e_ndra, &
> +      e_ndrb, e_ra_ndra, e_ra_ndrb, e_rb_ndra, e_rb_ndrb, e_ndra_ndra, &
> +      e_ndrb_ndrb, e_ndra_ndrb, e_ra_ra, e_ra_rb, e_rb_rb
> +    INTEGER, INTENT(in)                      :: grad_deriv, npoints
> +    REAL(kind=dp), INTENT(in)                :: epsilon_rho, epsilon_drho
> +    INTEGER, INTENT(in)                      :: param
> +    REAL(kind=dp), INTENT(in)                :: scale_c_in, scale_x_in
> +    REAL(kind=dp) :: A_1, A_2, A_3, alpha_1_1, alpha_1_2, alpha_1_3, 
> alpha_c, &
> +      t133, t134, t1341, t1348, t1351, t1360, t1368, t138, t1388, t139, &
> +      u_x_bnorm_drhobnorm_drhob, u_x_brhob, u_x_brhobnorm_drhob, 
> u_x_brhobrhob
> +    SELECT CASE(grad_deriv)
> +    CASE default
> +       DO ii=1,npoints
> +          IF (rho>epsilon_rho) THEN
> +             IF (grad_deriv/=0) THEN
> +                IF (grad_deriv>1 .OR. grad_deriv<-1) THEN
> +                   alpha_c1rhob = alpha_crhob
> +                   f1rhob = frhob
> +                   t1360 = -0.4e1_dp * t105 * t290 * chirhobrhob + 
> (-0.2e1_dp * t239 &
> +                        * t257 + t709 * t1236 * t711 * t62 / 0.2e1_dp - 
> e_c_u_0rhobrhob) * f&
> +                        * t108 + t438 * f1rhob * t108 + 0.4e1_dp * t439 * 
> t443 + t1341 * &
> +                        0.4e1_dp * t1348 * t443 + 0.4e1_dp * t1351 * t443 + 
> 0.12e2_dp * t113&
> +                        * t107 * t1299 + 0.4e1_dp * t113 * t289 * chirhobrhob
> +                   IF (grad_deriv>1 .OR. grad_deriv==-2) THEN
> +                       exc_rhob_rhob = scale_x * (-t4 * t6 / t1152 * gx_b / &
> +                            0.6e1_dp + e_lsda_x_brhob * (u_x_b1rhob * t31 + 
> u_x_b * u_x_b1rhob *&
> +                            u_x_brhobrhob * c_x_2)) + scale_c * 
> (((e_c_u_0rhobrhob + (0.2e1_dp *&
> +                            t726 * t1270 * t278 - t266 * (-t731 * t1205 / 
> 0.4e1_dp + t267 * &
> +                            t1205 * t647) * t278 - t757 * t1270 * t759 * t80 
> / 0.2e1_dp) * f * &
> +                            t110 + alpha_crhob * f1rhob * t110 - 0.4e1_dp * 
> t431 * t435 + &
> +                            alpha_c1rhob * frhob * t110 + alpha_c * 
> frhobrhob * t110 - 0.4e1_dp &
> +                            * t433 * t435 - 0.4e1_dp * t1321 * t435 - 
> 0.4e1_dp * t1324 * t435 - &
> +                            0.12e2_dp * t105 * t796 * t1299 + t1360) * rho + 
> epsilon_c_unifrhob &
> +                            * c_css_2))
> +                       e_rb_rb(ii)=e_rb_rb(ii)+exc_rhob_rhob
> +                   END IF
> +                END IF ! <1 || >1
> +             END IF ! /=0
> +          END IF ! rho>epsilon_rho
> +       END DO
> +    END SELECT
> +  END SUBROUTINE b97_lsd_calc
> +END MODULE xc_b97
> +
> diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c
> index fb683ad..28823a2 100644
> --- a/gcc/tree-ssa-reassoc.c
> +++ b/gcc/tree-ssa-reassoc.c
> @@ -4091,24 +4091,30 @@ rewrite_expr_tree_parallel (gassign *stmt, int width,
>         print_gimple_stmt (dump_file, stmts[i], 0, 0);
>       }
>  
> -      /* If the stmt that defines operand has to be inserted, insert it
> -      before the use.  */
> -      if (stmt1)
> -     insert_stmt_before_use (stmts[i], stmt1);
> -      if (stmt2)
> -     insert_stmt_before_use (stmts[i], stmt2);
> -
>        /* We keep original statement only for the last one.  All
>        others are recreated.  */
>        if (i == stmt_num - 1)
>       {
> +       /* If the stmt that defines operand has to be inserted, insert it
> +          before the use.  */
> +       if (stmt1)
> +         insert_stmt_before_use (stmts[i], stmt1);
> +       if (stmt2)
> +         insert_stmt_before_use (stmts[i], stmt2);
>         gimple_assign_set_rhs1 (stmts[i], op1);
>         gimple_assign_set_rhs2 (stmts[i], op2);
>         update_stmt (stmts[i]);
>       }
>        else
> -     stmts[i] = build_and_add_sum (TREE_TYPE (last_rhs1), op1, op2, opcode);
> -
> +     {
> +       stmts[i] = build_and_add_sum (TREE_TYPE (last_rhs1), op1, op2, 
> opcode);
> +       /* If the stmt that defines operand has to be inserted, insert it
> +          before new build_and_add stmt after it is created.  */
> +       if (stmt1)
> +         insert_stmt_before_use (stmts[i], stmt1);
> +       if (stmt2)
> +         insert_stmt_before_use (stmts[i], stmt2);
> +     }
>        if (dump_file && (dump_flags & TDF_DETAILS))
>       {
>         fprintf (dump_file, " into ");


        Jakub

Reply via email to