@@ -561,6 +561,21 @@ build_unary_op (tree_code code, tree type, tree arg)
561
561
care about, storing the value in VALUEP. Callers must ensure that the
562
562
returned expression is evaluated before VALUEP. */
563
563
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
+
564
579
tree
565
580
stabilize_expr (tree *valuep)
566
581
{
@@ -1193,6 +1208,7 @@ find_aggregate_field (tree type, tree ident, tree offset)
1193
1208
1194
1209
return NULL_TREE;
1195
1210
}
1211
+
1196
1212
/* Return a constructor that matches the layout of the class expression EXP. */
1197
1213
1198
1214
tree
@@ -1530,7 +1546,7 @@ indirect_ref (tree type, tree exp)
1530
1546
return exp ;
1531
1547
1532
1548
/* Maybe rewrite: *(e1, e2) => (e1, *e2) */
1533
- tree init = stabilize_expr (&exp );
1549
+ tree init = stabilize_expr2 (&exp );
1534
1550
1535
1551
if (TREE_CODE (TREE_TYPE (exp )) == REFERENCE_TYPE)
1536
1552
exp = fold_build1 (INDIRECT_REF, type, exp );
@@ -1552,7 +1568,7 @@ build_deref (tree exp)
1552
1568
return exp ;
1553
1569
1554
1570
/* Maybe rewrite: *(e1, e2) => (e1, *e2) */
1555
- tree init = stabilize_expr (&exp );
1571
+ tree init = stabilize_expr2 (&exp );
1556
1572
1557
1573
gcc_assert (POINTER_TYPE_P (TREE_TYPE (exp )));
1558
1574
0 commit comments