| /* { dg-do run } */ |
| /* { dg-options "-O2" } */ |
| |
| /* Test that gcn_expand_scalar_to_vector_address does not clobber VCC. |
| If it does then spills and reloads will be unsafe, leading to unexpected |
| conditional branch behaviour. */ |
| |
| extern void abort (); |
| |
| __attribute__((vector_size(256))) int vec[2] = {{0}, {0}}; |
| |
| int |
| main() |
| { |
| long vcc = 0; |
| |
| /* Load a known value into VCC. The memory barrier ensures that the vector |
| load must happen after this point. */ |
| asm volatile ("s_mov_b32 vcc_lo, 0x12345689\n\t" |
| "s_mov_b32 vcc_hi, 0xabcdef0" |
| ::: "memory"); |
| |
| /* Compiler inserts vector load here. */ |
| |
| /* Consume the abitrary vector, and return the current value of VCC. */ |
| asm volatile ("; no-op" : "=cV"(vcc) : "v"(vec[0]), "v"(vec[1])); |
| |
| /* The value should match the initialized value. */ |
| if (vcc != 0xabcdef012345689) |
| abort (); |
| |
| return 0; |
| } |