https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61925

--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
On trunk I get

vector.c:6:1: error: unrecognizable insn:
(insn 3 2 4 2 (set (reg/v:TI 101 [ a ])
        (mem/c:TI (plus:SI (reg/f:SI 81 virtual-incoming-args)
                (const_int 16 [0x10])) [1 a+0 S16 A128])) vector.c:4 -1
     (expr_list:REG_EQUIV (mem/c:TI (plus:SI (reg/f:SI 81
virtual-incoming-args)
                (const_int 16 [0x10])) [1 a+0 S16 A128])
        (nil)))

instead.

Reduced testcase for the convert_move ICE on the branches, ICEs at -m32
-march=i386:

#pragma GCC push_options                                                        
#pragma GCC target("sse")                                                       
typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));     
typedef long long __m128i __attribute__ ((__vector_size__ (16),
__may_alias__));
__m128i _mm_castps_si128(__m128 __A) { }                                        
#pragma GCC pop_options                                                         
__attribute__((vector_size(16))) int                                           
f(__attribute__((vector_size(16))) int a,                                 
__attribute__((vector_size(16))) int b)                                       
{                                                                               
  return a + b;                                                                 
}            

this seems to be fixed on trunk.

Reduced testcase for the ICE on trunk, ICEs at -m32 -march=i386:

#pragma GCC push_options                                                        
#pragma GCC target("sse")                                                       
typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));     
extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__,
__artificial__)) _mm_undefined_ps (void) {                                      
  }                                                                             
#pragma GCC target("sse2")
#pragma GCC pop_options                                                         
__attribute__((vector_size(16))) int f(__attribute__((vector_size(16))) int a,
__attribute__((vector_size(16))) int b) {                                       
   return a + b;                                                                
  }           

thus it requires a sse2 target attribute.

Would be interesting to know what fixed the convert_move ICE on trunk.

Reply via email to