From 740bb6ad8f28b53201c9d0a3d0849068c5d414e4 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Sat, 10 Oct 2009 14:53:27 +0000 Subject: [PATCH] re PR tree-optimization/41654 (ICE: in gimple_cond_get_ops_from_tree, at gimple.c:417) 2009-10-10 Richard Guenther PR tree-optimization/41654 * tree-ssa-ifcombine.c (ifcombine_ifandif): Properly canonicalize a cond expr before calling gimple_cond_set_condition_from_tree. (ifcombine_iforif): Likewise. * gfortran.fortran-torture/compile/pr41654.f90: New testcase. From-SVN: r152620 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ .../gfortran.fortran-torture/compile/pr41654.f90 | 15 +++++++++++++++ gcc/tree-ssa-ifcombine.c | 6 ++++++ 4 files changed, 33 insertions(+) create mode 100644 gcc/testsuite/gfortran.fortran-torture/compile/pr41654.f90 diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dd177c4..947dd1f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2009-10-10 Richard Guenther + + PR tree-optimization/41654 + * tree-ssa-ifcombine.c (ifcombine_ifandif): Properly canonicalize + a cond expr before calling gimple_cond_set_condition_from_tree. + (ifcombine_iforif): Likewise. + 2009-10-09 Ian Lance Taylor * configure.ac: Use AC_SEARCH_LIBS to find dlopen. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 534d797..7bf174a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2009-10-10 Richard Guenther + + PR tree-optimization/41654 + * gfortran.fortran-torture/compile/pr41654.f90: New testcase. + 2009-10-09 Jason Merrill * g++.dg/cpp/ucn-1.C: New. diff --git a/gcc/testsuite/gfortran.fortran-torture/compile/pr41654.f90 b/gcc/testsuite/gfortran.fortran-torture/compile/pr41654.f90 new file mode 100644 index 0000000..aa61905 --- /dev/null +++ b/gcc/testsuite/gfortran.fortran-torture/compile/pr41654.f90 @@ -0,0 +1,15 @@ +SUBROUTINE SCANBUFR (LBUFRIGNOREERROR, LBOPRPRO, LLSPLIT) +LOGICAL :: LBUFRIGNOREERROR, LBOPRPRO, LLSPLIT +INTEGER :: IBOTYP, IBSTYP +IF ((IBOTYP.eq.0).AND.(IBSTYP.eq.1)) GO TO 251 +IF ((IBOTYP.eq.0).AND.(IBSTYP.eq.3)) GO TO 251 +IF(LBUFRIGNOREERROR) THEN + goto 360 +ENDIF +251 CONTINUE +IF(LBOPRPRO.AND.LLSPLIT) THEN + CALL OBSCREEN +ENDIF +360 CONTINUE +END SUBROUTINE SCANBUFR + diff --git a/gcc/tree-ssa-ifcombine.c b/gcc/tree-ssa-ifcombine.c index 1d2d85b..335b4fd 100644 --- a/gcc/tree-ssa-ifcombine.c +++ b/gcc/tree-ssa-ifcombine.c @@ -340,6 +340,9 @@ ifcombine_ifandif (basic_block inner_cond_bb, basic_block outer_cond_bb) t2 = force_gimple_operand_gsi (&gsi, t2, true, NULL_TREE, true, GSI_SAME_STMT); t = fold_build2 (EQ_EXPR, boolean_type_node, t2, t); + t = canonicalize_cond_expr_cond (t); + if (!t) + return false; gimple_cond_set_condition_from_tree (inner_cond, t); update_stmt (inner_cond); @@ -488,6 +491,9 @@ ifcombine_iforif (basic_block inner_cond_bb, basic_block outer_cond_bb) true, GSI_SAME_STMT); t = fold_build2 (NE_EXPR, boolean_type_node, t, build_int_cst (TREE_TYPE (t), 0)); + t = canonicalize_cond_expr_cond (t); + if (!t) + return false; gimple_cond_set_condition_from_tree (inner_cond, t); update_stmt (inner_cond); -- 2.7.4