[Bug target/36222] x86 fails to optimize out __v4si -> __m128i move

hjl dot tools at gmail dot com gcc-bugzilla@gcc.gnu.org
Tue May 13 13:59:00 GMT 2008



------- Comment #3 from hjl dot tools at gmail dot com  2008-05-13 13:58 -------
This bug may be related to PR 30961. Another example:

bash-3.2$ cat d.c
#include <emmintrin.h>

__m128i
foo2 (long long x1, long long x2)
{
  return _mm_set_epi64x (x1, x2);
}
bash-3.2$ /export/build/gnu/gcc-stack/build-x86_64-linux/gcc/xgcc -B./
-B/export/build/gnu/gcc-stack/build-x86_64-linux/gcc/ -Wall -I.. -O2
-march=core2 -msse4 -fno-asynchronous-unwind-tables -DDEBUG -S d.c 
bash-3.2$ cat d.s
        .file   "d.c"
        .text
        .p2align 4,,15
.globl foo2
        .type   foo2, @function
foo2:
        movd    %rsi, %xmm1
        pinsrq  $0x1, %rdi, %xmm1
        movdqa  %xmm1, %xmm0
        ret
        .size   foo2, .-foo2

d.c.176r.lreg has

;; Pred edge  ENTRY [100.0%]  (fallthru)
(note:HI 5 1 2 2 [bb 2] NOTE_INSN_BASIC_BLOCK)

(insn:HI 2 5 3 2 d.c:5 (set (reg/v:DI 59 [ x1 ])
        (reg:DI 5 di [ x1 ])) 89 {*movdi_1_rex64} (expr_list:REG_DEAD (reg:DI 5 
di [ x1 ])
        (nil)))

(insn:HI 3 2 4 2 d.c:5 (set (reg/v:DI 60 [ x2 ])
        (reg:DI 4 si [ x2 ])) 89 {*movdi_1_rex64} (expr_list:REG_DEAD (reg:DI 4 
si [ x2 ])
        (nil)))

(note:HI 4 3 7 2 NOTE_INSN_FUNCTION_BEG)

(note:HI 7 4 12 2 NOTE_INSN_DELETED)

(insn:HI 12 7 18 2 d.c:7 (set (reg/i:V2DI 21 xmm0 [ <result> ])
        (vec_concat:V2DI (reg/v:DI 60 [ x2 ])
            (reg/v:DI 59 [ x1 ]))) 1340 {*vec_concatv2di_rex64_sse4_1}
(expr_lis
t:REG_DEAD (reg/v:DI 60 [ x2 ])
        (expr_list:REG_DEAD (reg/v:DI 59 [ x1 ])
            (nil))))

(insn:HI 18 12 0 2 d.c:7 (use (reg/i:V2DI 21 xmm0 [ <result> ])) -1 (nil))
;; End of basic block 2 -> ( 1)
;; lr  out       6 [bp] 7 [sp] 16 [argp] 20 [frame] 21 [xmm0]
;; live  out     6 [bp] 7 [sp] 16 [argp] 20 [frame] 21 [xmm0]

But d.c.177r.greg has
;; Pred edge  ENTRY [100.0%]  (fallthru)
(note:HI 5 1 4 2 [bb 2] NOTE_INSN_BASIC_BLOCK)

(note:HI 4 5 7 2 NOTE_INSN_FUNCTION_BEG)

(note:HI 7 4 24 2 NOTE_INSN_DELETED)

(insn 24 7 12 2 d.c:7 (set (reg:DI 22 xmm1)
        (reg/v:DI 4 si [orig:60 x2 ] [60])) 89 {*movdi_1_rex64} (nil))

(insn:HI 12 24 25 2 d.c:7 (set (reg:V2DI 22 xmm1)
        (vec_concat:V2DI (reg:DI 22 xmm1)
            (reg/v:DI 5 di [orig:59 x1 ] [59]))) 1340
{*vec_concatv2di_rex64_sse
4_1} (nil))

(insn 25 12 18 2 d.c:7 (set (reg/i:V2DI 21 xmm0 [ <result> ])
        (reg:V2DI 22 xmm1)) 1019 {*movv2di_internal} (nil))

(insn 18 25 23 2 d.c:7 (use (reg/i:V2DI 21 xmm0 [ <result> ])) -1 (nil))
;; End of basic block 2 -> ( 1)
;; lr  out       7 [sp] 21 [xmm0]
;; live  out     7 [sp] 21 [xmm0]

Ulrich, do you have any idea why reload won't use xmm0? Thanks.


-- 

hjl dot tools at gmail dot com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |uweigand at de dot ibm dot
                   |                            |com
  BugsThisDependsOn|                            |30961


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36222



More information about the Gcc-bugs mailing list