This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR71230


The following fixes PR71230 - a missed single_use call when 
re-interpreting * (-x) as * x * -1.

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

Richard.

2016-05-23  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/71230
	* tree-ssa-reassoc.c (acceptable_pow_call): Move initial condition...
	(try_special_add_to_ops): ... here.  Always test for single-use.

	* gfortran.dg/pr71230-1.f90: New testcase.
	* gfortran.dg/pr71230-2.f90: Likewise.

Index: gcc/tree-ssa-reassoc.c
===================================================================
*** gcc/tree-ssa-reassoc.c	(revision 236575)
--- gcc/tree-ssa-reassoc.c	(working copy)
*************** break_up_subtract (gimple *stmt, gimple_
*** 4271,4287 ****
     If any of these conditions does not hold, return FALSE.  */
  
  static bool
! acceptable_pow_call (gimple *stmt, tree *base, HOST_WIDE_INT *exponent)
  {
    tree arg1;
    REAL_VALUE_TYPE c, cint;
  
-   if (!reassoc_insert_powi_p
-       || !flag_unsafe_math_optimizations
-       || !is_gimple_call (stmt)
-       || !has_single_use (gimple_call_lhs (stmt)))
-     return false;
- 
    switch (gimple_call_combined_fn (stmt))
      {
      CASE_CFN_POW:
--- 4271,4281 ----
     If any of these conditions does not hold, return FALSE.  */
  
  static bool
! acceptable_pow_call (gcall *stmt, tree *base, HOST_WIDE_INT *exponent)
  {
    tree arg1;
    REAL_VALUE_TYPE c, cint;
  
    switch (gimple_call_combined_fn (stmt))
      {
      CASE_CFN_POW:
*************** try_special_add_to_ops (vec<operand_entr
*** 4340,4350 ****
    tree base = NULL_TREE;
    HOST_WIDE_INT exponent = 0;
  
!   if (TREE_CODE (op) != SSA_NAME)
      return false;
  
    if (code == MULT_EXPR
!       && acceptable_pow_call (def_stmt, &base, &exponent))
      {
        add_repeat_to_ops_vec (ops, base, exponent);
        gimple_set_visited (def_stmt, true);
--- 4334,4348 ----
    tree base = NULL_TREE;
    HOST_WIDE_INT exponent = 0;
  
!   if (TREE_CODE (op) != SSA_NAME
!       || ! has_single_use (op))
      return false;
  
    if (code == MULT_EXPR
!       && reassoc_insert_powi_p
!       && flag_unsafe_math_optimizations
!       && is_gimple_call (def_stmt)
!       && acceptable_pow_call (as_a <gcall *> (def_stmt), &base, &exponent))
      {
        add_repeat_to_ops_vec (ops, base, exponent);
        gimple_set_visited (def_stmt, true);
Index: gcc/testsuite/gfortran.dg/pr71230-1.f90
===================================================================
*** gcc/testsuite/gfortran.dg/pr71230-1.f90	(revision 0)
--- gcc/testsuite/gfortran.dg/pr71230-1.f90	(working copy)
***************
*** 0 ****
--- 1,6 ----
+ ! { dg-do compile }
+ ! { dg-options "-O2 -fbounds-check -ffast-math" }
+   FUNCTION pw_integral_aa ( cc ) RESULT ( integral_value )
+     COMPLEX(KIND=8), DIMENSION(:), POINTER :: cc
+     integral_value = accurate_sum ( CONJG ( cc (:) ) * cc (:) )
+   END FUNCTION pw_integral_aa
Index: gcc/testsuite/gfortran.dg/pr71230-2.f90
===================================================================
*** gcc/testsuite/gfortran.dg/pr71230-2.f90	(revision 0)
--- gcc/testsuite/gfortran.dg/pr71230-2.f90	(working copy)
***************
*** 0 ****
--- 1,67 ----
+ ! { dg-do compile }
+ ! { dg-options "-O2 -ffast-math" }
+ 
+ MODULE xc_b97
+   INTEGER, PARAMETER :: dp=8
+   PRIVATE
+   PUBLIC :: 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, &
+       rs_b, rs_brhob, rs_brhobrhob, rsrhoa, rsrhoarhoa, rsrhoarhob, rsrhob, &
+       t1014, t102, t1047, t1049, t105, t106, t107
+       rsrhoa = -t4 * t212 * t208 / 0.12e2_dp
+       t235 = t224 * rsrhoa / 0.2e1_dp + beta_2_1 * rsrhoa + & 
+           0.3e1_dp / 0.2e1_dp * t228 * rsrhoa + t50 * t48 * rsrhoa * t232
+       t237 = t235 * t236
+       e_c_u_0rhoa = -0.2e1_dp * t216 * rsrhoa * t56 + t222 * t237
+       epsilon_c_unifrhoa = e_c_u_0rhoa + t285 * t110 + t287 * t110 - &
+           t293 + t295 * t108 + t297 * t108 + t301
+       e_lsda_c_abrhoa = epsilon_c_unifrhoa * rho + epsilon_c_unif - e_lsda_c_arhoa
+       exc_rhoa = scale_x * (e_lsda_x_arhoa * gx_a + e_lsda_x_a * gx_arhoa) + &
+           scale_c * (e_lsda_c_abrhoa * gc_ab + e_lsda_c_ab * gc_abrhoa + &
+           e_lsda_c_arhoa * gc_a + e_lsda_c_a * gc_arhoa)
+       e_ra(ii)=e_ra(ii)+exc_rhoa
+   END SUBROUTINE b97_lsd_calc
+ END MODULE xc_b97


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]