https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95348

            Bug ID: 95348
           Summary: GCC records zero functions and modules in the
                    profiling data file, ICC does NOT
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: gcov-profile
          Assignee: unassigned at gcc dot gnu.org
          Reporter: qinzhao at gcc dot gnu.org
                CC: marxin at gcc dot gnu.org
  Target Milestone: ---

when using GCC and ICC to build a big parallel application with profiling
feedback, the size of the profiling feedback data of GCC is over 20x times
larger than that of ICC. 
As we studied, one of the major reason for this size difference is:
GCC records all functions and modules that execute 0 times, but ICC does NOT. 
since I cannot expose the details of the real application that has the
profiling data size issue. I come up with a small testing case to show this
problem.

******testing case: 
[]$ cat lib.h 
void five (int); 
void ten (int); 
[]$ cat lib.c 
#include <stdio.h> 

void five(int n) { 
        if (n > 5) { 
           printf("%d is greater than five\n", n);     
        } else { 
           printf("%d is not greater than five\n", n);     
        } 
} 

void ten(int n) { 
        if (n > 10) { 
           printf("%d is greater than ten\n", n);     
        } else { 
           printf("%d is not greater than ten\n", n);     
        } 
} 
[]$ cat ten.c 
#include <stdlib.h> 
#include "lib.h" 

int main(int argc, char *argv[]) { 
        if (argc != 2) { 
                return 2; 
        } 

        int n = atoi(argv[1]); 
        ten(n); 
        return 0; 
} 
[]$ cat five.c 
#include "lib.h" 

void foo(int n) { 
 if (n > 0) 
   five(n); 
 return; 
} 

******ICC :
[]$ cat build_it_icc 
#!/bin/bash 
ICC=/ICC-install-dir/bin/icc 
opt="-O0 " 
opt_gen="-prof_gen" 
opt_gen="$opt_gen -prof_dir ./icc_prof_dir" 
tf1="five.c" 
tf2="ten.c" 
libf="lib.c" 

rm *.o ten 
rm -rf icc_prof_dir 
mkdir icc_prof_dir 

echo $ICC $opt $opt_gen -c $tf1 -o five.o 
$ICC $opt $opt_gen -c $tf1 -o five.o 

echo $ICC $opt $opt_gen -c $libf -o lib.o 
$ICC $opt $opt_gen -c $libf -o lib.o 

echo $ICC $opt $opt_gen -c $tf2 -o ten.o 
$ICC $opt $opt_gen -c $tf2 -o ten.o 

echo $ICC $opt $opt_gen ten.o five.o lib.o -o ten 
$ICC $opt $opt_gen ten.o five.o lib.o -o ten 

./ten 12 
echo "Done" 

[]$ sh build_it_icc
then we got the profiling data under 
./icc_prof_dir/5ec6e83f_78751.dyn 
using 
 /ICC-install-dir/bin/profmerge -dump 5ec6e83f_78751.dyn > data 

we can see, only two functions, "main" in ten.c, and "ten" in lib.c have 
records in this profiling data file. 

******GCC: with latest upstream gcc11: 
[]$ cat build_it_gcc
#!/bin/bash 
GCC=/GCC-install-dir/bin/gcc 
opt="-O0 " 
opt="$opt -fno-inline" 
opt_gen="-fprofile-generate" 
opt_gen="$opt_gen -fprofile-dir=gcc_prof_dir/%p" 
tf1="five.c" 
tf2="ten.c" 
libf="lib.c" 

rm -rf gcc_prof_dir 

echo $GCC $opt $opt_gen -c $libf 
$GCC $opt $opt_gen -c $libf -o lib.o 

echo $GCC $opt $opt_gen $tf1 
$GCC $opt $opt_gen -c $tf1 -o five.o 

echo $GCC $opt $opt_gen $tf2 
$GCC $opt $opt_gen -c $tf2 -o ten.o 
echo $GCC $opt $opt_gen ten.o five.o lib.o -o ten 
$GCC $opt $opt_gen ten.o five.o lib.o -o ten 

./ten 12 
echo "Done" 

[]$ build_it_gcc
then the profiling data are under 
./gcc_prof_dir/16856

