diff options
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0143-PR-middle-end-48661.patch')
-rw-r--r-- | meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0143-PR-middle-end-48661.patch | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0143-PR-middle-end-48661.patch b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0143-PR-middle-end-48661.patch new file mode 100644 index 000000000..e032f13a6 --- /dev/null +++ b/meta/recipes-devtools/gcc/gcc-4.6.0/gcc-4_6-branch-backports/0143-PR-middle-end-48661.patch @@ -0,0 +1,166 @@ +From 6d925e0321b8a34fb21b00a202c07d3d8a6e389a Mon Sep 17 00:00:00 2001 +From: jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> +Date: Mon, 18 Apr 2011 21:58:03 +0000 +Subject: [PATCH 143/200] PR middle-end/48661 + * gimple-fold.c (gimple_get_virt_method_for_binfo): Return NULL + if TREE_TYPE (v) is non-NULL. + + * gimple-fold.c (gimple_get_virt_method_for_binfo): Renamed from + gimple_get_virt_mehtod_for_binfo. + * gimple.h (gimple_get_virt_method_for_binfo): Likewise. + * ipa-cp.c (ipcp_process_devirtualization_opportunities): Adjust + callers. + * ipa-prop.c (try_make_edge_direct_virtual_call): Likewise. + + * g++.dg/torture/pr48661.C: New test. + + +git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@172676 138bc75d-0d04-0410-961f-82ee72b054a4 + +index abc2273..1b82e12 100644 +--- a/gcc/gimple-fold.c ++++ b/gcc/gimple-fold.c +@@ -1374,7 +1374,7 @@ gimple_fold_builtin (gimple stmt) + is a thunk (other than a this adjustment which is dealt with by DELTA). */ + + tree +-gimple_get_virt_mehtod_for_binfo (HOST_WIDE_INT token, tree known_binfo, ++gimple_get_virt_method_for_binfo (HOST_WIDE_INT token, tree known_binfo, + tree *delta, bool refuse_thunks) + { + HOST_WIDE_INT i; +@@ -1393,6 +1393,10 @@ gimple_get_virt_mehtod_for_binfo (HOST_WIDE_INT token, tree known_binfo, + v = TREE_CHAIN (v); + } + ++ /* If BV_VCALL_INDEX is non-NULL, give up. */ ++ if (TREE_TYPE (v)) ++ return NULL_TREE; ++ + fndecl = TREE_VALUE (v); + node = cgraph_get_node_or_alias (fndecl); + if (refuse_thunks +diff --git a/gcc/gimple.h b/gcc/gimple.h +index cc35b60..fca3d55 100644 +--- a/gcc/gimple.h ++++ b/gcc/gimple.h +@@ -892,7 +892,7 @@ unsigned get_gimple_rhs_num_ops (enum tree_code); + gimple gimple_alloc_stat (enum gimple_code, unsigned MEM_STAT_DECL); + const char *gimple_decl_printable_name (tree, int); + bool gimple_fold_call (gimple_stmt_iterator *gsi, bool inplace); +-tree gimple_get_virt_mehtod_for_binfo (HOST_WIDE_INT, tree, tree *, bool); ++tree gimple_get_virt_method_for_binfo (HOST_WIDE_INT, tree, tree *, bool); + void gimple_adjust_this_by_delta (gimple_stmt_iterator *, tree); + /* Returns true iff T is a valid GIMPLE statement. */ + extern bool is_gimple_stmt (tree); +diff --git a/gcc/ipa-cp.c b/gcc/ipa-cp.c +index aad5d78..7f5a4c6 100644 +--- a/gcc/ipa-cp.c ++++ b/gcc/ipa-cp.c +@@ -1242,7 +1242,7 @@ ipcp_process_devirtualization_opportunities (struct cgraph_node *node) + { + tree binfo = VEC_index (tree, info->params[param_index].types, j); + tree d; +- tree t = gimple_get_virt_mehtod_for_binfo (token, binfo, &d, true); ++ tree t = gimple_get_virt_method_for_binfo (token, binfo, &d, true); + + if (!t) + { +diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c +index 589bc16..d89bf6d 100644 +--- a/gcc/ipa-prop.c ++++ b/gcc/ipa-prop.c +@@ -1730,7 +1730,7 @@ try_make_edge_direct_virtual_call (struct cgraph_edge *ie, + type = ie->indirect_info->otr_type; + binfo = get_binfo_at_offset (binfo, ie->indirect_info->anc_offset, type); + if (binfo) +- target = gimple_get_virt_mehtod_for_binfo (token, binfo, &delta, true); ++ target = gimple_get_virt_method_for_binfo (token, binfo, &delta, true); + else + return NULL; + +new file mode 100644 +index 0000000..8de2142 +--- /dev/null ++++ b/gcc/testsuite/g++.dg/torture/pr48661.C +@@ -0,0 +1,77 @@ ++// PR middle-end/48661 ++// { dg-do run } ++ ++extern "C" void abort (); ++ ++__attribute__((noinline)) ++double ++foo (double x, double y) ++{ ++ asm volatile ("" : : : "memory"); ++ return x + y; ++} ++ ++__attribute__((noinline, noclone)) ++void ++bar (int x) ++{ ++ if (x != 123) ++ abort (); ++} ++ ++struct A ++{ ++ double a1, a2; ++}; ++ ++struct B ++{ ++ virtual int m () const = 0 ; ++}; ++ ++struct C ++{ ++ virtual ~C () {} ++}; ++ ++struct D : virtual public B, public C ++{ ++ explicit D (const A &x) : d(123) { foo (x.a2, x.a1); } ++ int m () const { return d; } ++ int d; ++}; ++ ++struct E ++{ ++ E () : d(0) {} ++ virtual void n (const B &x) { d = x.m (); x.m (); x.m (); } ++ int d; ++}; ++ ++void ++test () ++{ ++ A a; ++ a.a1 = 0; ++ a.a2 = 1; ++ E p; ++ D q (a); ++ const B &b = q; ++ bar (b.m ()); ++ p.n (b); ++ bar (p.d); ++} ++ ++void ++baz () ++{ ++ A a; ++ D p2 (a); ++} ++ ++int ++main () ++{ ++ test (); ++ return 0; ++} +-- +1.7.0.4 + |