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
This commit is contained in:
Zdenek Dvorak 2007-05-31 18:27:05 +02:00 committed by Zdenek Dvorak
parent 01e4dd0dad
commit 2664efb66b
4 changed files with 50 additions and 6 deletions

View File

@ -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

View File

@ -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...

View File

@ -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

View File

@ -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));