under ~/Bugs/profile/small_gcc/gcc_prof_dir/16856 
[]$ ls -l 
total 12 
-rw-r--r-- 1 qinzhao qinzhao 100 May 26 19:18 
#home#qinzhao#Bugs#profile#small_gcc#five.gcda 
-rw-r--r-- 1 qinzhao qinzhao 184 May 26 19:18 
#home#qinzhao#Bugs#profile#small_gcc#lib.gcda 
-rw-r--r-- 1 qinzhao qinzhao 100 May 26 19:18 
#home#qinzhao#Bugs#profile#small_gcc#ten.gcda 

[]$ /home/qinzhao/Install/latest/bin/gcov-dump *.gcda 
#home#qinzhao#Bugs#profile#small_gcc#five.gcda:data:magic `gcda':version 
`B10e' 
#home#qinzhao#Bugs#profile#small_gcc#five.gcda:stamp 1375590637 
#home#qinzhao#Bugs#profile#small_gcc#five.gcda:  a1000000:   2:OBJECT_SUMMARY 
runs=1, sum_max=1 
#home#qinzhao#Bugs#profile#small_gcc#five.gcda:  01000000:   3:FUNCTION 
ident=1636255671, lineno_checksum=0x13fda123, cfg_checksum=0xc7b3f828 
#home#qinzhao#Bugs#profile#small_gcc#five.gcda:    01a10000:   6:COUNTERS 
arcs 3 counts 
#home#qinzhao#Bugs#profile#small_gcc#five.gcda:    01af0000:   2:COUNTERS 
time_profiler 1 counts 
#home#qinzhao#Bugs#profile#small_gcc#lib.gcda:data:magic `gcda':version 
`B10e' 
#home#qinzhao#Bugs#profile#small_gcc#lib.gcda:stamp 1375590591 
#home#qinzhao#Bugs#profile#small_gcc#lib.gcda:  a1000000:   2:OBJECT_SUMMARY 
runs=1, sum_max=1 
#home#qinzhao#Bugs#profile#small_gcc#lib.gcda:  01000000:   3:FUNCTION 
ident=1977925159, lineno_checksum=0x5bf41dc5, cfg_checksum=0xf9e50e8f 
#home#qinzhao#Bugs#profile#small_gcc#lib.gcda:    01a10000:   8:COUNTERS arcs 
4 counts 
#home#qinzhao#Bugs#profile#small_gcc#lib.gcda:    01af0000:   2:COUNTERS 
time_profiler 1 counts 
#home#qinzhao#Bugs#profile#small_gcc#lib.gcda:  01000000:   3:FUNCTION 
ident=193180204, lineno_checksum=0x020d7b16, cfg_checksum=0xf9e50e8f 
#home#qinzhao#Bugs#profile#small_gcc#lib.gcda:    01a10000:   8:COUNTERS arcs 
4 counts 
#home#qinzhao#Bugs#profile#small_gcc#lib.gcda:    01af0000:   2:COUNTERS 
time_profiler 1 counts 
#home#qinzhao#Bugs#profile#small_gcc#ten.gcda:data:magic `gcda':version 
`B10e' 
#home#qinzhao#Bugs#profile#small_gcc#ten.gcda:stamp 1375590675 
#home#qinzhao#Bugs#profile#small_gcc#ten.gcda:  a1000000:   2:OBJECT_SUMMARY 
runs=1, sum_max=1 
#home#qinzhao#Bugs#profile#small_gcc#ten.gcda:  01000000:   3:FUNCTION 
ident=108032747, lineno_checksum=0x2fbc5f5a, cfg_checksum=0x5018cc66 
#home#qinzhao#Bugs#profile#small_gcc#ten.gcda:    01a10000:   6:COUNTERS arcs 
3 counts 
#home#qinzhao#Bugs#profile#small_gcc#ten.gcda:    01af0000:   2:COUNTERS 
time_profiler 1 counts 

from the above, there are records for all functions and modules that are 
instrumented, for example, the routine "five" in lib.c, and the whole module 
"five.c".  all the records for these are zero.

Is it possible for GCC to only record functions and modules that have non-zero
counts?

Reply via email to