[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