This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Jump threading in tree dom pass prevents if-conversion & following vectorization
- From: "Bingfeng Mei" <bmei at broadcom dot com>
- To: "gcc at gcc dot gnu dot org" <gcc at gcc dot gnu dot org>
- Date: Thu, 21 Nov 2013 15:11:14 +0000
- Subject: Jump threading in tree dom pass prevents if-conversion & following vectorization
- Authentication-results: sourceware.org; auth=none
Hi,
I am doing some investigation on loops can be vectorized
by LLVM, but not GCC. One example is loop that contains
more than one if-else constructs.
typedef signed char int8;
#define FFT 128
typedef struct {
int8 exp[FFT];
} feq_t;
void test(feq_t *feq)
{
int k;
int feqMinimum = 15;
int8 *exp = feq->exp;
for (k=0;k<FFT;k++) {
exp[k] -= feqMinimum;
if(exp[k]<-15) exp[k] = -15;
if(exp[k]>15) exp[k] = 15;
}
}
Compile it with 4.8.2 on x86_64
~/install-4.8/bin/gcc ghs-algorithms_380.c -O2 -fdump-tree-ifcvt-details -ftree-vectorize -save-temps
It is not vectorized because if-else constructs are not properly
if-converted. Looking into .ifcvt file, I found the loop is not
if-converted because of bad if-else structure. One branch jumps directly
into another branch. Digging a bit deeper, I found such structure
is generated by dom1 pass doing jump threading optimization.
So recompile with
~/install-4.8/bin/gcc ghs-algorithms_380.c -O2 -fdump-tree-ifcvt-details -ftree-vectorize -save-temps -fno-tree-dominator-opts
It is magically if-converted and vectorized! Same on our target,
performance is improved greatly in this example.
It seems to me that doing jump threading for architectures
support if-conversion is not a good idea. Original if-else structures
are damaged so that if-conversion cannot proceed, so are vectorization
and maybe other optimizations. Should we try to identify those "bad"
jump threading and skip them for such architectures?
Bingfeng Mei
Broadcom UK