aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimplify.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2008-09-09 11:26:45 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2008-09-09 11:26:45 +0000
commit8b17cc05d37f88ce76e53f22734042f7eed0b332 (patch)
tree343871c9be1bd0b54caffbbb5f379ca0a5dc8833 /gcc/gimplify.c
parent1751ecd619cd564d1e1b0c203c9ae65c75c7c216 (diff)
downloadgcc-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.c39
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;
}