Commit 2664efb6 by Zdenek Dvorak Committed by Zdenek Dvorak

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
parent 01e4dd0d
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> 2007-05-31 Kazu Hirata <kazu@codesourcery.com>
* gcc.c (main): Don't consider linker options when issuing the * gcc.c (main): Don't consider linker options when issuing the
......
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> 2007-05-31 Richard Guenther <rguenther@suse.de>
* g++.dg/other/str_empty.C: Move... * g++.dg/other/str_empty.C: Move...
! 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
...@@ -1401,6 +1401,26 @@ mark_virtual_ops_for_renaming_list (tree list) ...@@ -1401,6 +1401,26 @@ mark_virtual_ops_for_renaming_list (tree list)
mark_virtual_ops_for_renaming (tsi_stmt (tsi)); 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 /* Creates the variables for CHAIN, as well as phi nodes for them and
initialization on entry to LOOP. Uids of the newly created initialization on entry to LOOP. Uids of the newly created
temporary variables are marked in TMP_VARS. */ temporary variables are marked in TMP_VARS. */
...@@ -1429,9 +1449,7 @@ initialize_root_vars (struct loop *loop, chain_p chain, bitmap 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++) for (i = 0; i < n + (reuse_first ? 0 : 1); i++)
{ {
var = create_tmp_var (TREE_TYPE (ref), get_lsm_tmp_name (ref, i)); var = predcom_tmp_var (ref, i, tmp_vars);
add_referenced_var (var);
bitmap_set_bit (tmp_vars, DECL_UID (var));
VEC_quick_push (tree, chain->vars, var); VEC_quick_push (tree, chain->vars, var);
} }
if (reuse_first) if (reuse_first)
...@@ -1499,9 +1517,7 @@ initialize_root_vars_lm (struct loop *loop, dref root, bool written, ...@@ -1499,9 +1517,7 @@ initialize_root_vars_lm (struct loop *loop, dref root, bool written,
init = VEC_index (tree, inits, 0); init = VEC_index (tree, inits, 0);
*vars = VEC_alloc (tree, heap, written ? 2 : 1); *vars = VEC_alloc (tree, heap, written ? 2 : 1);
var = create_tmp_var (TREE_TYPE (ref), get_lsm_tmp_name (ref, 0)); var = predcom_tmp_var (ref, 0, tmp_vars);
add_referenced_var (var);
bitmap_set_bit (tmp_vars, DECL_UID (var));
VEC_quick_push (tree, *vars, var); VEC_quick_push (tree, *vars, var);
if (written) if (written)
VEC_quick_push (tree, *vars, VEC_index (tree, *vars, 0)); VEC_quick_push (tree, *vars, VEC_index (tree, *vars, 0));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment