https://gcc.gnu.org/g:43949a5271b6c0b14076b736d0c609235d36f7df
commit r16-3078-g43949a5271b6c0b14076b736d0c609235d36f7df Author: Richard Biener <rguent...@suse.de> Date: Fri Aug 8 08:57:58 2025 +0200 tree-optimization/121454 - ICE building libgo The following avoids building BIT_FIELD_REFs of reference trees that are unexpected by nonoverlapping_refs_since_match_p and while being there also those declared invalid by IL verification. PR tree-optimization/121454 * tree-ssa-sccvn.cc (visit_nary_op): Avoid unexpected BIT_FIELD_REFs. Diff: --- gcc/tree-ssa-sccvn.cc | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/gcc/tree-ssa-sccvn.cc b/gcc/tree-ssa-sccvn.cc index 1c113f848ebb..ccd80806263b 100644 --- a/gcc/tree-ssa-sccvn.cc +++ b/gcc/tree-ssa-sccvn.cc @@ -5643,15 +5643,24 @@ visit_nary_op (tree lhs, gassign *stmt) && vn_get_stmt_kind (ass) == VN_REFERENCE) { tree last_vuse = gimple_vuse (ass); - tree op = build3 (BIT_FIELD_REF, TREE_TYPE (rhs1), - gimple_assign_rhs1 (ass), - TREE_OPERAND (rhs1, 1), TREE_OPERAND (rhs1, 2)); - tree result = vn_reference_lookup (op, gimple_vuse (ass), - default_vn_walk_kind, - NULL, true, &last_vuse); - if (result - && useless_type_conversion_p (type, TREE_TYPE (result))) - return set_ssa_val_to (lhs, result); + tree op = gimple_assign_rhs1 (ass); + /* Avoid building invalid and unexpected refs. */ + if (TREE_CODE (op) != TARGET_MEM_REF + && TREE_CODE (op) != BIT_FIELD_REF + && TREE_CODE (op) != REALPART_EXPR + && TREE_CODE (op) != IMAGPART_EXPR) + { + tree op = build3 (BIT_FIELD_REF, TREE_TYPE (rhs1), + gimple_assign_rhs1 (ass), + TREE_OPERAND (rhs1, 1), + TREE_OPERAND (rhs1, 2)); + tree result = vn_reference_lookup (op, gimple_vuse (ass), + default_vn_walk_kind, + NULL, true, &last_vuse); + if (result + && useless_type_conversion_p (type, TREE_TYPE (result))) + return set_ssa_val_to (lhs, result); + } } } break;