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

Uroš Bizjak <ubizjak at gmail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2013-10-26
               Host|x86                         |
     Ever confirmed|0                           |1

--- Comment #1 from Uroš Bizjak <ubizjak at gmail dot com> ---
The patch at [1] now removes useless moves in the exit bb. This change breaks
assumption in the mode-switching pass that all USEs of return values have a
corresponding simple return value copy somewhere up in the insn stream.

The testcase:

--cut here--
typedef long long __m128i __attribute__ ((__vector_size__ (16)));
typedef char __v16qi __attribute__ ((__vector_size__ (16)));


__m128i _mm_cmpistrm (__m128i __X, __m128i __Y, const int __M)
{
  return (__m128i) __builtin_ia32_pcmpistrm128((__v16qi)__X, (__v16qi)__Y, 1);
}
--cut here--

Before the above change, RA generated:

(insn 2 6 3 2 (set (reg/v:V2DI 21 xmm0 [orig:92 __X ] [92])
        (reg:V2DI 21 xmm0 [ __X ])) tt.c:6 1156 {*movv2di_internal}
     (nil))
(note 3 2 5 2 NOTE_INSN_DELETED)
(note 5 3 20 2 NOTE_INSN_FUNCTION_BEG)
(insn 20 5 14 2 (parallel [
            (set (reg:V16QI 21 xmm0 [95])
                (unspec:V16QI [
                        (reg:V16QI 21 xmm0 [orig:92 __X ] [92])
                        (reg:V16QI 22 xmm1 [ __Y ])
                        (const_int 1 [0x1])
                    ] UNSPEC_PCMPISTR))
            (set (reg:CC 17 flags)
                (unspec:CC [
                        (reg:V16QI 21 xmm0 [orig:92 __X ] [92])
                        (reg:V16QI 22 xmm1 [ __Y ])
                        (const_int 1 [0x1])
                    ] UNSPEC_PCMPISTR))
        ]) tt.c:7 1979 {sse4_2_pcmpistrm}
     (nil))
(insn 14 20 17 2 (set (reg/i:V2DI 21 xmm0)
        (reg:V2DI 21 xmm0 [95])) tt.c:8 1156 {*movv2di_internal}
     (nil))
(insn 17 14 21 2 (use (reg/i:V2DI 21 xmm0)) tt.c:8 -1
     (nil))

Please note useless (insn 14), expected by mode switching pass (this insn was
actually removed by later passes). After the change, following insn stream is
generated:

(insn 20 5 17 2 (parallel [
            (set (reg:V16QI 21 xmm0 [95])
                (unspec:V16QI [
                        (reg:V16QI 21 xmm0 [orig:92 __X ] [92])
                        (reg:V16QI 22 xmm1 [ __Y ])
                        (const_int 1 [0x1])
                    ] UNSPEC_PCMPISTR))
            (set (reg:CC 17 flags)
                (unspec:CC [
                        (reg:V16QI 21 xmm0 [orig:92 __X ] [92])
                        (reg:V16QI 22 xmm1 [ __Y ])
                        (const_int 1 [0x1])
                    ] UNSPEC_PCMPISTR))
        ]) tt.c:7 1979 {sse4_2_pcmpistrm}
     (nil))
(insn 17 20 21 2 (use (reg/i:V2DI 21 xmm0)) tt.c:8 -1
     (nil))

There is no return value copy insn.

The assumption in the mode switching pass, that there is a return value copy is
not correct anymore, due to recent enhancements in the RA. The mode switching
pass should perform life analysis by itself. Simply looking for a return copy
is not correct anymore.

Confirmed by above testcase.

Reply via email to