@@ -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+
564579tree
565580stabilize_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
11981214tree
@@ -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
0 commit comments