From 2664efb66b50f177f99b4555bd8a0791b12cbff7 Mon Sep 17 00:00:00 2001 From: Zdenek Dvorak Date: Thu, 31 May 2007 18:27:05 +0200 Subject: [PATCH] re PR tree-optimization/32160 (ICE with -O3 in verify_ssa) PR tree-optimization/32160 * tree-predcom.c (predcom_tmp_var): New function. Mark created variable as gimple reg. (initialize_root_vars, initialize_root_vars_lm): Use predcom_tmp_var. * gfortran.dg/predcom-1.f: New test. From-SVN: r125228 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/predcom-1.f | 16 +++++++++++++++ gcc/tree-predcom.c | 28 +++++++++++++++++++++------ 4 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/predcom-1.f diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a0b2e7f4ec8..64f97946581 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-05-31 Zdenek Dvorak + + PR tree-optimization/32160 + * tree-predcom.c (predcom_tmp_var): New function. Mark created + variable as gimple reg. + (initialize_root_vars, initialize_root_vars_lm): Use predcom_tmp_var. + 2007-05-31 Kazu Hirata * gcc.c (main): Don't consider linker options when issuing the diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e1e31c0b909..86e6766ed61 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-05-31 Zdenek Dvorak + + PR tree-optimization/32160 + * gfortran.dg/predcom-1.f: New test. + 2007-05-31 Richard Guenther * g++.dg/other/str_empty.C: Move... diff --git a/gcc/testsuite/gfortran.dg/predcom-1.f b/gcc/testsuite/gfortran.dg/predcom-1.f new file mode 100644 index 00000000000..1cc0bf24bad --- /dev/null +++ b/gcc/testsuite/gfortran.dg/predcom-1.f @@ -0,0 +1,16 @@ +! PR 32160, complex temporary variables were not marked as gimple registers +! { dg-do compile } +! { dg-options "-O3" } + + REAL FUNCTION CLANHT( N, E ) + INTEGER N + COMPLEX E( * ) + INTEGER I + REAL ANORM + INTRINSIC ABS + DO 20 I = 1, N + ANORM = ANORM +ABS( E( I ) )+ ABS( E( I-1 ) ) + 20 CONTINUE + CLANHT = ANORM + RETURN + END diff --git a/gcc/tree-predcom.c b/gcc/tree-predcom.c index a3a137f7d28..b5c82923ee2 100644 --- a/gcc/tree-predcom.c +++ b/gcc/tree-predcom.c @@ -1401,6 +1401,26 @@ mark_virtual_ops_for_renaming_list (tree list) mark_virtual_ops_for_renaming (tsi_stmt (tsi)); } +/* Returns a new temporary variable used for the I-th variable carrying + value of REF. The variable's uid is marked in TMP_VARS. */ + +static tree +predcom_tmp_var (tree ref, unsigned i, bitmap tmp_vars) +{ + tree type = TREE_TYPE (ref); + tree var = create_tmp_var (type, get_lsm_tmp_name (ref, i)); + + /* We never access the components of the temporary variable in predictive + commoning. */ + if (TREE_CODE (type) == COMPLEX_TYPE + || TREE_CODE (type) == VECTOR_TYPE) + DECL_GIMPLE_REG_P (var) = 1; + + add_referenced_var (var); + bitmap_set_bit (tmp_vars, DECL_UID (var)); + return var; +} + /* Creates the variables for CHAIN, as well as phi nodes for them and initialization on entry to LOOP. Uids of the newly created temporary variables are marked in TMP_VARS. */ @@ -1429,9 +1449,7 @@ initialize_root_vars (struct loop *loop, chain_p chain, bitmap tmp_vars) for (i = 0; i < n + (reuse_first ? 0 : 1); i++) { - var = create_tmp_var (TREE_TYPE (ref), get_lsm_tmp_name (ref, i)); - add_referenced_var (var); - bitmap_set_bit (tmp_vars, DECL_UID (var)); + var = predcom_tmp_var (ref, i, tmp_vars); VEC_quick_push (tree, chain->vars, var); } if (reuse_first) @@ -1499,9 +1517,7 @@ initialize_root_vars_lm (struct loop *loop, dref root, bool written, init = VEC_index (tree, inits, 0); *vars = VEC_alloc (tree, heap, written ? 2 : 1); - var = create_tmp_var (TREE_TYPE (ref), get_lsm_tmp_name (ref, 0)); - add_referenced_var (var); - bitmap_set_bit (tmp_vars, DECL_UID (var)); + var = predcom_tmp_var (ref, 0, tmp_vars); VEC_quick_push (tree, *vars, var); if (written) VEC_quick_push (tree, *vars, VEC_index (tree, *vars, 0)); -- 2.30.2