[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