2014-12-06 48 views
4

使用GCC 4.7.2,爲什麼這導致了嚴格的別名衝突:僅對第一個元素使用嚴格別名?

#include <stdint.h> 
#include "emmintrin.h" 

int f(){ 
    int ret = 0; 

    __m128i vec_zero __attribute__ ((aligned (16))) = _mm_set1_epi32(0); 
    __m128i vec_one __attribute__ ((aligned (16))) = _mm_set1_epi32(1); 
    __m128i vec_result __attribute__ ((aligned (16))); 
    vec_result = _mm_cmpgt_epi32(vec_zero, vec_one); 
    ret += (((uint32_t*)&vec_result)[0] != 0); 
    ret += (((uint32_t*)&vec_result)[1] != 0); 
    return ret; 
} 

雖然這是確定的:

#include <stdint.h> 
#include "emmintrin.h" 

int f(){ 
    int ret = 0; 

    __m128i vec_zero __attribute__ ((aligned (16))) = _mm_set1_epi32(0); 
    __m128i vec_one __attribute__ ((aligned (16))) = _mm_set1_epi32(1); 
    __m128i vec_result __attribute__ ((aligned (16))); 
    vec_result = _mm_cmpgt_epi32(vec_zero, vec_one); 
// ret += (((uint32_t*)&vec_result)[0] != 0); 
    ret += (((uint32_t*)&vec_result)[1] != 0); 
    return ret; 
} 

這是根本的不是準確的gcc的問題還是我失蹤一些關於如何嚴格的別名工程。

另外,是否有一個簡單的方法來解決這個問題,使用__attribute__((__may_alias__))還是我也一樣鑄造成臨時char *?

+0

'__attribute__((aligned(16)))'似乎毫無用處。 – 2014-12-06 08:50:10

+0

@MarcGlisse你爲什麼這麼說?我認爲'_mm_cmpgt_epi32'的參數必須對齊。 – user1794469 2014-12-30 15:05:50

+1

'__m128i'已經意味着合適的對齊(否則使用起來會非常痛苦)。 – 2014-12-30 15:12:28

回答

2

我認爲這只是海灣合作委員會未能解決問題。這當然是UB(混疊違規)。與__attribute__((__may_alias__))解決很容易,但:

typedef uint32_t __attribute__((__may_alias__)) u32ma; 

然後在指針強制使用u32ma,而不是uint32_t

相關問題