https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63587
--- Comment #2 from Martin Liška <mliska at suse dot cz> --- Following two functions are merged: static boost::log::make_output_actor<ActorT<LeftExprT>, RightT, ValueT>::type boost::log::make_output_actor<ActorT<LeftExprT>, RightT, ValueT>::make(ActorT<LeftExprT>, RightT&) [with ActorT = boost::actor; LeftExprT = int; RightT = boost::log::attribute_actor<int, boost::log::value_extractor, void, boost::actor>; ValueT = int; boost::log::make_output_actor<ActorT<LeftExprT>, RightT, ValueT>::type = boost::actor<boost::log::attribute_output_terminal<boost::actor<int>, boost::log::to_log_fun> >] (struct actor left, struct attribute_actor & right) static boost::log::make_output_actor<ActorT<LeftExprT>, RightT, ValueT>::type boost::log::make_output_actor<ActorT<LeftExprT>, RightT, ValueT>::make(ActorT<LeftExprT>, RightT&) [with ActorT = boost::actor; LeftExprT = int; RightT = boost::log::attribute_actor<{anonymous}::my_class, boost::log::value_extractor, void, boost::actor>; ValueT = int; boost::log::make_output_actor<ActorT<LeftExprT>, RightT, ValueT>::type = boost::actor<boost::log::attribute_output_terminal<boost::actor<int>, boost::log::to_log_fun> >] (struct actor left, struct attribute_actor & right) with following body: { struct type D.3826; struct to_log_fun D.3825; struct attribute_name D.3824; int SR.9; struct actor left; <bb 2>: left = left; SR.9_4 = MEM[(struct attribute_terminal *)right_2(D)]; MEM[(struct attribute_name *)&D.3824] = SR.9_4; boost::log::attribute_output_terminal<boost::actor<int>, boost::log::to_log_fun>::attribute_output_terminal<int> (&D.3826, left, D.3824, D.3825, 0); D.3826 ={v} {CLOBBER}; return; } As I was debugging ao_ref_alias_sets, there's MEM_REF where we have different template arguments: attribute_actor<int,...> vs. attribute_actor<{anonymous}::my_class,...>. What do you think Richard about these record_types from alias set perspective: (gdb) p debug_tree(t1) <mem_ref 0x7ffff6ab4000 type <integer_type 0x7ffff6c33690 int public type_6 SI size <integer_cst 0x7ffff6c51048 constant 32> unit size <integer_cst 0x7ffff6c51060 constant 4> align 32 symtab 0 alias set 4 canonical type 0x7ffff6c33690 precision 32 min <integer_cst 0x7ffff6c51000 -2147483648> max <integer_cst 0x7ffff6c51018 2147483647> pointer_to_this <pointer_type 0x7ffff6c55738>> arg 0 <ssa_name 0x7ffff6aae678 type <reference_type 0x7ffff6e20d20 type <record_type 0x7ffff6de7dc8 attribute_actor> unsigned DI size <integer_cst 0x7ffff6c2fdf8 constant 64> unit size <integer_cst 0x7ffff6c2fe10 constant 8> align 64 symtab 0 alias set 7 canonical type 0x7ffff6e20d20> visited var <parm_decl 0x7ffff6e1eb00 right>def_stmt GIMPLE_NOP version 2 ptr-info 0x7ffff6a7e3d8> arg 1 <integer_cst 0x7ffff6a4ee28 type <pointer_type 0x7ffff6dbfa80> constant 0>> $1 = void (gdb) p debug_tree(t2) <mem_ref 0x7ffff6aa1ac8 type <integer_type 0x7ffff6c33690 int public type_6 SI size <integer_cst 0x7ffff6c51048 constant 32> unit size <integer_cst 0x7ffff6c51060 constant 4> align 32 symtab 0 alias set 4 canonical type 0x7ffff6c33690 precision 32 min <integer_cst 0x7ffff6c51000 -2147483648> max <integer_cst 0x7ffff6c51018 2147483647> pointer_to_this <pointer_type 0x7ffff6c55738>> arg 0 <ssa_name 0x7ffff6a77dc8 type <reference_type 0x7ffff6e20540 type <record_type 0x7ffff6ddd888 attribute_actor> unsigned DI size <integer_cst 0x7ffff6c2fdf8 constant 64> unit size <integer_cst 0x7ffff6c2fe10 constant 8> align 64 symtab 0 alias set 7 canonical type 0x7ffff6e20540> visited var <parm_decl 0x7ffff6e1ea00 right>def_stmt GIMPLE_NOP version 2 ptr-info 0x7ffff6a7e300> arg 1 <integer_cst 0x7ffff6a4ee28 type <pointer_type 0x7ffff6dbfa80> constant 0>> these types are called for alias_set comparison, with following record_types: (gdb) p debug_tree((tree_node*)0x7ffff6de7dc8) <record_type 0x7ffff6de7dc8 attribute_actor needs-constructing type_5 type_6 SI size <integer_cst 0x7ffff6c51048 type <integer_type 0x7ffff6c33150 bitsizetype> constant 32> unit size <integer_cst 0x7ffff6c51060 type <integer_type 0x7ffff6c330a8 sizetype> constant 4> align 32 symtab 0 alias set 17 canonical type 0x7ffff6de7dc8 fields <field_decl 0x7ffff6de4ed8 D.2798 type <record_type 0x7ffff6dddb28 actor needs-constructing type_5 type_6 SI size <integer_cst 0x7ffff6c51048 32> unit size <integer_cst 0x7ffff6c51060 4> align 32 symtab 0 alias set 15 canonical type 0x7ffff6dddb28 fields <field_decl 0x7ffff6de01c8 proto_expr_> context <namespace_decl 0x7ffff6d8d2f8 boost> full-name "struct boost::actor<boost::log::attribute_terminal>" needs-constructor X() X(constX&) this=(X&) n_parents=0 use_template=1 interface-unknown pointer_to_this <pointer_type 0x7ffff6e03930> reference_to_this <reference_type 0x7ffff6dff0a8> chain <type_decl 0x7ffff6de0098 actor>> ignored decl_6 SI file ../../PR33754.c line 167 col 7 size <integer_cst 0x7ffff6c51048 32> unit size <integer_cst 0x7ffff6c51060 4> align 32 offset_align 128 offset <integer_cst 0x7ffff6c2fe28 constant 0> bit offset <integer_cst 0x7ffff6c2fe70 constant 0> context <record_type 0x7ffff6de7dc8 attribute_actor> chain <type_decl 0x7ffff6de4da8 attribute_actor type <record_type 0x7ffff6de80a8 attribute_actor> external nonlocal suppress-debug decl_4 VOID file ../../PR33754.c line 168 col 1 align 8 context <record_type 0x7ffff6de7dc8 attribute_actor> result <record_type 0x7ffff6de7dc8 attribute_actor> chain <type_decl 0x7ffff6de4e40 value_type>>> context <namespace_decl 0x7ffff6dbec78 log> full-name "class boost::log::attribute_actor<int, boost::log::value_extractor, void, boost::actor>" needs-constructor X() X(constX&) this=(X&) n_parents=1 use_template=1 interface-unknown pointer_to_this <pointer_type 0x7ffff6de81f8> reference_to_this <reference_type 0x7ffff6e20d20> chain <type_decl 0x7ffff6de4d10 attribute_actor>> $3 = void (gdb) p debug_tree((tree_node*)0x7ffff6ddd888) <record_type 0x7ffff6ddd888 attribute_actor needs-constructing type_5 type_6 SI size <integer_cst 0x7ffff6c51048 type <integer_type 0x7ffff6c33150 bitsizetype> constant 32> unit size <integer_cst 0x7ffff6c51060 type <integer_type 0x7ffff6c330a8 sizetype> constant 4> align 32 symtab 0 alias set 14 canonical type 0x7ffff6ddd888 fields <field_decl 0x7ffff6de0b48 D.2756 type <record_type 0x7ffff6dddb28 actor needs-constructing type_5 type_6 SI size <integer_cst 0x7ffff6c51048 32> unit size <integer_cst 0x7ffff6c51060 4> align 32 symtab 0 alias set 15 canonical type 0x7ffff6dddb28 fields <field_decl 0x7ffff6de01c8 proto_expr_> context <namespace_decl 0x7ffff6d8d2f8 boost> full-name "struct boost::actor<boost::log::attribute_terminal>" needs-constructor X() X(constX&) this=(X&) n_parents=0 use_template=1 interface-unknown pointer_to_this <pointer_type 0x7ffff6e03930> reference_to_this <reference_type 0x7ffff6dff0a8> chain <type_decl 0x7ffff6de0098 actor>> ignored decl_6 SI file ../../PR33754.c line 167 col 7 size <integer_cst 0x7ffff6c51048 32> unit size <integer_cst 0x7ffff6c51060 4> align 32 offset_align 128 offset <integer_cst 0x7ffff6c2fe28 constant 0> bit offset <integer_cst 0x7ffff6c2fe70 constant 0> context <record_type 0x7ffff6ddd888 attribute_actor> chain <type_decl 0x7ffff6de0a18 attribute_actor type <record_type 0x7ffff6de12a0 attribute_actor> external nonlocal suppress-debug decl_4 VOID file ../../PR33754.c line 168 col 1 align 8 context <record_type 0x7ffff6ddd888 attribute_actor> result <record_type 0x7ffff6ddd888 attribute_actor> chain <type_decl 0x7ffff6de0ab0 value_type>>> context <namespace_decl 0x7ffff6dbec78 log> full-name "class boost::log::attribute_actor<{anonymous}::my_class, boost::log::value_extractor, void, boost::actor>" needs-constructor X() X(constX&) this=(X&) n_parents=1 use_template=1 interface-unknown pointer_to_this <pointer_type 0x7ffff6de13f0> reference_to_this <reference_type 0x7ffff6e20540> chain <type_decl 0x7ffff6dd2ed8 attribute_actor>> If the alias sets can be considered to be equal, we must face some latent bug in inliner? Thank you, Martin