diff options
author | Zdenek Dvorak <dvorakz@suse.cz> | 2007-05-31 18:27:05 +0200 |
---|---|---|
committer | Zdenek Dvorak <rakdver@gcc.gnu.org> | 2007-05-31 16:27:05 +0000 |
commit | 2664efb66b50f177f99b4555bd8a0791b12cbff7 (patch) | |
tree | 1bb95f0a0a18307404f6edf4de9051bbc9ee0f05 | |
parent | 01e4dd0dad070ccae1c2f0e2873f41ded5ca1595 (diff) | |
download | gcc-2664efb66b50f177f99b4555bd8a0791b12cbff7.zip gcc-2664efb66b50f177f99b4555bd8a0791b12cbff7.tar.gz gcc-2664efb66b50f177f99b4555bd8a0791b12cbff7.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/predcom-1.f | 16 | ||||
-rw-r--r-- | gcc/tree-predcom.c | 28 |
4 files changed, 50 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a0b2e7f..64f9794 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-05-31 Zdenek Dvorak <dvorakz@suse.cz> + + 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 <kazu@codesourcery.com> * gcc.c (main): Don't consider linker options when issuing the diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e1e31c0..86e6766 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-05-31 Zdenek Dvorak <dvorakz@suse.cz> + + PR tree-optimization/32160 + * gfortran.dg/predcom-1.f: New test. + 2007-05-31 Richard Guenther <rguenther@suse.de> * 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 0000000..1cc0bf2 --- /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 a3a137f..b5c8292 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)); |