summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2017-07-16 13:36:27 +0000
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>2017-07-16 13:36:27 +0000
commit02e9c224d671afbc879b5abf53932b74f106c3c8 (patch)
tree340c54dbda6a6049126064171881c3bc6d78bc4c
parent587101b854e2e9a8ee91a22c73242bdfca16ef50 (diff)
downloadgcc-02e9c224d671afbc879b5abf53932b74f106c3c8.tar.gz
* gimplify.c (mostly_copy_tree_r): Revert latest change.
(gimplify_save_expr): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@250238 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/gimplify.c24
2 files changed, 24 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ff249f15bfd..4d04f54de10 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2017-07-16 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gimplify.c (mostly_copy_tree_r): Revert latest change.
+ (gimplify_save_expr): Likewise.
+
2017-07-07 Jan Hubicka <hubicka@ucw.cz>
* ipa-visibility.c (function_and_variable_visibility): Fix pasto.
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index d456c3ef301..641a8210dad 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -818,7 +818,12 @@ mostly_copy_tree_r (tree *tp, int *walk_subtrees, void *data)
/* Stop at types, decls, constants like copy_tree_r. */
else if (TREE_CODE_CLASS (code) == tcc_type
|| TREE_CODE_CLASS (code) == tcc_declaration
- || TREE_CODE_CLASS (code) == tcc_constant)
+ || TREE_CODE_CLASS (code) == tcc_constant
+ /* We can't do anything sensible with a BLOCK used as an
+ expression, but we also can't just die when we see it
+ because of non-expression uses. So we avert our eyes
+ and cross our fingers. Silly Java. */
+ || code == BLOCK)
*walk_subtrees = 0;
/* Cope with the statement expression extension. */
@@ -5802,10 +5807,19 @@ gimplify_save_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
/* If the SAVE_EXPR has not been resolved, then evaluate it once. */
if (!SAVE_EXPR_RESOLVED_P (*expr_p))
{
- gcc_assert (TREE_TYPE (val) != void_type_node);
- /* The temporary may not be an SSA name as later abnormal and EH
- control flow may invalidate use/def domination. */
- val = get_initialized_tmp_var (val, pre_p, post_p, false);
+ /* The operand may be a void-valued expression such as SAVE_EXPRs
+ generated by the Java frontend for class initialization. It is
+ being executed only for its side-effects. */
+ if (TREE_TYPE (val) == void_type_node)
+ {
+ ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
+ is_gimple_stmt, fb_none);
+ val = NULL;
+ }
+ else
+ /* The temporary may not be an SSA name as later abnormal and EH
+ control flow may invalidate use/def domination. */
+ val = get_initialized_tmp_var (val, pre_p, post_p, false);
TREE_OPERAND (*expr_p, 0) = val;
SAVE_EXPR_RESOLVED_P (*expr_p) = 1;