https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89924
--- Comment #7 from Kamlesh Kumar <kamleshbhalui at gmail dot com> --- After this patch diff --git a/gcc/ipa-polymorphic-call.c b/gcc/ipa-polymorphic-call.c index 705af03..b76793f 100644 --- a/gcc/ipa-polymorphic-call.c +++ b/gcc/ipa-polymorphic-call.c @@ -1118,6 +1118,10 @@ ipa_polymorphic_call_context::ipa_polymorphic_call_context (tree fndecl, We do not make this type of flow sensitive analysis yet. */ if (instance) *instance = base_pointer; + + if (((TREE_CODE (TREE_TYPE(base_type)) == RECORD_TYPE))) + outer_type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (base_pointer))); + return; } Gcc produces this code for above reported testcase. .file "test.cpp" .text .section .text._ZN4AintpLERK1A,"axG",@progbits,_ZN4AintpLERK1A,comdat .align 2 .p2align 4 .weak _ZN4AintpLERK1A .type _ZN4AintpLERK1A, @function _ZN4AintpLERK1A: .LFB3: .cfi_startproc movl 8(%rsi), %edx movq %rdi, %rax addl %edx, 8(%rdi) ret .cfi_endproc .LFE3: .size _ZN4AintpLERK1A, .-_ZN4AintpLERK1A .text .p2align 4 .globl _Z9foo_innerPi .type _Z9foo_innerPi, @function _Z9foo_innerPi: .LFB0: .cfi_startproc sall (%rdi) ret .cfi_endproc .LFE0: .size _Z9foo_innerPi, .-_Z9foo_innerPi .p2align 4 .globl _Z17foo_virtual_innerP1A .type _Z17foo_virtual_innerP1A, @function _Z17foo_virtual_innerP1A: .LFB1: .cfi_startproc movq (%rdi), %rax movq (%rax), %rax cmpq $_ZN4AintpLERK1A, %rax jne .L5 sall 8(%rdi) ret .p2align 4,,10 .p2align 3 .L5: movq %rdi, %rsi jmp *%rax .cfi_endproc .LFE1: .size _Z17foo_virtual_innerP1A, .-_Z17foo_virtual_innerP1A .p2align 4 .globl _Z3fooPi .type _Z3fooPi, @function _Z3fooPi: .LFB6: .cfi_startproc sall (%rdi) ret .cfi_endproc .LFE6: .size _Z3fooPi, .-_Z3fooPi .p2align 4 .globl _Z11foo_virtualP4Aint .type _Z11foo_virtualP4Aint, @function _Z11foo_virtualP4Aint: .LFB4: .cfi_startproc sall 8(%rdi) ret .cfi_endproc .LFE4: .size _Z11foo_virtualP4Aint, .-_Z11foo_virtualP4Aint .ident "GCC: (GNU) 10.0.0 20190821 (experimental)" .section .note.GNU-stack,"",@progbits