diff options
author | Richard Guenther <rguenther@suse.de> | 2008-09-09 11:26:45 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2008-09-09 11:26:45 +0000 |
commit | 8b17cc05d37f88ce76e53f22734042f7eed0b332 (patch) | |
tree | 343871c9be1bd0b54caffbbb5f379ca0a5dc8833 /gcc/gimplify.c | |
parent | 1751ecd619cd564d1e1b0c203c9ae65c75c7c216 (diff) | |
download | gcc-8b17cc05d37f88ce76e53f22734042f7eed0b332.zip gcc-8b17cc05d37f88ce76e53f22734042f7eed0b332.tar.gz gcc-8b17cc05d37f88ce76e53f22734042f7eed0b332.tar.bz2 |
re PR tree-optimization/37354 (ICE: in find_func_aliases, at tree-ssa-structalias.c:3906)
2008-09-09 Richard Guenther <rguenther@suse.de>
PR middle-end/37354
PR middle-end/30165
* gimplify.c (gimplify_conversion): Change conversions of
non-register type to VIEW_CONVERT_EXPRs.
(gimplify_addr_expr): If we need to make the operand
addressable make sure to use a properly initialized
temporary for that so it gets a valid gimple store.
* g++.dg/torture/pr37354.C: New testcase.
From-SVN: r140145
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r-- | gcc/gimplify.c | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c index c1f5744..55c5fb2 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -1872,6 +1872,12 @@ gimplify_conversion (tree *expr_p) canonicalize_addr_expr (expr_p); } + /* If we have a conversion to a non-register type force the + use of a VIEW_CONVERT_EXPR instead. */ + if (!is_gimple_reg_type (TREE_TYPE (*expr_p))) + *expr_p = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (*expr_p), + TREE_OPERAND (*expr_p, 0)); + return GS_OK; } @@ -4555,20 +4561,31 @@ gimplify_addr_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p) /* Mark the RHS addressable. */ ret = gimplify_expr (&TREE_OPERAND (expr, 0), pre_p, post_p, is_gimple_addressable, fb_either); - if (ret != GS_ERROR) - { - op0 = TREE_OPERAND (expr, 0); + if (ret == GS_ERROR) + break; - /* For various reasons, the gimplification of the expression - may have made a new INDIRECT_REF. */ - if (TREE_CODE (op0) == INDIRECT_REF) - goto do_indirect_ref; + /* We cannot rely on making the RHS addressable if it is + a temporary created by gimplification. In this case create a + new temporary that is initialized by a copy (which will + become a store after we mark it addressable). + This mostly happens if the frontend passed us something that + it could not mark addressable yet, like a fortran + pass-by-reference parameter (int) floatvar. */ + if (is_gimple_formal_tmp_var (TREE_OPERAND (expr, 0))) + TREE_OPERAND (expr, 0) + = get_initialized_tmp_var (TREE_OPERAND (expr, 0), pre_p, post_p); - /* Make sure TREE_CONSTANT and TREE_SIDE_EFFECTS are set properly. */ - recompute_tree_invariant_for_addr_expr (expr); + op0 = TREE_OPERAND (expr, 0); - mark_addressable (TREE_OPERAND (expr, 0)); - } + /* For various reasons, the gimplification of the expression + may have made a new INDIRECT_REF. */ + if (TREE_CODE (op0) == INDIRECT_REF) + goto do_indirect_ref; + + /* Make sure TREE_CONSTANT and TREE_SIDE_EFFECTS are set properly. */ + recompute_tree_invariant_for_addr_expr (expr); + + mark_addressable (TREE_OPERAND (expr, 0)); break; } |