This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Status of SEE and Autovectorization patches?
- From: "H. J. Lu" <hjl at lucon dot org>
- To: Mircea Namolaru <NAMOLARU at il dot ibm dot com>
- Cc: Roger Sayle <roger at eyesopen dot com>, gcc mailing list <gcc at gcc dot gnu dot org>, leehod at gmail dot com, Leehod Baruch <leehod dot baruch at weizmann dot ac dot il>, Mark Mitchell <mark at codesourcery dot com>, Richard Henderson <rth at redhat dot com>, Ayal Zaks <ZAKS at il dot ibm dot com>
- Date: Thu, 4 May 2006 07:48:42 -0700
- Subject: Re: Status of SEE and Autovectorization patches?
- References: <OFAA4248DD.C73F1798-ONC2257163.006C45B3-C2257163.006E7511@LocalDomain> <OF17ADCC43.09B7A466-ONC2257164.00487D78-42257164.00501904@il.ibm.com>
On Thu, May 04, 2006 at 03:25:22PM +0200, Mircea Namolaru wrote:
> The patches for SEE have been committed today.
>
> The minor style corrections requested by you in the
> final review approval will be in a follow-up patch
> to be submitted the next week.
>
I didn't see you have addressed the issuses I raised in my previous
emails. When I used
export BOOT_CFLAGS="-g -O2 -fsee" CXXFLAGS="-g -O2 -fsee" FCFLAGS="-g -O2 -fsee" GCJFLAGS="-g -O2 -fsee" SYSROOT_CFLAGS_FOR_TARGET="-g -O2 -fsee"
# ..../configure
# make BOOT_CFLAGS="-g -O2 -fsee" CXXFLAGS="-g -O2 -fsee" FCFLAGS="-g -O2 -fsee" GCJFLAGS="-g -O2 -fsee" SYSROOT_CFLAGS_FOR_TARGET="-g -O2 -fsee"
to configure and build gcc on Linux/x86 and Linux/x86-64. They both
failed to bootstrap. There are at least 2 problems:
1. SEE uses NEXT_INSN/PREV_INSN to find adjacent insns. But with
-g, NEXT_INSN/PREV_INSN may point to a NOTE. So adjacent insns checks
with NEXT_INSN/PREV_INSN aren't sufficient.
2. Not all zero_extend patterns are available for x86/x86-64. For
example:
(insn 137 0 0 (set (reg:SI 60 [ prephitmp.115 ])
(zero_extend:SI (subreg:QI (reg:SI 60 [ prephitmp.115 ]) 0)))
-1 (nil)
(nil))
may not be used on x86/x86-64. i386.md has
(define_expand "zero_extendqisi2"
[(parallel
[(set (match_operand:SI 0 "register_operand" "")
(zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "")))
(clobber (reg:CC FLAGS_REG))])]
""
"")
This is case for all extensions for i386. For x86-64, only
zero_extendsidi2 won't clobber CC.
3. When the original insns were
set (dest_extension_reg1) (sign_extend (source_extension_reg1))
set (dest_extension_reg2) (sign_extend (dest_extension_reg1))
We created
ref: set (dest_extension_reg1) (sign_extend (source_extension_reg1))
def_se: set (dest_extension_reg2) (sign_extend (dest_extension_reg1))
and
use_se: set (dest_extension_reg1) (sign_extend (dest_extension_reg1))
ref: set (dest_extension_reg2) (sign_extend (dest_extension_reg1))
When def merge failed, def_se was deleted. Now use_se had a deleted
ref.
Basically, SEE doesn't handle
(set (reg/v:SI 70 [ j ])
(sign_extend:SI (subreg:HI (reg:SI 72 [ start ]) 0)))
(set (reg:DI 73 [ j ])
(sign_extend:DI (reg/v:SI 70 [ j ])))
correctly.
4. SEE also failed to handle
set (dest_extension_reg1) (zero_extend (source_extension_reg1))
set (reg) (..dest_extension_reg1..)
set (dest_extension_reg2) (sign_extend (source_extension_reg1))
(insn:HI 28 26 30 2 x.c:1201 (set (reg:DI 534 [ mode ])
(zero_extend:DI (reg/v:SI 264 [ mode ]))) 111
{zero_extendsidi2_rex64}
(insn_list:REG_DEP_TRUE 11 (nil))
(nil))
(insn:HI 30 28 269 2 x.c:1201 (set (reg:QI 261 [ D.24257 ])
(mem/s/u:QI (plus:DI (reg:DI 534 [ mode ])
(symbol_ref:DI ("mode_class") [flags 0x40] <var_decl
0x2a98a42630 mode_class>)) [0 mode_class S1 A8])) 55 {*movqi_1}
(insn_list:REG_DEP_TRUE 28 (nil))
(nil))
(insn:HI 269 30 270 2 x.c:1273 (set (reg:DI 546)
(sign_extend:DI (reg/v:SI 264 [ mode ]))) 115
{extendsidi2_rex64} (nil)
(nil))
If I don't use -fsee for bootstrap, I will get some extra "make check"
failures on Linux/x86-64 for -O3, which turns on SEE.
H.J.