[Bug target/38825] missed optimization: register renaming in unrolled loop
rguenth at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Tue Jan 13 16:37:00 GMT 2009
------- Comment #6 from rguenth at gcc dot gnu dot org 2009-01-13 16:37 -------
Yes, the alias sets are not properly transfered to RTL:
;; MEM[base: out, index: ivtmp.58] = result;
(insn 22 21 0 /usr/lib64/gcc/x86_64-suse-linux/4.4/include/xmmintrin.h:951 (set
(mem:V4SF (plus:DI (reg/v/f:DI 66 [ out ])
(reg:DI 63 [ ivtmp.58 ])) [2 S16 A128])
(reg/v:V4SF 64 [ result ])) -1 (nil))
;; result.70 = __builtin_ia32_addps (MEM[base: in, index: ivtmp.58, offset:
16], scalar);
(insn 23 22 24 /usr/lib64/gcc/x86_64-suse-linux/4.4/include/xmmintrin.h:161
(set (reg:V4SF 75)
(plus:V4SF (reg/v:V4SF 65 [ scalar ])
(mem:V4SF (plus:DI (plus:DI (reg/v/f:DI 67 [ in ])
(reg:DI 63 [ ivtmp.58 ]))
(const_int 16 [0x10])) [2 S16 A128]))) -1 (nil))
as you can see both use alias set 2. But it should be noted that with
TARGET_MEM_REF (the MEM[...] expr) type-based aliasing is hosed (which is
unfortunately what restrict relies on).
Thus, with -fno-ivopts we can see different alias sets:
;; *(__v4sf *) out = result;
(insn 14 13 0 /usr/lib64/gcc/x86_64-suse-linux/4.4/include/xmmintrin.h:951 (set
(mem:V4SF (reg/v/f:DI 62 [ out ]) [6 S16 A128])
(reg/v:V4SF 60 [ result ])) -1 (nil))
;; result.58 = __builtin_ia32_addps (*(__v4sf *) (in + 16), scalar);
(insn 15 14 16 /usr/lib64/gcc/x86_64-suse-linux/4.4/include/xmmintrin.h:161
(set (reg:V4SF 67)
(plus:V4SF (reg/v:V4SF 61 [ scalar ])
(mem:V4SF (plus:DI (reg/v/f:DI 63 [ in ])
(const_int 16 [0x10])) [5 S16 A128]))) -1 (nil))
and re-ordering of mems!
.L2:
movaps %xmm0, %xmm2
movaps %xmm0, %xmm1
addps (%rsi), %xmm2
addps 16(%rsi), %xmm1
addq $32, %rsi
movaps %xmm2, (%rdi)
movaps %xmm1, 16(%rdi)
addq $32, %rdi
subl $1, %edx
jne .L2
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38825
More information about the Gcc-bugs
mailing list