From b85020cb469d6fb73eb055c169d18b3f5c14a95a Mon Sep 17 00:00:00 2001 From: Martin Jambor Date: Tue, 2 Nov 2010 16:06:21 +0100 Subject: re PR tree-optimization/45875 (ice in gimple_fold_obj_type_ref_known_binfo with -O2) 2010-11-02 Martin Jambor PR tree-optimization/45875 * gimple-fold.c (get_first_base_binfo_with_virtuals): Removed. (gimple_get_relevant_ref_binfo): Detect primary bases according to their field offset. * testsuite/g++.dg/torture/pr45875.C: New test. From-SVN: r166190 --- gcc/gimple-fold.c | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) (limited to 'gcc/gimple-fold.c') diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index 6862c126..f77b630 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -1360,22 +1360,6 @@ gimple_fold_builtin (gimple stmt) return result; } -/* Return the first of the base binfos of BINFO that has virtual functions. */ - -static tree -get_first_base_binfo_with_virtuals (tree binfo) -{ - int i; - tree base_binfo; - - for (i = 0; BINFO_BASE_ITERATE (binfo, i, base_binfo); i++) - if (BINFO_VIRTUALS (base_binfo)) - return base_binfo; - - return NULL_TREE; -} - - /* Search for a base binfo of BINFO that corresponds to TYPE and return it if it is found or NULL_TREE if it is not. */ @@ -1413,7 +1397,7 @@ gimple_get_relevant_ref_binfo (tree ref, tree known_binfo) if (TREE_CODE (ref) == COMPONENT_REF) { tree par_type; - tree binfo, base_binfo; + tree binfo; tree field = TREE_OPERAND (ref, 1); if (!DECL_ARTIFICIAL (field)) @@ -1431,14 +1415,15 @@ gimple_get_relevant_ref_binfo (tree ref, tree known_binfo) || BINFO_N_BASE_BINFOS (binfo) == 0) return NULL_TREE; - base_binfo = get_first_base_binfo_with_virtuals (binfo); - if (base_binfo && BINFO_TYPE (base_binfo) != TREE_TYPE (field)) + /* Offset 0 indicates the primary base, whose vtable contents are + represented in the binfo for the derived class. */ + if (int_bit_position (field) != 0) { tree d_binfo; + /* Get descendant binfo. */ d_binfo = gimple_get_relevant_ref_binfo (TREE_OPERAND (ref, 0), known_binfo); - /* Get descendant binfo. */ if (!d_binfo) return NULL_TREE; return get_base_binfo_for_type (d_binfo, TREE_TYPE (field)); -- cgit v1.1