https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87188
Bug ID: 87188 Summary: Function pointer canonicalization optimized away Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: danglin at gcc dot gnu.org Target Milestone: --- Host: hppa*-*-* (32-bit) Target: hppa*-*-* (32-bit) Build: hppa*-*-* (32-bit) Created attachment 44647 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=44647&action=edit c++ testcase This is debian bug #907586 reported by Mattias Ellert: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=907586 Compilation is as follows: g++ -O2 -g -c -o main.o main.cpp g++ -O2 -g -fPIC -c -o S.o S.cpp g++ -shared -fPIC -o libS.so S.o g++ -o main main.o -L. -lS g++ -o altmain main.o S.o -- Running using shared library LD_LIBRARY_PATH=. ./main not OK -- Running using static build ./altmain OK If S.cpp is compiled at -O0, the test passes. The problem in the optimized code is here: .align 4 .LC0: .word P%_ZNK2SVneERKS_ .text .align 4 .globl _ZNK2SR4findEv .type _ZNK2SR4findEv, @function .LFB1721: .cfi_startproc _ZNK2SR4findEv: .PROC .CALLINFO FRAME=0,NO_CALLS .ENTRY ldw 0(%r26),%r21 comb,=,n %r26,%r21,.L14 ldw 12(%r21),%r20 ldw 8(%r21),%r28 addil LT'.LC0,%r19 ldw RT'.LC0(%r1),%r31 ldw 0(%r31),%r22 comclr,<> %r22,%r28,%r28 ldi 1,%r28 The comclr instruction compares the function pointer at .LC0 with the one indirectly passed via this. The code needs to call __canonicalize_funcptr_for_compare().