aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2014-12-11 15:52:47 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2014-12-11 15:52:47 +0000
commitd17271de7f98ec782324307a8840f531831c4509 (patch)
tree83a5e16407fda4f8d1b8d7ae328e0054a656a7f6 /gcc
parentb214b73391d67f9a0dbb8807912330289973982a (diff)
downloadgcc-d17271de7f98ec782324307a8840f531831c4509.zip
gcc-d17271de7f98ec782324307a8840f531831c4509.tar.gz
gcc-d17271de7f98ec782324307a8840f531831c4509.tar.bz2
re PR tree-optimization/42108 (50% performance regression)
2014-12-11 Richard Biener <rguenther@suse.de> PR tree-optimization/42108 * trans-stmt.c (gfc_trans_do): Execute the division computing countm1 before the loop entry check. * gfortran.dg/pr42108.f90: Amend. From-SVN: r218630
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/trans-stmt.c26
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr42108.f906
4 files changed, 29 insertions, 14 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 554474c..3092e3c 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2014-12-11 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/42108
+ * trans-stmt.c (gfc_trans_do): Execute the division computing
+ countm1 before the loop entry check.
+
2014-12-11 Manuel López-Ibáñez <manu@gcc.gnu.org>
PR fortran/44054
diff --git a/gcc/fortran/trans-stmt.c b/gcc/fortran/trans-stmt.c
index d28d67b..1ba382a 100644
--- a/gcc/fortran/trans-stmt.c
+++ b/gcc/fortran/trans-stmt.c
@@ -1645,15 +1645,15 @@ gfc_trans_do (gfc_code * code, tree exit_cond)
This code is executed before we enter the loop body. We generate:
if (step > 0)
{
+ countm1 = (to - from) / step;
if (to < from)
goto exit_label;
- countm1 = (to - from) / step;
}
else
{
+ countm1 = (from - to) / -step;
if (to > from)
goto exit_label;
- countm1 = (from - to) / -step;
}
*/
@@ -1675,11 +1675,12 @@ gfc_trans_do (gfc_code * code, tree exit_cond)
fold_build2_loc (loc, MINUS_EXPR, utype,
tou, fromu),
stepu);
- pos = fold_build3_loc (loc, COND_EXPR, void_type_node, tmp,
- fold_build1_loc (loc, GOTO_EXPR, void_type_node,
- exit_label),
- fold_build2 (MODIFY_EXPR, void_type_node,
- countm1, tmp2));
+ pos = build2 (COMPOUND_EXPR, void_type_node,
+ fold_build2 (MODIFY_EXPR, void_type_node,
+ countm1, tmp2),
+ build3_loc (loc, COND_EXPR, void_type_node, tmp,
+ build1_loc (loc, GOTO_EXPR, void_type_node,
+ exit_label), NULL_TREE));
/* For a negative step, when to > from, exit, otherwise compute
countm1 = ((unsigned)from - (unsigned)to) / -(unsigned)step */
@@ -1688,11 +1689,12 @@ gfc_trans_do (gfc_code * code, tree exit_cond)
fold_build2_loc (loc, MINUS_EXPR, utype,
fromu, tou),
fold_build1_loc (loc, NEGATE_EXPR, utype, stepu));
- neg = fold_build3_loc (loc, COND_EXPR, void_type_node, tmp,
- fold_build1_loc (loc, GOTO_EXPR, void_type_node,
- exit_label),
- fold_build2 (MODIFY_EXPR, void_type_node,
- countm1, tmp2));
+ neg = build2 (COMPOUND_EXPR, void_type_node,
+ fold_build2 (MODIFY_EXPR, void_type_node,
+ countm1, tmp2),
+ build3_loc (loc, COND_EXPR, void_type_node, tmp,
+ build1_loc (loc, GOTO_EXPR, void_type_node,
+ exit_label), NULL_TREE));
tmp = fold_build2_loc (loc, LT_EXPR, boolean_type_node, step,
build_int_cst (TREE_TYPE (step), 0));
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index c6a19327..4507037 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-12-11 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/42108
+ * gfortran.dg/pr42108.f90: Amend.
+
2014-12-11 Manuel López-Ibáñez <manu@gcc.gnu.org>
* gfortran.dg/do_iterator.f90: Remove bogus dg-warning.
diff --git a/gcc/testsuite/gfortran.dg/pr42108.f90 b/gcc/testsuite/gfortran.dg/pr42108.f90
index 9a0a253..020a0a1 100644
--- a/gcc/testsuite/gfortran.dg/pr42108.f90
+++ b/gcc/testsuite/gfortran.dg/pr42108.f90
@@ -1,5 +1,5 @@
! { dg-do compile }
-! { dg-options "-O2 -fdump-tree-fre1" }
+! { dg-options "-O2 -fdump-tree-fre1 -fdump-tree-pre-details" }
subroutine eval(foo1,foo2,foo3,foo4,x,n,nnd)
implicit real*8 (a-h,o-z)
@@ -21,7 +21,9 @@ subroutine eval(foo1,foo2,foo3,foo4,x,n,nnd)
end do
end subroutine eval
+! We should have hoisted the division
+! { dg-final { scan-tree-dump "in all uses of countm1\[^\n\]* / " "pre" } }
! There should be only one load from n left
-
! { dg-final { scan-tree-dump-times "\\*n_" 1 "fre1" } }
! { dg-final { cleanup-tree-dump "fre1" } }
+! { dg-final { cleanup-tree-dump "pre" } }