VN already sees if an expresion is fully constant so there's no reason to duplicate that work during PHI translation. I've verified with an assert the paths are indeed unreachable.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied. Richard. 2017-11-17 Richard Biener <rguent...@suse.de> * tree-ssa-pre.c (phi_translate_1): Remove redundant constant folding of references. Index: gcc/tree-ssa-pre.c =================================================================== --- gcc/tree-ssa-pre.c (revision 254797) +++ gcc/tree-ssa-pre.c (working copy) @@ -1566,7 +1566,6 @@ phi_translate_1 (pre_expr expr, bitmap_s if (changed || newvuse != vuse) { unsigned int new_val_id; - pre_expr constant; tree result = vn_reference_lookup_pieces (newvuse, ref->set, ref->type, @@ -1611,15 +1610,7 @@ phi_translate_1 (pre_expr expr, bitmap_s expr->id = 0; if (newref) - { - PRE_EXPR_REFERENCE (expr) = newref; - constant = fully_constant_expression (expr); - if (constant != expr) - return constant; - - new_val_id = newref->value_id; - get_or_alloc_expression_id (expr); - } + new_val_id = newref->value_id; else { if (changed || !same_valid) @@ -1637,12 +1628,9 @@ phi_translate_1 (pre_expr expr, bitmap_s newoperands, result, new_val_id); newoperands = vNULL; - PRE_EXPR_REFERENCE (expr) = newref; - constant = fully_constant_expression (expr); - if (constant != expr) - return constant; - get_or_alloc_expression_id (expr); } + PRE_EXPR_REFERENCE (expr) = newref; + get_or_alloc_expression_id (expr); add_to_value (new_val_id, expr); } newoperands.release ();