Am 2022-09-25 um 18:28 schrieb Jeff Law:
This is a minor improvement for the core_list_find routine in coremark.
Basically for riscv, and likely other targets, we can end up with an
unconditional jump to a return statement. This is a result of
compensation code created by bb-reorder, and no jump optimization pass
runs after bb-reorder to clean this stuff up.
This patch utilizes preexisting code to identify suitable branch targets
as well as preexisting code to emit a suitable return, so it's pretty
simple. Note that when we arrange to do this optimization, the original
return block may become unreachable. So we conditionally call
delete_unreachable_blocks to fix that up.
This triggers ~160 times during an x86_64 bootstrap. Naturally it
bootstraps and regression tests on x86_64.
I've also bootstrapped this on riscv64, regression testing with qemu
shows some regressions, but AFAICT they're actually qemu bugs with
signal handling/delivery -- qemu user mode emulation is not consistently
calling user defined signal handlers. Given the same binary, sometimes
they'll get called and the test passes, other times the handler isn't
called and the test (of course) fails. I'll probably spend some time to
try and chase this down for the sake of making testing easier.
OK for the trunk?
Hello Jeff,
I've bisected this change to break a "profiledbootstrap" on x86_64 like
that:
make[3]: Entering directory
'/home/fsirl/rpmbuild/BUILD/gcc-13.0.0+gitr13+2871/obj-x86_64-suse-linux/gcc'
/home/fsirl/rpmbuild/BUILD/gcc-13.0.0+gitr13+2871/obj-x86_64-suse-linux/./prev-gcc/xg++
-B/home/fsirl/rpmbuild/BUILD/gcc-13.0.0+gitr13+2871/obj-x86_64-suse-linux/./prev-gcc/
-B/usr/x86_64-suse-linux/
bin/ -nostdinc++
-B/home/fsirl/rpmbuild/BUILD/gcc-13.0.0+gitr13+2871/obj-x86_64-suse-linux/prev-x86_64-suse-linux/libstdc++-v3/src/.libs
-B/home/fsirl/rpmbuild/BUILD/gcc-13.0.0+gitr13+2871/obj-x86_64
-suse-linux/prev-x86_64-suse-linux/libstdc++-v3/libsupc++/.libs
-I/home/fsirl/rpmbuild/BUILD/gcc-13.0.0+gitr13+2871/obj-x86_64-suse-linux/prev-x86_64-suse-linux/libstdc++-v3/include/x86_64-suse-linu
x
-I/home/fsirl/rpmbuild/BUILD/gcc-13.0.0+gitr13+2871/obj-x86_64-suse-linux/prev-x86_64-suse-linux/libstdc++-v3/include
-I/home/fsirl/rpmbuild/BUILD/gcc-13.0.0+gitr13+2871/libstdc++-v3/libsupc++
-L
/home/fsirl/rpmbuild/BUILD/gcc-13.0.0+gitr13+2871/obj-x86_64-suse-linux/prev-x86_64-suse-linux/libstdc++-v3/src/.libs
-L/home/fsirl/rpmbuild/BUILD/gcc-13.0.0+gitr13+2871/obj-x86_64-suse-linux/prev-x8
6_64-suse-linux/libstdc++-v3/libsupc++/.libs -fno-PIE -c -O2 -g
-fmessage-length=0 -D_FORTIFY_SOURCE=2 -funwind-tables
-fasynchronous-unwind-tables -U_FORTIFY_SOURCE -fprofile-use
-fprofile-reprod
ucible=parallel-runs -DIN_GCC -fno-exceptions -fno-rtti
-fasynchronous-unwind-tables -W -Wall -Wno-narrowing -Wwrite-strings
-Wcast-qual -Wmissing-format-attribute -Woverloaded-virtual -pedantic
-Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -fno-common
-DHAVE_CONFIG_H -I. -I. -I../../gcc -I../../gcc/. -I../../gcc/../include
-I../../gcc/../libcpp/include -I../../gcc/../libcody
-I../../gcc/../libdecnumber -I../../gcc/../libdecnumber/bid
-I../libdecnumber -I../../gcc/../libbacktrace -o cgraph.o -MT cgraph.o
-MMD -MP -MF ./.deps/cgraph.TPo ../../gcc/cgraph.cc
../../gcc/cgraph.cc: In member function 'cgraph_edge*
cgraph_edge::first_speculative_call_target()':
../../gcc/cgraph.cc:1166:1: error: EDGE_CROSSING incorrectly set across
same section
1166 | }
| ^
../../gcc/cgraph.cc:1166:1: error: No region crossing jump at section
boundary in bb 19
during RTL pass: bbro
../../gcc/cgraph.cc:1166:1: internal compiler error: verify_flow_info failed
0xa7116e verify_flow_info()
../../gcc/cfghooks.cc:284
0x1c64958 execute
../../gcc/bb-reorder.cc:2663
In such a case, what do you need to reproduce it? I'm a mere user of the
Suse RPM builds here, no idea if profiling needs any extra data to
reproduce to bug.
Franz.