Patch - SPU bss alignment


On SPU, variables in the .bss section that are allocated with the .lcomm directive are not aligned on 16 byte boundaries. This causes misaligned loads, as the generated assembly assumes this "default" alignment.

A patch to disable .lcomm in favour of '.local .comm' is attached.


As an example, the following function returns '3', when '5' is expected:

; cause the_vector to not be aligned on natural (16 byte) bounds
@misaligner = internal global i32 zeroinitializer
@the_vector = internal global <6 x i32> zeroinitializer

define i32 @align_test() {
   store <6 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>, <6 x i32>* @the_vector
   %loadedval = load i32* getelementptr inbounds (<6 x i32>* @the_vector, i64 0, i64 4 );
   ret i32 %loadedval

spu-nolcomm.patch (845 Bytes)

Applied in r100875, thanks!