Skip to content
This repository was archived by the owner on Jun 20, 2019. It is now read-only.

Commit 95379b0

Browse files
committed
Use target_expr based stabilize in indirect_ref
1 parent b81d3f8 commit 95379b0

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

gcc/d/d-codegen.cc

+18-2
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,21 @@ build_unary_op (tree_code code, tree type, tree arg)
561561
care about, storing the value in VALUEP. Callers must ensure that the
562562
returned expression is evaluated before VALUEP. */
563563

564+
tree
565+
stabilize_expr2 (tree *valuep)
566+
{
567+
tree expr = *valuep;
568+
569+
/* No side effects or expression has no value. */
570+
if (!TREE_SIDE_EFFECTS (expr) || VOID_TYPE_P (TREE_TYPE (expr)))
571+
return NULL_TREE;
572+
573+
tree init = force_target_expr (expr);
574+
*valuep = TARGET_EXPR_SLOT (init);
575+
576+
return init;
577+
}
578+
564579
tree
565580
stabilize_expr (tree *valuep)
566581
{
@@ -1193,6 +1208,7 @@ find_aggregate_field (tree type, tree ident, tree offset)
11931208

11941209
return NULL_TREE;
11951210
}
1211+
11961212
/* Return a constructor that matches the layout of the class expression EXP. */
11971213

11981214
tree
@@ -1530,7 +1546,7 @@ indirect_ref (tree type, tree exp)
15301546
return exp;
15311547

15321548
/* Maybe rewrite: *(e1, e2) => (e1, *e2) */
1533-
tree init = stabilize_expr (&exp);
1549+
tree init = stabilize_expr2 (&exp);
15341550

15351551
if (TREE_CODE (TREE_TYPE (exp)) == REFERENCE_TYPE)
15361552
exp = fold_build1 (INDIRECT_REF, type, exp);
@@ -1552,7 +1568,7 @@ build_deref (tree exp)
15521568
return exp;
15531569

15541570
/* Maybe rewrite: *(e1, e2) => (e1, *e2) */
1555-
tree init = stabilize_expr (&exp);
1571+
tree init = stabilize_expr2 (&exp);
15561572

15571573
gcc_assert (POINTER_TYPE_P (TREE_TYPE (exp)));
15581574

gcc/d/d-tree.h

+1
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,7 @@ extern void extract_from_method_call (tree, tree &, tree &);
508508
extern tree build_vindex_ref (tree, tree, size_t);
509509
extern tree d_save_expr (tree);
510510
extern tree stabilize_expr (tree *);
511+
extern tree stabilize_expr2 (tree *);
511512
extern tree build_target_expr (tree, tree);
512513
extern tree force_target_expr (tree);
513514
extern tree build_address (tree);

0 commit comments

Comments
 (0)