https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81538
Bug ID: 81538 Summary: Optimization problem compiling op.c (Perl_custom_op_get_field) in perl 5.26 Product: gcc Version: 6.4.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization Assignee: unassigned at gcc dot gnu.org Reporter: danglin at gcc dot gnu.org Target Milestone: --- Host: hppa-unknown-linux-gnu Target: hppa-unknown-linux-gnu Build: hppa-unknown-linux-gnu Created attachment 41819 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=41819&action=edit Preprocessed source Perl 5.26 (currently in experimental) has never built on hppa yet. It's failing with ./miniperl -Ilib make_ext.pl cpan/Archive-Tar/pm_to_blib MAKE="/usr/bin/make" LIBPERL_A=libperl.a Unsuccessful Makefile.PL(cpan/Archive-Tar): code=11 at make_ext.pl line 518. Miniperl branches to non existent code after calling Perl_custom_op_get_field: Jul 20 20:18:48 mx3210 kernel: do_page_fault() command='miniperl' type=6 address=0xbf600703 in libcrypt-2.24.so[f77f9000+9000] Jul 20 20:18:48 mx3210 kernel: trap #6: Instruction TLB miss fault, vm_start = 0x001e3000, vm_end = 0x005b4000 0x0002eac8 <Perl_rpeep+2896>: b,l 0x1a8d0 <Perl_custom_op_get_field>,rp 0x0002eacc <Perl_rpeep+2900>: copy r4,r26 0x0002ead0 <Perl_rpeep+2904>: movb,= ret0,r22,0x2e284 <Perl_rpeep+780> 0x0002ead4 <Perl_rpeep+2908>: copy r3,r25 0x0002ead8 <Perl_rpeep+2912>: copy r15,r24 0x0002eadc <Perl_rpeep+2916>: copy r4,r26 0x0002eae0 <Perl_rpeep+2920>: b,l 0x3b218,r31 0x0002eae4 <Perl_rpeep+2924>: copy r31,rp The branch at Perl_rpeep+2920 is an indirect call using the function pointer returned from calling Perl_custom_op_get_field. The value in $r22 for the indirect call is 0xbf600701. It is not a valid function pointer. This is debian bug #869122: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=869122 The value returned by Perl_custom_op_get_field is wrong for the case when xop == &xop_null. It appears to get messed up by the merging of the two switch statements in the C code. The debian bug report has a patch which revises the switch statements into one. With the patch, the perl build is successful on both hppa and sh. Attached preprocessed source. The compile command is: /usr/lib/gcc/hppa-linux-gnu/6/cc1 -fpreprocessed opmini.i -quiet -dumpbase opmini.c -auxbase opmini -g -g -O2 -O2 -Wdate-time -Wformat=1 -Werror=format-security -Wall -Werror=declaration-after-statement -Wextra -Wc++-compat -Wwrite-strings -std=c90 -version -fdebug-prefix-map=/home/dave/debian/perl/perl-5.26.0=. -fwrapv -fno-strict-aliasing -o opmini.s The perl 5.26 build is successful at -O0.